mongodb-mongo_ext 0.3 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/ext/cbson/cbson.c +113 -74
  2. data/mongo-extensions.gemspec +1 -1
  3. metadata +3 -2
data/ext/cbson/cbson.c CHANGED
@@ -48,6 +48,19 @@ static VALUE OrderedHash;
48
48
  #define EXTENDED RE_OPTION_EXTENDED
49
49
  #endif
50
50
 
51
+ /* TODO we ought to check that the malloc or asprintf was successful
52
+ * and raise an exception if not. */
53
+ #ifdef _MSC_VER
54
+ #define INT2STRING(buffer, i) \
55
+ { \
56
+ int vslength = _scprintf("%d", i) + 1; \
57
+ *buffer = malloc(vslength); \
58
+ _snprintf(*buffer, vslength, "%d", i); \
59
+ }
60
+ #else
61
+ #define INT2STRING(buffer, i) asprintf(buffer, "%d", i);
62
+ #endif
63
+
51
64
  // this sucks too.
52
65
  #ifndef RREGEXP_SRC_PTR
53
66
  #define RREGEXP_SRC_PTR(r) RREGEXP(r)->str
@@ -114,8 +127,8 @@ static void buffer_assure_space(bson_buffer* buffer, int size) {
114
127
 
115
128
  /* returns offset for writing */
116
129
  static int buffer_save_bytes(bson_buffer* buffer, int size) {
117
- buffer_assure_space(buffer, size);
118
130
  int position = buffer->position;
131
+ buffer_assure_space(buffer, size);
119
132
  buffer->position += size;
120
133
  return position;
121
134
  }
@@ -155,10 +168,10 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
155
168
  }
156
169
 
