mongodb-mongo_ext 0.4.1 → 0.11
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.
- data/ext/cbson/cbson.c +37 -17
- data/ext/cbson/extconf.rb +3 -2
- data/mongo-extensions.gemspec +2 -1
- metadata +1 -1
data/ext/cbson/cbson.c
CHANGED
@@ -21,8 +21,21 @@
|
|
21
21
|
*/
|
22
22
|
|
23
23
|
#include "ruby.h"
|
24
|
+
|
25
|
+
#if HAVE_RUBY_ST_H
|
26
|
+
#include "ruby/st.h"
|
27
|
+
#endif
|
28
|
+
#if HAVE_ST_H
|
24
29
|
#include "st.h"
|
30
|
+
#endif
|
31
|
+
|
32
|
+
#if HAVE_RUBY_REGEX_H
|
33
|
+
#include "ruby/regex.h"
|
34
|
+
#endif
|
35
|
+
#if HAVE_REGEX_H
|
25
36
|
#include "regex.h"
|
37
|
+
#endif
|
38
|
+
|
26
39
|
#include <assert.h>
|
27
40
|
#include <math.h>
|
28
41
|
|
@@ -181,25 +194,24 @@ static int write_element_allow_id(VALUE key, VALUE value, VALUE extra, int allow
|
|
181
194
|
|
182
195
|
switch(TYPE(value)) {
|
183
196
|
case T_BIGNUM:
|
184
|
-
{
|
185
|
-
VALUE as_f;
|
186
|
-
int int_value;
|
187
|
-
if (rb_funcall(value, rb_intern(">"), 1, INT2NUM(2147483647)) == Qtrue ||
|
188
|
-
rb_funcall(value, rb_intern("<"), 1, INT2NUM(-2147483648)) == Qtrue) {
|
189
|
-
rb_raise(rb_eRangeError, "MongoDB can only handle 4-byte ints"
|
190
|
-
" - try converting to a double before saving");
|
191
|
-
}
|
192
|
-
write_name_and_type(buffer, key, 0x10);
|
193
|
-
as_f = rb_funcall(value, rb_intern("to_f"), 0);
|
194
|
-
int_value = NUM2LL(as_f);
|
195
|
-
buffer_write_bytes(buffer, (char*)&int_value, 4);
|
196
|
-
break;
|
197
|
-
}
|
198
197
|
case T_FIXNUM:
|
199
198
|
{
|
200
|
-
|
201
|
-
|
202
|
-
|
199
|
+
if (rb_funcall(value, rb_intern(">"), 1, LL2NUM(9223372036854775807LL)) == Qtrue ||
|
200
|
+
rb_funcall(value, rb_intern("<"), 1, LL2NUM(-9223372036854775808LL)) == Qtrue) {
|
201
|
+
rb_raise(rb_eRangeError, "MongoDB can only handle 8-byte ints");
|
202
|
+
}
|
203
|
+
if (rb_funcall(value, rb_intern(">"), 1, INT2NUM(2147483647L)) == Qtrue ||
|
204
|
+
rb_funcall(value, rb_intern("<"), 1, INT2NUM(-2147483648L)) == Qtrue) {
|
205
|
+
long long ll_value;
|
206
|
+
write_name_and_type(buffer, key, 0x12);
|
207
|
+
ll_value = NUM2LL(value);
|
208
|
+
buffer_write_bytes(buffer, (char*)&ll_value, 8);
|
209
|
+
} else {
|
210
|
+
int int_value;
|
211
|
+
write_name_and_type(buffer, key, 0x10);
|
212
|
+
int_value = NUM2LL(value);
|
213
|
+
buffer_write_bytes(buffer, (char*)&int_value, 4);
|
214
|
+
}
|
203
215
|
break;
|
204
216
|
}
|
205
217
|
case T_TRUE:
|
@@ -680,6 +692,14 @@ static VALUE get_value(const char* buffer, int* position, int type) {
|
|
680
692
|
*position += 8;
|
681
693
|
break;
|
682
694
|
}
|
695
|
+
case 18:
|
696
|
+
{
|
697
|
+
long long ll;
|
698
|
+
memcpy(&ll, buffer + *position, 8);
|
699
|
+
value = LL2NUM(ll);
|
700
|
+
*position += 8;
|
701
|
+
break;
|
702
|
+
}
|
683
703
|
default:
|
684
704
|
{
|
685
705
|
rb_raise(rb_eTypeError, "no c decoder for this type yet (%d)", type);
|
data/ext/cbson/extconf.rb
CHANGED
data/mongo-extensions.gemspec
CHANGED
@@ -7,7 +7,8 @@ TEST_FILES = []
|
|
7
7
|
|
8
8
|
Gem::Specification.new do |s|
|
9
9
|
s.name = 'mongo_ext'
|
10
|
-
|
10
|
+
|
11
|
+
s.version = '0.11'
|
11
12
|
s.platform = Gem::Platform::RUBY
|
12
13
|
s.summary = 'C extensions for the MongoDB Ruby driver'
|
13
14
|
s.description = 'C extensions to accelerate the MondoDB Ruby driver. For more information about Mongo, see http://www.mongodb.org.'
|