#50 - advanced tests
authorFedor Yudanov <fedwiz@academ.org>
Mon, 1 Apr 2013 10:51:01 +0000 (17:51 +0700)
committerFedor Yudanov <fedwiz@academ.org>
Mon, 1 Apr 2013 10:51:01 +0000 (17:51 +0700)
rbejdb/src/rbbson.c
rbejdb/src/rbbson.h
rbejdb/src/rbejdb.c

index 38d8c80..c23759c 100644 (file)
@@ -22,6 +22,8 @@ VALUE bson_array_to_ruby(bson_iterator* it);
 
 bson_date_t ruby_time_to_bson_internal(VALUE time);
 
+VALUE bson_date_to_ruby(bson_date_t date);
+
 
 VALUE bsonWrapClass = Qnil;
 
@@ -81,6 +83,7 @@ int iterate_key_values_callback(VALUE key, VALUE val, VALUE bsonWrap) {
             } else {
                 rb_raise(rb_eRuntimeError, "Cannot convert ruby data object to bson");
             }
+            break;
         case T_TRUE:
             bson_append_bool(b, attrName, 1);
             break;
@@ -179,6 +182,9 @@ VALUE bson_iterator_to_ruby(bson_iterator* it, bson_type t) {
         case BSON_INT:
             val = INT2NUM(bson_iterator_int(it));
             break;
+        case BSON_DATE:
+            val = bson_date_to_ruby(bson_iterator_date(it));
+            break;
         case BSON_OBJECT: {
                 bson subbson;
                 bson_iterator_subobject(it, &subbson);
@@ -188,6 +194,9 @@ VALUE bson_iterator_to_ruby(bson_iterator* it, bson_type t) {
         case BSON_ARRAY:
             val = bson_array_to_ruby(it);
             break;
+        case BSON_NULL:
+            val = Qnil;
+            break;
         default:
             rb_raise(rb_eRuntimeError, "Cannot convert object from bson: %d", t);
     }
@@ -208,8 +217,12 @@ VALUE bson_array_to_ruby(bson_iterator* it) {
     return res;
 }
 
+VALUE bson_date_to_ruby(bson_date_t date) {
+    return rb_funcall(rb_path2class("Time"), rb_intern("at"), 1, INT2NUM(date * 1000));
+}
+
 
-VALUE bson_to_ruby(bson* bsonval) {
+VALUE bson_to_ruby(const bson* bsonval) {
     VALUE res = rb_hash_new();
 
     bson_iterator it;
@@ -222,8 +235,14 @@ VALUE bson_to_ruby(bson* bsonval) {
     return res;
 }
 
-VALUE bson_oid_to_ruby(bson_oid_t* oid) {
+VALUE bson_oid_to_ruby(const bson_oid_t* oid) {
     char oidhex[25];
     bson_oid_to_string(oid, oidhex);
     return rb_str_new2(oidhex);
 }
+
+bson_oid_t ruby_to_bson_oid(VALUE rboid) {
+    bson_oid_t oid;
+    bson_oid_from_string(&oid, StringValuePtr(rboid));
+    return oid;
+}
index 3b4bef5..0de6b32 100644 (file)
@@ -21,9 +21,11 @@ extern "C" {
 
     void ruby_to_bson(VALUE rbobj, bson** bsonbuf, int flags);
 
-    VALUE bson_to_ruby(bson* bsonval);
+    VALUE bson_to_ruby(const bson* bsonval);
 
-    VALUE bson_oid_to_ruby(bson_oid_t* oid);
+    VALUE bson_oid_to_ruby(const bson_oid_t* oid);
+
+    bson_oid_t ruby_to_bson_oid(VALUE rboid);
 
 #ifdef __cplusplus
 }
index 35cb3a5..879b05c 100644 (file)
@@ -66,7 +66,7 @@ void EJDB_free(RBEJDB* rejdb) {
 
 
 VALUE EJDB_open(VALUE clazz, VALUE path, VALUE mode) {
-    Check_SafeStr(path);
+    SafeStringValue(path);
     Check_Type(mode, T_FIXNUM);
 
     VALUE ejdbWrap = Data_Wrap_Struct(clazz, NULL, EJDB_free, ruby_xmalloc(sizeof(RBEJDB)));
@@ -97,7 +97,7 @@ void EJDB_close(VALUE self) {
 }
 
 void EJDB_dropCollection(VALUE self, VALUE collName, VALUE prune) {
-    Check_SafeStr(collName);
+    SafeStringValue(collName);
 
     EJDB* ejdb = getEJDB(self);
     if (!ejdbrmcoll(ejdb, StringValuePtr(collName), RTEST(prune))) {
@@ -111,7 +111,7 @@ void EJDB_ensureCollection(int argc, VALUE* argv, VALUE self) {
 
     rb_scan_args(argc, argv, "11", &collName, &copts);
 
-    Check_SafeStr(collName);
+    SafeStringValue(collName);
 
     EJCOLLOPTS jcopts = {NULL};
     if (!NIL_P(copts)) {
@@ -140,18 +140,17 @@ VALUE EJDB_save(int argc, VALUE *argv, VALUE self) {
         rb_raise(rb_eRuntimeError, "Error calling EJDB.save(): need to specify collection name");
     }
 
-    EJDB* ejdb = getEJDB(self);
-
     VALUE collName = argv[0];
     Check_Type(collName, T_STRING);
 
-    VALUE oids = rb_ary_new();
+    EJDB* ejdb = getEJDB(self);
 
     EJCOLL *coll = ejdbcreatecoll(ejdb, StringValuePtr(collName), NULL);
     if (!coll) {
         raise_ejdb_error(ejdb);
     }
 
+    VALUE oids = rb_ary_new();
     int i;
     for (i = 1; i < argc; i++) {
         VALUE rbobj = argv[i];
@@ -190,13 +189,33 @@ VALUE EJDB_save(int argc, VALUE *argv, VALUE self) {
     }
 }
 
+VALUE EJDB_load(VALUE self, VALUE collName, VALUE rboid) {
+    SafeStringValue(collName);
+
+    EJDB* ejdb = getEJDB(self);
+
+    EJCOLL *coll = ejdbgetcoll(ejdb, StringValuePtr(collName));
+    if (!coll) {
+        raise_ejdb_error(ejdb);
+    }
+
+    bson_oid_t oid = ruby_to_bson_oid(rboid);
+
+    bson *bs = ejdbloadbson(coll, &oid);
+    if (!bs) {
+        raise_ejdb_error(ejdb);
+    }
+
+    return bson_to_ruby(bs);
+}
+
 VALUE EJDB_find(int argc, VALUE* argv, VALUE self) {
     VALUE collName;
     VALUE q;
 
     rb_scan_args(argc, argv, "11", &collName, &q);
 
-    Check_SafeStr(collName);
+    SafeStringValue(collName);
     q = !NIL_P(q) ? q :rb_hash_new();
 
     EJDB* ejdb = getEJDB(self);
@@ -270,6 +289,7 @@ Init_rbejdb() {
     rb_define_method(ejdbClass, "is_open?", RUBY_METHOD_FUNC(EJDB_is_open), 0);
     rb_define_method(ejdbClass, "close", RUBY_METHOD_FUNC(EJDB_close), 0);
     rb_define_method(ejdbClass, "save", RUBY_METHOD_FUNC(EJDB_save), -1);
+    rb_define_method(ejdbClass, "load", RUBY_METHOD_FUNC(EJDB_load), 2);
     rb_define_method(ejdbClass, "find", RUBY_METHOD_FUNC(EJDB_find), -1);
 
     rb_define_method(ejdbClass, "dropCollection", RUBY_METHOD_FUNC(EJDB_dropCollection), 2);