mongodb-mongo_ext 0.3 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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