write _id first
This commit is contained in:
parent
e93b02137c
commit
1a52281b4e
|
@ -41,6 +41,7 @@ static int cmp_char(const void* a, const void* b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_doc(bson_buffer* buffer, VALUE hash);
|
static void write_doc(bson_buffer* buffer, VALUE hash);
|
||||||
|
static int write_element(VALUE key, VALUE value, VALUE extra);
|
||||||
|
|
||||||
static bson_buffer* buffer_new(void) {
|
static bson_buffer* buffer_new(void) {
|
||||||
bson_buffer* buffer;
|
bson_buffer* buffer;
|
||||||
|
@ -104,7 +105,7 @@ static void write_name_and_type(bson_buffer* buffer, VALUE name, char type) {
|
||||||
buffer_write_bytes(buffer, &zero, 1);
|
buffer_write_bytes(buffer, &zero, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int write_element(VALUE key, VALUE value, VALUE extra) {
|
static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow_id) {
|
||||||
bson_buffer* buffer = (bson_buffer*)extra;
|
bson_buffer* buffer = (bson_buffer*)extra;
|
||||||
|
|
||||||
if (TYPE(key) == T_SYMBOL) {
|
if (TYPE(key) == T_SYMBOL) {
|
||||||
|
@ -116,6 +117,10 @@ static int write_element(VALUE key, VALUE value, VALUE extra) {
|
||||||
rb_raise(rb_eTypeError, "keys must be strings or symbols");
|
rb_raise(rb_eTypeError, "keys must be strings or symbols");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!allow_id && strcmp("_id", RSTRING(key)->ptr) == 0) {
|
||||||
|
return ST_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
switch(TYPE(value)) {
|
switch(TYPE(value)) {
|
||||||
case T_FIXNUM:
|
case T_FIXNUM:
|
||||||
write_name_and_type(buffer, key, 0x10);
|
write_name_and_type(buffer, key, 0x10);
|
||||||
|
@ -285,10 +290,26 @@ static int write_element(VALUE key, VALUE value, VALUE extra) {
|
||||||
return ST_CONTINUE;
|
return ST_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int write_element(VALUE key, VALUE value, VALUE extra) {
|
||||||
|
return write_element_allow_id(key, value, extra, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void write_doc(bson_buffer* buffer, VALUE hash) {
|
static void write_doc(bson_buffer* buffer, VALUE hash) {
|
||||||
int start_position = buffer->position;
|
int start_position = buffer->position;
|
||||||
int length_location = buffer_save_bytes(buffer, 4);
|
int length_location = buffer_save_bytes(buffer, 4);
|
||||||
|
|
||||||
|
VALUE key = rb_str_new2("_id");
|
||||||
|
VALUE id = rb_hash_aref(hash, key);
|
||||||
|
if (TYPE(id) != T_NIL) {
|
||||||
|
write_element_allow_id(key, id, (VALUE)buffer, 1);
|
||||||
|
}
|
||||||
|
key = ID2SYM(rb_intern("_id"));
|
||||||
|
id = rb_hash_aref(hash, key);
|
||||||
|
if (TYPE(id) != T_NIL) {
|
||||||
|
write_element_allow_id(key, id, (VALUE)buffer, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// we have to check for an OrderedHash and handle that specially
|
// we have to check for an OrderedHash and handle that specially
|
||||||
if (strcmp(rb_class2name(RBASIC(hash)->klass), "OrderedHash") == 0) {
|
if (strcmp(rb_class2name(RBASIC(hash)->klass), "OrderedHash") == 0) {
|
||||||
VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
|
VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
|
||||||
|
|
Loading…
Reference in New Issue