kbaum-mongo_ext 0.18.3.2 → 0.19
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/cbson/cbson.c +33 -21
- data/ext/cbson/version.h +1 -1
- data/mongo-extensions.gemspec +2 -2
- metadata +2 -2
data/ext/cbson/cbson.c
CHANGED
@@ -141,17 +141,14 @@ static int cmp_char(const void* a, const void* b) {
|
|
141
141
|
}
|
142
142
|
|
143
143
|
static void write_doc(buffer_t buffer, VALUE hash, VALUE check_keys, VALUE move_id);
|
144
|
-
static int
|
144
|
+
static int write_element_with_id(VALUE key, VALUE value, VALUE extra);
|
145
|
+
static int write_element_without_id(VALUE key, VALUE value, VALUE extra);
|
145
146
|
static VALUE elements_to_hash(const char* buffer, int max);
|
146
147
|
|
147
148
|
static VALUE pack_extra(buffer_t buffer, VALUE check_keys) {
|
148
149
|
return rb_ary_new3(2, LL2NUM((long long)buffer), check_keys);
|
149
150
|
}
|
150
151
|
|
151
|
-
static VALUE pack_triple(buffer_t buffer, VALUE check_keys, int allow_id) {
|
152
|
-
return rb_ary_new3(3, LL2NUM((long long)buffer), check_keys, allow_id);
|
153
|
-
}
|
154
|
-
|
155
152
|
static void write_name_and_type(buffer_t buffer, VALUE name, char type) {
|
156
153
|
SAFE_WRITE(buffer, &type, 1);
|
157
154
|
name = TO_UTF8(name);
|
@@ -159,7 +156,7 @@ static void write_name_and_type(buffer_t buffer, VALUE name, char type) {
|
|
159
156
|
SAFE_WRITE(buffer, &zero, 1);
|
160
157
|
}
|
161
158
|
|
162
|
-
static int
|
159
|
+
static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) {
|
163
160
|
buffer_t buffer = (buffer_t)NUM2LL(rb_ary_entry(extra, 0));
|
164
161
|
VALUE check_keys = rb_ary_entry(extra, 1);
|
165
162
|
|
@@ -173,7 +170,7 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
|
|
173
170
|
rb_raise(rb_eTypeError, "keys must be strings or symbols");
|
174
171
|
}
|
175
172
|
|
176
|
-
if (
|
173
|
+
if (allow_id == 0 && strcmp("_id", RSTRING_PTR(key)) == 0) {
|
177
174
|
return ST_CONTINUE;
|
178
175
|
}
|
179
176
|
|
@@ -266,7 +263,7 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
|
|
266
263
|
VALUE key;
|
267
264
|
INT2STRING(&name, i);
|
268
265
|
key = rb_str_new2(name);
|
269
|
-
|
266
|
+
write_element_with_id(key, values[i], pack_extra(buffer, check_keys));
|
270
267
|
free(name);
|
271
268
|
}
|
272
269
|
|
@@ -366,9 +363,9 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
|
|
366
363
|
}
|
367
364
|
|
368
365
|
ns = rb_funcall(value, rb_intern("namespace"), 0);
|
369
|
-
|
366
|
+
write_element_with_id(rb_str_new2("$ref"), ns, pack_extra(buffer, Qfalse));
|
370
367
|
oid = rb_funcall(value, rb_intern("object_id"), 0);
|
371
|
-
|
368
|
+
write_element_with_id(rb_str_new2("$id"), oid, pack_extra(buffer, Qfalse));
|
372
369
|
|
373
370
|
// write null byte and fill in length
|
374
371
|
SAFE_WRITE(buffer, &zero, 1);
|
@@ -464,8 +461,12 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
|
|
464
461
|
return ST_CONTINUE;
|
465
462
|
}
|
466
463
|
|
467
|
-
static int
|
468
|
-
return
|
464
|
+
static int write_element_without_id(VALUE key, VALUE value, VALUE extra) {
|
465
|
+
return write_element(key, value, extra, 0);
|
466
|
+
}
|
467
|
+
|
468
|
+
static int write_element_with_id(VALUE key, VALUE value, VALUE extra) {
|
469
|
+
return write_element(key, value, extra, 1);
|
469
470
|
}
|
470
471
|
|
471
472
|
static void write_doc(buffer_t buffer, VALUE hash, VALUE check_keys, VALUE move_id) {
|
@@ -473,6 +474,7 @@ static void write_doc(buffer_t buffer, VALUE hash, VALUE check_keys, VALUE move_
|
|
473
474
|
buffer_position length_location = buffer_save_space(buffer, 4);
|
474
475
|
buffer_position length;
|
475
476
|
int allow_id;
|
477
|
+
int (*write_function)(VALUE, VALUE, VALUE) = NULL;
|
476
478
|
VALUE id_str = rb_str_new2("_id");
|
477
479
|
VALUE id_sym = ID2SYM(rb_intern("_id"));
|
478
480
|
|
@@ -480,37 +482,47 @@ static void write_doc(buffer_t buffer, VALUE hash, VALUE check_keys, VALUE move_
|
|
480
482
|
rb_raise(rb_eNoMemError, "failed to allocate memory in buffer.c");
|
481
483
|
}
|
482
484
|
|
483
|
-
// write '_id' first if move_id is true
|
485
|
+
// write '_id' first if move_id is true. then don't allow an id to be written.
|
484
486
|
if(move_id == Qtrue) {
|
485
487
|
allow_id = 0;
|
486
488
|
if (rb_funcall(hash, rb_intern("has_key?"), 1, id_str) == Qtrue) {
|
487
489
|
VALUE id = rb_hash_aref(hash, id_str);
|
488
|
-
|
490
|
+
write_element_with_id(id_str, id, pack_extra(buffer, check_keys));
|
489
491
|
} else if (rb_funcall(hash, rb_intern("has_key?"), 1, id_sym) == Qtrue) {
|
490
492
|
VALUE id = rb_hash_aref(hash, id_sym);
|
491
|
-
|
493
|
+
write_element_with_id(id_sym, id, pack_extra(buffer, check_keys));
|
492
494
|
}
|
493
495
|
}
|
494
496
|
else {
|
495
497
|
allow_id = 1;
|
496
|
-
if ((
|
497
|
-
|
498
|
-
|
498
|
+
if (strcmp(rb_class2name(RBASIC(hash)->klass), "HashWithIndifferentAccess") != 0) {
|
499
|
+
if ((rb_funcall(hash, rb_intern("has_key?"), 1, id_str) == Qtrue) &&
|
500
|
+
(rb_funcall(hash, rb_intern("has_key?"), 1, id_sym) == Qtrue)) {
|
501
|
+
VALUE oid_sym = rb_hash_delete(hash, id_sym);
|
502
|
+
rb_funcall(hash, rb_intern("[]="), 2, id_str, oid_sym);
|
503
|
+
}
|
499
504
|
}
|
500
505
|
}
|
501
506
|
|
507
|
+
if(allow_id == 1) {
|
508
|
+
write_function = write_element_with_id;
|
509
|
+
}
|
510
|
+
else {
|
511
|
+
write_function = write_element_without_id;
|
512
|
+
}
|
513
|
+
|
502
514
|
// we have to check for an OrderedHash and handle that specially
|
503
515
|
if (strcmp(rb_class2name(RBASIC(hash)->klass), "OrderedHash") == 0) {
|
504
516
|
VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
|
505
517
|
int i;
|
506
|
-
|
518
|
+
for(i = 0; i < RARRAY_LEN(keys); i++) {
|
507
519
|
VALUE key = RARRAY_PTR(keys)[i];
|
508
520
|
VALUE value = rb_hash_aref(hash, key);
|
509
521
|
|
510
|
-
|
522
|
+
write_function(key, value, pack_extra(buffer, check_keys));
|
511
523
|
}
|
512
524
|
} else {
|
513
|
-
rb_hash_foreach(hash,
|
525
|
+
rb_hash_foreach(hash, write_function, pack_extra(buffer, check_keys));
|
514
526
|
}
|
515
527
|
|
516
528
|
// write null byte and fill in length
|
data/ext/cbson/version.h
CHANGED
data/mongo-extensions.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'lib/mongo'
|
2
|
-
|
3
|
-
VERSION =
|
2
|
+
VERSION_HEADER = File.open(File.join(File.dirname(__FILE__), 'ext', 'cbson', 'version.h'), "r")
|
3
|
+
VERSION = VERSION_HEADER.read.scan(/VERSION\s+"(\d+\.\d+(\.\d+\w*)?)\"/)[0][0]
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = 'kbaum-mongo_ext'
|
6
6
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kbaum-mongo_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.19"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Dirolf
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-03-01 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|