VALUE EJDB_find(int argc, VALUE* argv, VALUE self) {
VALUE collName;
VALUE q;
+ VALUE orarr;
VALUE hints;
- rb_scan_args(argc, argv, "12", &collName, &q, &hints);
+ VALUE p3;
+ VALUE p4;
+
+ rb_scan_args(argc, argv, "13", &collName, &q, &p3, &p4);
SafeStringValue(collName);
q = !NIL_P(q) ? q :rb_hash_new();
+ orarr = TYPE(p3) == T_ARRAY ? rb_ary_dup(p3) : rb_ary_new();
+ hints = TYPE(p3) != T_ARRAY ? p3 : p4;
hints = !NIL_P(hints) ? hints :rb_hash_new();
Check_Type(q, T_HASH);
bson* qbson;
ruby_to_bson(q, &qbson, RUBY_TO_BSON_AS_QUERY);
+ VALUE orarrlng = rb_funcall(orarr, rb_intern("length"), 0);
+ bson* orarrbson = (bson*) malloc(sizeof(bson) * NUM2INT(orarrlng));
+ int i;
+ while(!NIL_P(rb_ary_entry(orarr, 0))) {
+ VALUE orq = rb_ary_shift(orarr);
+ bson* orqbson;
+ ruby_to_bson(orq, &orqbson, RUBY_TO_BSON_AS_QUERY);
+ orarrbson[i++] = *orqbson;
+ }
+
bson* hintsbson = NULL;
ruby_to_bson(prepare_query_hints(hints), &hintsbson, RUBY_TO_BSON_AS_QUERY);
- EJQ *ejq = ejdbcreatequery(ejdb, qbson, NULL, 0, hintsbson);
+ EJQ *ejq = ejdbcreatequery(ejdb, qbson, orarrbson, NUM2INT(orarrlng), hintsbson);
int count;
int qflags = 0;
qflags |= onlycount ? EJQONLYCOUNT : 0;
TCLIST* qres = ejdbqryexecute(coll, ejq, &count, qflags, NULL);
+ free(orarrbson);
return !onlycount ? create_EJDB_query_results(qres) : INT2NUM(count);
}
}
}
+void EJDB_results_close(VALUE self) {
+ RBEJDB_RESULTS* rbresults;
+ Data_Get_Struct(self, RBEJDB_RESULTS, rbresults);
+
+ tclistdel(rbresults->results);
+ rbresults->results = NULL;
+}
+
Init_rbejdb() {
init_ruby_to_bson();
ejdbResultsClass = rb_define_class("EJDBResults", rb_cObject);
rb_include_module(ejdbResultsClass, rb_mEnumerable);
rb_define_method(ejdbResultsClass, "each", RUBY_METHOD_FUNC(EJDB_results_each), 0);
+ rb_define_method(ejdbResultsClass, "close", RUBY_METHOD_FUNC(EJDB_results_close), 0);
}
\ No newline at end of file
assert_equal("Bounty", obj["name"])
end
+
def test_ejdb2_query1
assert_not_nil $jb
assert $jb.is_open?
assert_equal(2, results.to_a.length)
end
+
def test_ejdb3_test_query2
assert_not_nil $jb
assert $jb.is_open?
end
}
end
+
+
+ def test_ejdb4_test_query3
+
+ assert_not_nil $jb
+ assert $jb.is_open?
+
+ results = $jb.find("parrots", {}, [{:name => "Grenny"}, {:name => "Bounty"}], {:orderby => {:name => 1}})
+
+ assert_not_nil results
+ assert_equal(2, results.to_a.length)
+
+ results.each_with_index { |rv, index|
+ if index == 1
+ assert_equal("Grenny", rv["name"])
+ assert_equal("African Grey", rv["type"])
+ assert_equal(true, rv["male"])
+ assert_equal(1, rv["age"])
+ assert_equal($now.inspect, rv["birthdate"].inspect)
+ assert_equal("green color,night,toys", rv["likes"].join(","))
+ end
+ }
+
+
+ assert_equal(2, results.to_a.length)
+
+ # testing force close
+ results.close
+
+ assert_raise(RuntimeError) {
+ results.to_a.length
+ }
+ end
+
end