#50 - memory tuning
authoryudanov <fedwiz@academ.org>
Mon, 22 Jul 2013 07:48:59 +0000 (14:48 +0700)
committeryudanov <fedwiz@academ.org>
Mon, 22 Jul 2013 07:48:59 +0000 (14:48 +0700)
rbejdb/src/rbbson.c
rbejdb/src/rbejdb.c

index 3945c7c..4d8ef18 100644 (file)
@@ -23,7 +23,7 @@
 
 typedef struct {
     bson* bsonval;
-    int owns_bsonval;
+    bool owns_bsonval;
 
     VALUE obj;
     int arrayIndex;
@@ -83,7 +83,7 @@ void rbbson_free(RBBSON* rbbson) {
 }
 
 
-VALUE createBsonContextWrap(bson* bsonval, int owns_bsonval, VALUE rbobj, VALUE traverse, int flags) {
+VALUE createBsonContextWrap(bson* bsonval, bool owns_bsonval, VALUE rbobj, VALUE traverse, int flags) {
     if (NIL_P(bsonContextClass)) {
         if (owns_bsonval) {
             bson_del(bsonval);
@@ -161,12 +161,13 @@ int iterate_key_values_callback(VALUE key, VALUE val, VALUE bsonContextWrap) {
                 bson* subbson;
                 ruby_to_bson_internal(val, &subbson, rbbsctx->traverse_hash, rbbsctx->flags);
                 bson_append_bson(b, attrName, subbson);
+                bson_del(subbson);
             }
             break;
         case T_ARRAY:
             add_ruby_to_traverse(val, rbbsctx->traverse_hash);
             bson_append_start_array(b, attrName);
-            rb_iterate(rb_each, val, iterate_array_callback, createBsonContextWrap(b, 0, rbbsctx->obj, rbbsctx->traverse_hash, rbbsctx->flags));
+            rb_iterate(rb_each, val, iterate_array_callback, createBsonContextWrap(b, false, rbbsctx->obj, rbbsctx->traverse_hash, rbbsctx->flags));
             bson_append_finish_array(b);
             break;
         case T_STRING:
@@ -273,7 +274,7 @@ void ruby_to_bson_internal(VALUE rbobj, bson** bsonresp, VALUE traverse, int fla
         bson_init(bsonval);
     }
 
-    VALUE bsonContextWrap = createBsonContextWrap(bsonval, 1, rbobj, traverse, flags);
+    VALUE bsonContextWrap = createBsonContextWrap(bsonval, true, rbobj, traverse, flags);
     RBBSON_CONTEXT* rbbsctx;
     Data_Get_Struct(bsonContextWrap, RBBSON_CONTEXT, rbbsctx);
 
index be45b14..983760f 100644 (file)
@@ -316,13 +316,13 @@ VALUE EJDB_save(int argc, VALUE *argv, VALUE self) {
         ruby_to_bson(rbobj, &bsonval, 0);
 
         bson_oid_t oid;
-        if (!ejdbsavebson2(coll, bsonval, &oid, merge)) {
-            bson_del(bsonval);
+        bool saved = ejdbsavebson2(coll, bsonval, &oid, merge);
+        bson_del(bsonval);
+
+        if (!saved) {
             raise_ejdb_error(ejdb);
         }
 
-        bson_del(bsonval);
-
         VALUE roid = bson_oid_to_ruby(&oid);
         rb_ary_push(oids, roid);
 
@@ -467,6 +467,7 @@ VALUE EJDB_find_internal(VALUE self, VALUE collName, VALUE queryWrap, VALUE q, V
 
     bool onlycount = RTEST(get_hash_option(hints, "onlycount"));
     bool explain = RTEST(get_hash_option(hints, "explain"));
+    bool createResults = !onlycount || explain;
 
     EJDB* ejdb = getEJDB(self);
 
@@ -477,7 +478,7 @@ VALUE EJDB_find_internal(VALUE self, VALUE collName, VALUE queryWrap, VALUE q, V
             coll = ejdbcreatecoll(ejdb, StringValuePtr(collName), NULL);
         }
         if (!coll) {
-            return !onlycount || explain ? create_EJDB_query_results(tclistnew2(1), 0, NULL) : INT2NUM(0);
+            return createResults ? create_EJDB_query_results(tclistnew2(1), 0, NULL) : INT2NUM(0);
         }
     }
 
@@ -491,10 +492,13 @@ VALUE EJDB_find_internal(VALUE self, VALUE collName, VALUE queryWrap, VALUE q, V
     TCXSTR *log = explain ? tcxstrnew() : NULL;
 
     TCLIST* qres = ejdbqryexecute(coll, ejq, &count, qflags, log);
-
     ejdbquerydel(ejq);
 
-    return !onlycount || explain ? create_EJDB_query_results(qres, count, log) : UINT2NUM(count);
+    if (!createResults) {
+        tclistdel(qres);
+    }
+
+    return createResults ? create_EJDB_query_results(qres, count, log) : UINT2NUM(count);
 }
 
 VALUE EJDB_find_internal_wrapper(VALUE args) {