157
170
  if (check_keys == Qtrue) {
171
+ int i;
158
172
  if (RSTRING_LEN(key) > 0 && RSTRING_PTR(key)[0] == '$') {
159
173
  rb_raise(rb_eRuntimeError, "key must not start with '$'");
160
174
  }
161
- int i;
162
175
  for (i = 0; i < RSTRING_LEN(key); i++) {
163
176
  if (RSTRING_PTR(key)[i] == '.') {
164
177
  rb_raise(rb_eRuntimeError, "key must not contain '.'");
@@ -169,20 +182,23 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
169
182
  switch(TYPE(value)) {
170
183
  case T_BIGNUM:
171
184
  {
185
+ VALUE as_f;
186
+ int int_value;
172
187
  if (rb_funcall(value, rb_intern(">"), 1, INT2NUM(2147483647)) == Qtrue ||
173
188
  rb_funcall(value, rb_intern("<"), 1, INT2NUM(-2147483648)) == Qtrue) {
174
- rb_raise(rb_eRangeError, "MongoDB can only handle 4-byte ints - try converting to a double before saving");
189
+ rb_raise(rb_eRangeError, "MongoDB can only handle 4-byte ints"
190
+ " - try converting to a double before saving");
175
191
  }
176
192
  write_name_and_type(buffer, key, 0x10);
177
- VALUE as_f = rb_funcall(value, rb_intern("to_f"), 0);
178
- int int_value = NUM2LL(as_f);
193
+ as_f = rb_funcall(value, rb_intern("to_f"), 0);
194
+ int_value = NUM2LL(as_f);
179
195
  buffer_write_bytes(buffer, (char*)&int_value, 4);
180
196
  break;
181
197
  }
182
198
  case T_FIXNUM:
183
199
  {
184
- write_name_and_type(buffer, key, 0x10);
185
200
  int int_value = FIX2INT(value);
201
+ write_name_and_type(buffer, key, 0x10);
186
202
  buffer_write_bytes(buffer, (char*)&int_value, 4);
187
203
  break;
188
204
  }
@@ -200,8 +216,8 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
200
216
  }
201
217
  case T_FLOAT:
202
218
  {
203
- write_name_and_type(buffer, key, 0x01);
204
219
  double d = NUM2DBL(value);
220
+ write_name_and_type(buffer, key, 0x01);
205
221
  buffer_write_bytes(buffer, (char*)&d, 8);
206
222
  break;
207
223
  }
@@ -218,26 +234,29 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
218
234
  }
219
235
  case T_ARRAY:
220
236
  {
237
+ int start_position, length_location, items, i, obj_length;
238
+ VALUE* values;
239
+
221
240
  write_name_and_type(buffer, key, 0x04);
222
- int start_position = buffer->position;
241
+ start_position = buffer->position;
223
242
 
224
243
  // save space for length
225
- int length_location = buffer_save_bytes(buffer, 4);
244
+ length_location = buffer_save_bytes(buffer, 4);
226
245
 
227
- int items = RARRAY_LEN(value);
228
- VALUE* values = RARRAY_PTR(value);
229
- int i;
246
+ items = RARRAY_LEN(value);
247
+ values = RARRAY_PTR(value);
230
248
  for(i = 0; i < items; i++) {
231
249
  char* name;
232
- asprintf(&name, "%d", i);
233
- VALUE key = rb_str_new2(name);
250
+ VALUE key;
251
+ INT2STRING(&name, i);
252
+ key = rb_str_new2(name);
234
253
  write_element(key, values[i], pack_extra(buffer, check_keys));
235
254
  free(name);
236
255
  }
237
256
 
238
257
  // write null byte and fill in length
239
258
  buffer_write_bytes(buffer, &zero, 1);
240
- int obj_length = buffer->position - start_position;
259
+ obj_length = buffer->position - start_position;
241
260
  memcpy(buffer->buffer + length_location, &obj_length, 4);
242
261
  break;
243
262
  }
@@ -245,24 +264,25 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
245
264
  {
246
265
  if (strcmp(rb_class2name(RBASIC(value)->klass),
247
266
  "XGen::Mongo::Driver::Code") == 0) {
267
+ int start_position, length_location, length, total_length;
248
268
  write_name_and_type(buffer, key, 0x0F);
249
269
 
250
- int start_position = buffer->position;
251
- int length_location = buffer_save_bytes(buffer, 4);
270
+ start_position = buffer->position;
271
+ length_location = buffer_save_bytes(buffer, 4);
252
272
 
253
- int length = RSTRING_LEN(value) + 1;
273
+ length = RSTRING_LEN(value) + 1;
254
274
  buffer_write_bytes(buffer, (char*)&length, 4);
255
275
  buffer_write_bytes(buffer, RSTRING_PTR(value), length - 1);
256
276
  buffer_write_bytes(buffer, &zero, 1);
257
277
  write_doc(buffer, rb_funcall(value, rb_intern("scope"), 0), Qfalse);
258
278
 
259
- int total_length = buffer->position - start_position;
279
+ total_length = buffer->position - start_position;
260
280
  memcpy(buffer->buffer + length_location, &total_length, 4);
261
281
 
262
282
  break;
263
283
  } else {
264
- write_name_and_type(buffer, key, 0x02);
265
284
  int length = RSTRING_LEN(value) + 1;
285
+ write_name_and_type(buffer, key, 0x02);
266
286
  buffer_write_bytes(buffer, (char*)&length, 4);
267
287
  buffer_write_bytes(buffer, RSTRING_PTR(value), length - 1);
268
288
  buffer_write_bytes(buffer, &zero, 1);
@@ -271,9 +291,9 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
271
291
  }
272
292
  case T_SYMBOL:
273
293
  {
274
- write_name_and_type(buffer, key, 0x0E);
275
294
  const char* str_value = rb_id2name(SYM2ID(value));
276
295
  int length = strlen(str_value) + 1;
296
+ write_name_and_type(buffer, key, 0x0E);
277
297
  buffer_write_bytes(buffer, (char*)&length, 4);
278
298
  buffer_write_bytes(buffer, str_value, length);
279
299
  break;
@@ -284,11 +304,11 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
284
304
  const char* cls = rb_class2name(RBASIC(value)->klass);
285
305
  if (strcmp(cls, "XGen::Mongo::Driver::Binary") == 0 ||
286
306
  strcmp(cls, "ByteBuffer") == 0) {
287
- write_name_and_type(buffer, key, 0x05);
288
307
  const char subtype = strcmp(cls, "ByteBuffer") ?
289
308
  (const char)FIX2INT(rb_funcall(value, rb_intern("subtype"), 0)) : 2;
290
309
  VALUE string_data = rb_funcall(value, rb_intern("to_s"), 0);
291
310
  int length = RSTRING_LEN(string_data);
311
+ write_name_and_type(buffer, key, 0x05);
292
312
  if (subtype == 2) {
293
313
  const int other_length = length + 4;
294
314
  buffer_write_bytes(buffer, (const char*)&other_length, 4);
@@ -302,9 +322,9 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
302
322
  break;
303
323
  }
304
324
  if (strcmp(cls, "XGen::Mongo::Driver::ObjectID") == 0) {
305
- write_name_and_type(buffer, key, 0x07);
306
325
  VALUE as_array = rb_funcall(value, rb_intern("to_a"), 0);
307
326
  int i;
327
+ write_name_and_type(buffer, key, 0x07);
308
328
  for (i = 0; i < 12; i++) {
309
329
  char byte = (char)FIX2INT(RARRAY_PTR(as_array)[i]);
310
330
  buffer_write_bytes(buffer, &byte, 1);
@@ -312,21 +332,23 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
312
332
  break;
313
333
  }
314
334
  if (strcmp(cls, "XGen::Mongo::Driver::DBRef") == 0) {
335
+ int start_position, length_location, obj_length;
336
+ VALUE ns, oid;
315
337
  write_name_and_type(buffer, key, 0x03);
316
338
 
317
- int start_position = buffer->position;
339
+ start_position = buffer->position;
318
340
 
319
341
  // save space for length
320
- int length_location = buffer_save_bytes(buffer, 4);
342
+ length_location = buffer_save_bytes(buffer, 4);
321
343
 
322
- VALUE ns = rb_funcall(value, rb_intern("namespace"), 0);
344
+ ns = rb_funcall(value, rb_intern("namespace"), 0);
323
345
  write_element(rb_str_new2("$ref"), ns, pack_extra(buffer, Qfalse));
324
- VALUE oid = rb_funcall(value, rb_intern("object_id"), 0);
346
+ oid = rb_funcall(value, rb_intern("object_id"), 0);
325
347
  write_element(rb_str_new2("$id"), oid, pack_extra(buffer, Qfalse));
326
348
 
327
349
  // write null byte and fill in length
328
350
  buffer_write_bytes(buffer, &zero, 1);
329
- int obj_length = buffer->position - start_position;
351
+ obj_length = buffer->position - start_position;
330
352
  memcpy(buffer->buffer + length_location, &obj_length, 4);
331
353
  break;
332
354
  }
@@ -340,23 +362,25 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
340
362
  // TODO again, is this really the only way to do this?
341
363
  const char* cls = rb_class2name(RBASIC(value)->klass);
342
364
  if (strcmp(cls, "Time") == 0) {
343
- write_name_and_type(buffer, key, 0x09);
344
365
  double t = NUM2DBL(rb_funcall(value, rb_intern("to_f"), 0));
345
366
  long long time_since_epoch = (long long)round(t * 1000);
367
+ write_name_and_type(buffer, key, 0x09);
346
368
  buffer_write_bytes(buffer, (const char*)&time_since_epoch, 8);
347
369
  break;
348
370
  }
349
371
  }
350
372
  case T_REGEXP:
351
373
  {
352
- write_name_and_type(buffer, key, 0x0B);
353
-
354
374
  int length = RREGEXP_SRC_LEN(value);
355
375
  char* pattern = (char*)RREGEXP_SRC_PTR(value);
376
+ long flags = RREGEXP(value)->ptr->options;
377
+ VALUE has_extra;
378
+
379
+ write_name_and_type(buffer, key, 0x0B);
380
+
356
381
  buffer_write_bytes(buffer, pattern, length);
357
382
  buffer_write_bytes(buffer, &zero, 1);
358
383
 
359
- long flags = RREGEXP(value)->ptr->options;
360
384
  if (flags & IGNORECASE) {
361
385
  char ignorecase = 'i';
362
386
  buffer_write_bytes(buffer, &ignorecase, 1);
@@ -370,7 +394,7 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
370
394
  buffer_write_bytes(buffer, &extended, 1);
371
395
  }
372
396
 
373
- VALUE has_extra = rb_funcall(value, rb_intern("respond_to?"), 1, rb_str_new2("extra_options_str"));
397
+ has_extra = rb_funcall(value, rb_intern("respond_to?"), 1, rb_str_new2("extra_options_str"));
374
398
  if (TYPE(has_extra) == T_TRUE) {
375
399
  VALUE extra = rb_funcall(value, rb_intern("extra_options_str"), 0);
376
400
  int old_position = buffer->position;
@@ -397,6 +421,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra) {
397
421
  static void write_doc(bson_buffer* buffer, VALUE hash, VALUE check_keys) {
398
422
  int start_position = buffer->position;
399
423
  int length_location = buffer_save_bytes(buffer, 4);
424
+ int length;
400
425
 
401
426
  VALUE key = rb_str_new2("_id");
402
427
  if (rb_funcall(hash, rb_intern("has_key?"), 1, key) == Qtrue) {
@@ -425,17 +450,18 @@ static void write_doc(bson_buffer* buffer, VALUE hash, VALUE check_keys) {
425
450
 
426
451
  // write null byte and fill in length
427
452
  buffer_write_bytes(buffer, &zero, 1);
428
- int length = buffer->position - start_position;
453
+ length = buffer->position - start_position;
429
454
  memcpy(buffer->buffer + length_location, &length, 4);
430
455
  }
431
456
 
432
457
  static VALUE method_serialize(VALUE self, VALUE doc, VALUE check_keys) {
458
+ VALUE result;
433
459
  bson_buffer* buffer = buffer_new();
434
460
  assert(buffer);
435
461
 
436
462
  write_doc(buffer, doc, check_keys);
437
463
 
438
- VALUE result = rb_str_new(buffer->buffer, buffer->position);
464
+ result = rb_str_new(buffer->buffer, buffer->position);
439
465
  buffer_free(buffer);
440
466
  return result;
441
467
  }
@@ -454,8 +480,9 @@ static VALUE get_value(const char* buffer, int* position, int type) {
454
480
  case 2:
455
481
  case 13:
456
482
  {
483
+ int value_length;
457
484
  *position += 4;
458
- int value_length = strlen(buffer + *position);
485
+ value_length = strlen(buffer + *position);
459
486
  value = rb_str_new(buffer+ *position, value_length);
460
487
  *position += value_length + 1;
461
488
  break;
@@ -468,9 +495,11 @@ static VALUE get_value(const char* buffer, int* position, int type) {
468
495
  int offset = *position + 14;
469
496
  VALUE argv[2];
470
497
  int collection_length = strlen(buffer + offset);
498
+ char id_type;
499
+
471
500
  argv[0] = rb_str_new(buffer + offset, collection_length);
472
501
  offset += collection_length + 1;
473
- char id_type = buffer[offset];
502
+ id_type = buffer[offset];
474
503
  offset += 5;
475
504
  argv[1] = get_value(buffer, &offset, (int)id_type);
476
505
  value = rb_class_new_instance(2, argv, DBRef);
@@ -482,17 +511,19 @@ static VALUE get_value(const char* buffer, int* position, int type) {
482
511
  }
483
512
  case 4:
484
513
  {
485
- int size;
514
+ int size, end;
486
515
  memcpy(&size, buffer + *position, 4);
487
- int end = *position + size - 1;
516
+ end = *position + size - 1;
488
517
  *position += 4;
489
518
 
490
519
  value = rb_ary_new();
491
520
  while (*position < end) {
492
521
  int type = (int)buffer[(*position)++];
493
522
  int key_size = strlen(buffer + *position);
523
+ VALUE to_append;
524
+
494
525
  *position += key_size + 1; // just skip the key, they're in order.
495
- VALUE to_append = get_value(buffer, position, type);
526
+ to_append = get_value(buffer, position, type);
496
527
  rb_ary_push(value, to_append);
497
528
  }
498
529
  (*position)++;
@@ -500,17 +531,19 @@ static VALUE get_value(const char* buffer, int* position, int type) {
500
531
  }
501
532
  case 5:
502
533
  {
503
- int length;
534
+ int length, subtype;
535
+ VALUE data, st;
536
+ VALUE argv[2];
504
537
  memcpy(&length, buffer + *position, 4);
505
- int subtype = (unsigned char)buffer[*position + 4];
506
- VALUE data;
538
+ subtype = (unsigned char)buffer[*position + 4];
507
539
  if (subtype == 2) {
508
540
  data = rb_str_new(buffer + *position + 9, length - 4);
509
541
  } else {
510
542
  data = rb_str_new(buffer + *position + 5, length);
511
543
  }
512
- VALUE st = INT2FIX(subtype);
513
- VALUE argv[2] = {data, st};
544
+ st = INT2FIX(subtype);
545
+ argv[0] = data;
546
+ argv[1] = st;
514
547
  value = rb_class_new_instance(2, argv, Binary);
515
548
  *position += length + 5;
516
549
  break;
@@ -536,11 +569,13 @@ static VALUE get_value(const char* buffer, int* position, int type) {
536
569
  case 9:
537
570
  {
538
571
  long long millis;
572
+ VALUE seconds, microseconds;
539
573
  memcpy(&millis, buffer + *position, 8);
540
- VALUE seconds = INT2NUM(millis / 1000);
541
- VALUE microseconds = INT2NUM((millis % 1000) * 1000);
574
+ seconds = INT2NUM(millis / 1000);
575
+ microseconds = INT2NUM((millis % 1000) * 1000);
542
576
 
543
577
  value = rb_funcall(Time, rb_intern("at"), 2, seconds, microseconds);
578
+ value = rb_funcall(value, rb_intern("utc"), 0);
544
579
  *position += 8;
545
580
  break;
546
581
  }
@@ -553,13 +588,12 @@ static VALUE get_value(const char* buffer, int* position, int type) {
553
588
  {
554
589
  int pattern_length = strlen(buffer + *position);
555
590
  VALUE pattern = rb_str_new(buffer + *position, pattern_length);
591
+ int flags_length, flags = 0, i = 0;
592
+ char extra[10];
593
+ VALUE argv[3];
556
594
  *position += pattern_length + 1;
557
595
 
558
- int flags_length = strlen(buffer + *position);
559
- int i = 0;
560
-
561
- int flags = 0;
562
- char extra[10];
596
+ flags_length = strlen(buffer + *position);
563
597
  extra[0] = 0;
564
598
  for (i = 0; i < flags_length; i++) {
565
599
  char flag = buffer[*position + i];
@@ -576,28 +610,29 @@ static VALUE get_value(const char* buffer, int* position, int type) {
576
610
  strncat(extra, &flag, 1);
577
611
  }
578
612
  }
579
- VALUE argv[3] = {
580
- pattern,
581
- INT2FIX(flags),
582
- rb_str_new2(extra)
583
- };
613
+ argv[0] = pattern;
614
+ argv[1] = INT2FIX(flags);
615
+ argv[2] = rb_str_new2(extra);
584
616
  value = rb_class_new_instance(3, argv, RegexpOfHolding);
585
617
  *position += flags_length + 1;
586
618
  break;
587
619
  }
588
620
  case 12:
589
621
  {
622
+ int collection_length;
623
+ VALUE collection, str, oid, id, argv[2];
590
624
  *position += 4;
591
- int collection_length = strlen(buffer + *position);
592
- VALUE collection = rb_str_new(buffer + *position, collection_length);
625
+ collection_length = strlen(buffer + *position);
626
+ collection = rb_str_new(buffer + *position, collection_length);
593
627
  *position += collection_length + 1;
594
628
 
595
- VALUE str = rb_str_new(buffer + *position, 12);
596
- VALUE oid = rb_funcall(str, rb_intern("unpack"), 1, rb_str_new2("C*"));
597
- VALUE id = rb_class_new_instance(1, &oid, ObjectID);
629
+ str = rb_str_new(buffer + *position, 12);
630
+ oid = rb_funcall(str, rb_intern("unpack"), 1, rb_str_new2("C*"));
631
+ id = rb_class_new_instance(1, &oid, ObjectID);
598
632
  *position += 12;
599
633
 
600
- VALUE argv[2] = {collection, id};
634
+ argv[0] = collection;
635
+ argv[1] = id;
601
636
  value = rb_class_new_instance(2, argv, DBRef);
602
637
  break;
603
638
  }
@@ -611,17 +646,19 @@ static VALUE get_value(const char* buffer, int* position, int type) {
611
646
  }
612
647
  case 15:
613
648
  {
649
+ int code_length, scope_size;
650
+ VALUE code, scope, argv[2];
614
651
  *position += 8;
615
- int code_length = strlen(buffer + *position);
616
- VALUE code = rb_str_new(buffer + *position, code_length);
652
+ code_length = strlen(buffer + *position);
653
+ code = rb_str_new(buffer + *position, code_length);
617
654
  *position += code_length + 1;
618
655
 
619
- int scope_size;
620
656
  memcpy(&scope_size, buffer + *position, 4);
621
- VALUE scope = elements_to_hash(buffer + *position + 4, scope_size - 5);
657
+ scope = elements_to_hash(buffer + *position + 4, scope_size - 5);
622
658
  *position += scope_size;
623
659
 
624
- VALUE argv[2] = {code, scope};
660
+ argv[0] = code;
661
+ argv[1] = scope;
625
662
  value = rb_class_new_instance(2, argv, Code);
626
663
  break;
627
664
  }
@@ -659,8 +696,9 @@ static VALUE elements_to_hash(const char* buffer, int max) {
659
696
  int type = (int)buffer[position++];
660
697
  int name_length = strlen(buffer + position);
661
698
  VALUE name = rb_str_new(buffer + position, name_length);
699
+ VALUE value;
662
700
  position += name_length + 1;
663
- VALUE value = get_value(buffer, &position, type);
701
+ value = get_value(buffer, &position, type);
664
702
  rb_funcall(hash, rb_intern("[]="), 2, name, value);
665
703
  }
666
704
  return hash;
@@ -678,12 +716,13 @@ static VALUE method_deserialize(VALUE self, VALUE bson) {
678
716
  }
679
717
 
680
718
  void Init_cbson() {
719
+ VALUE driver, CBson;
681
720
  Time = rb_const_get(rb_cObject, rb_intern("Time"));
682
721
 
683
- VALUE driver = rb_const_get(rb_const_get(rb_const_get(rb_cObject,
684
- rb_intern("XGen")),
685
- rb_intern("Mongo")),
686
- rb_intern("Driver"));
722
+ driver = rb_const_get(rb_const_get(rb_const_get(rb_cObject,
723
+ rb_intern("XGen")),
724
+ rb_intern("Mongo")),
725
+ rb_intern("Driver"));
687
726
  rb_require("mongo/types/binary");
688
727
  Binary = rb_const_get(driver, rb_intern("Binary"));
689
728
  rb_require("mongo/types/undefined");
@@ -699,7 +738,7 @@ void Init_cbson() {
699
738
  rb_require("mongo/util/ordered_hash");
700
739
  OrderedHash = rb_const_get(rb_cObject, rb_intern("OrderedHash"));
701
740
 
702
- VALUE CBson = rb_define_module("CBson");
741
+ CBson = rb_define_module("CBson");
703
742
  rb_define_module_function(CBson, "serialize", method_serialize, 2);
704
743
  rb_define_module_function(CBson, "deserialize", method_deserialize, 1);
705
744
  }
@@ -7,7 +7,7 @@ TEST_FILES = []
7
7
 
8
8
  Gem::Specification.new do |s|
9
9
  s.name = 'mongo_ext'
10
- s.version = '0.3'
10
+ s.version = '0.4.1'
11
11
  s.platform = Gem::Platform::RUBY
12
12
  s.summary = 'C extensions for the MongoDB Ruby driver'
13
13
  s.description = 'C extensions to accelerate the MondoDB Ruby driver. For more information about Mongo, see http://www.mongodb.org.'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb-mongo_ext
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.3"
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Dirolf
@@ -28,6 +28,7 @@ files:
28
28
  - ext/cbson/extconf.rb
29
29
  has_rdoc: false
30
30
  homepage: http://www.mongodb.org
31
+ licenses:
31
32
  post_install_message:
32
33
  rdoc_options: []
33
34
 
@@ -48,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
49
  requirements: []
49
50
 
50
51
  rubyforge_project:
51
- rubygems_version: 1.2.0
52
+ rubygems_version: 1.3.5
52
53
  signing_key:
53
54
  specification_version: 2
54
55
  summary: C extensions for the MongoDB Ruby driver