decode binary, code, symbol
This commit is contained in:
parent
0d2e87d105
commit
5bbbd0b1cd
@ -27,6 +27,8 @@
|
|||||||
|
|
||||||
#define INITIAL_BUFFER_SIZE 256
|
#define INITIAL_BUFFER_SIZE 256
|
||||||
|
|
||||||
|
static VALUE Binary;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* buffer;
|
char* buffer;
|
||||||
int size;
|
int size;
|
||||||
@ -366,6 +368,7 @@ static VALUE get_value(const char* buffer, int* position, int type) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2:
|
case 2:
|
||||||
|
case 13:
|
||||||
{
|
{
|
||||||
*position += 4;
|
*position += 4;
|
||||||
int value_length = strlen(buffer + *position);
|
int value_length = strlen(buffer + *position);
|
||||||
@ -399,6 +402,23 @@ static VALUE get_value(const char* buffer, int* position, int type) {
|
|||||||
(*position)++;
|
(*position)++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
memcpy(&length, buffer + *position, 4);
|
||||||
|
int subtype = (unsigned char)buffer[*position + 4];
|
||||||
|
VALUE data;
|
||||||
|
if (subtype == 2) {
|
||||||
|
data = rb_str_new(buffer + *position + 9, length - 4);
|
||||||
|
} else {
|
||||||
|
data = rb_str_new(buffer + *position + 5, length);
|
||||||
|
}
|
||||||
|
VALUE st = INT2FIX(subtype);
|
||||||
|
VALUE argv[2] = {data, st};
|
||||||
|
value = rb_class_new_instance(2, argv, Binary);
|
||||||
|
*position += length + 5;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 8:
|
case 8:
|
||||||
{
|
{
|
||||||
value = buffer[(*position)++] ? Qtrue : Qfalse;
|
value = buffer[(*position)++] ? Qtrue : Qfalse;
|
||||||
@ -409,6 +429,14 @@ static VALUE get_value(const char* buffer, int* position, int type) {
|
|||||||
value = Qnil;
|
value = Qnil;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 14:
|
||||||
|
{
|
||||||
|
int value_length;
|
||||||
|
memcpy(&value_length, buffer + *position, 4);
|
||||||
|
value = ID2SYM(rb_intern(buffer + *position + 4));
|
||||||
|
*position += value_length + 5;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 16:
|
case 16:
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -450,6 +478,12 @@ static VALUE method_deserialize(VALUE self, VALUE bson) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Init_cbson() {
|
void Init_cbson() {
|
||||||
|
rb_require("mongo/types/binary");
|
||||||
|
VALUE driver = rb_const_get(rb_const_get(rb_const_get(rb_cObject,
|
||||||
|
rb_intern("XGen")),
|
||||||
|
rb_intern("Mongo")),
|
||||||
|
rb_intern("Driver"));
|
||||||
|
Binary = rb_const_get(driver, rb_intern("Binary"));
|
||||||
VALUE CBson = rb_define_module("CBson");
|
VALUE CBson = rb_define_module("CBson");
|
||||||
rb_define_module_function(CBson, "serialize", method_serialize, 1);
|
rb_define_module_function(CBson, "serialize", method_serialize, 1);
|
||||||
rb_define_module_function(CBson, "deserialize", method_deserialize, 1);
|
rb_define_module_function(CBson, "deserialize", method_deserialize, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user