typedef struct {
bson* bsonval;
- int owns_bsonval;
+ bool owns_bsonval;
VALUE obj;
int arrayIndex;
}
-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);
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:
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);
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);
bool onlycount = RTEST(get_hash_option(hints, "onlycount"));
bool explain = RTEST(get_hash_option(hints, "explain"));
+ bool createResults = !onlycount || explain;
EJDB* ejdb = getEJDB(self);
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);
}
}
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) {