bson *bs = ejdbloadbson(coll, &oid);
if (!bs) {
- raise_ejdb_error(ejdb);
+ int ecode = ejdbecode(ejdb);
+ if (ecode != TCESUCCESS && ecode != TCENOREC) {
+ raise_ejdb_error(ejdb);
+ } else {
+ return Qnil;
+ }
+
}
return bson_to_ruby(bs);
}
VALUE EJDB_get_db_meta(VALUE self) {
-
EJDB* ejdb = getEJDB(self);
TCLIST *cols = ejdbgetcolls(ejdb);
}
}
+VALUE EJDB_get_transaction_status(VALUE self, VALUE collName) {
+ SafeStringValue(collName);
+
+ EJDB* ejdb = getEJDB(self);
+ EJCOLL *coll = ejdbcreatecoll(ejdb, StringValuePtr(collName), NULL);
+ if (!coll) {
+ raise_ejdb_error(ejdb);
+ }
+
+ bool status;
+ if (!ejdbtranstatus(coll, &status)) {
+ raise_ejdb_error(ejdb);
+ }
+
+ return status ? Qtrue : Qfalse;
+}
+
+void EJDB_begin_transaction(VALUE self, VALUE collName) {
+ SafeStringValue(collName);
+
+ EJDB* ejdb = getEJDB(self);
+ EJCOLL *coll = ejdbcreatecoll(ejdb, StringValuePtr(collName), NULL);
+ if (!coll) {
+ raise_ejdb_error(ejdb);
+ }
+
+ if (!ejdbtranbegin(coll)) {
+ raise_ejdb_error(ejdb);
+ }
+}
+
+void EJDB_commit_transaction(VALUE self, VALUE collName) {
+ SafeStringValue(collName);
+
+ EJDB* ejdb = getEJDB(self);
+ EJCOLL *coll = ejdbcreatecoll(ejdb, StringValuePtr(collName), NULL);
+ if (!coll) {
+ raise_ejdb_error(ejdb);
+ }
+
+ if (!ejdbtrancommit(coll)) {
+ raise_ejdb_error(ejdb);
+ }
+}
+
+void EJDB_rollback_transaction(VALUE self, VALUE collName) {
+ SafeStringValue(collName);
+
+ EJDB* ejdb = getEJDB(self);
+ EJCOLL *coll = ejdbcreatecoll(ejdb, StringValuePtr(collName), NULL);
+ if (!coll) {
+ raise_ejdb_error(ejdb);
+ }
+
+ if (!ejdbtranabort(coll)) {
+ raise_ejdb_error(ejdb);
+ }
+}
+
void close_ejdb_results_internal(RBEJDB_RESULTS* rbres) {
tclistdel(rbres->results);
rb_define_method(ejdbClass, "get_db_meta", RUBY_METHOD_FUNC(EJDB_get_db_meta), 0);
rb_define_method(ejdbClass, "sync", RUBY_METHOD_FUNC(EJDB_sync), 0);
+ rb_define_method(ejdbClass, "get_transaction_status", RUBY_METHOD_FUNC(EJDB_get_transaction_status), 1);
+ rb_define_method(ejdbClass, "begin_transaction", RUBY_METHOD_FUNC(EJDB_begin_transaction), 1);
+ rb_define_method(ejdbClass, "commit_transaction", RUBY_METHOD_FUNC(EJDB_commit_transaction), 1);
+ rb_define_method(ejdbClass, "rollback_transaction", RUBY_METHOD_FUNC(EJDB_rollback_transaction), 1);
+
ejdbResultsClass = rb_define_class("EJDBResults", rb_cObject);
rb_include_module(ejdbResultsClass, rb_mEnumerable);
puts "test_ejdbd_remove_colls has passed successfull"
end
+ def test_ejdbd_tx1
+ assert_not_nil $jb
+ assert $jb.is_open?
+
+ obj = {:foo => "bar"}
+
+ assert_equal(false, $jb.get_transaction_status("bars"))
+
+ $jb.begin_transaction("bars")
+
+ $jb.save("bars", obj)
+ id = obj["_id"]
+ assert_not_nil id
+
+ obj = $jb.load("bars", obj["_id"])
+ assert_not_nil obj
+ assert $jb.get_transaction_status("bars")
+
+ $jb.rollback_transaction("bars")
+ assert_equal(false, $jb.get_transaction_status("bars"))
+
+ obj = $jb.load("bars", obj["_id"])
+ assert_nil obj
+
+ $jb.begin_transaction("bars")
+
+ assert $jb.get_transaction_status("bars")
+ assert_nil $jb.load("bars", id)
+ obj = {:foo => "bar"}
+
+ $jb.save("bars", obj)
+ id = obj["_id"]
+ assert_not_nil id
+
+ assert_not_nil $jb.load("bars", id)
+
+ $jb.commit_transaction("bars")
+
+ assert_equal(false, $jb.get_transaction_status("bars"))
+
+ assert_not_nil $jb.load("bars", id)
+
+ puts "test_ejdbd_tx1 has passed successfull"
+ end
end