mongodb-mongo_ext 0.4.1 → 0.11
Sign up to get free protection for your applications and to get access to all the features.
- 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.'
|