}
};
-//return cursor iterator
-
static int cursor_call(lua_State *L) {
const char *flags = "";
CURSORDATA *cdata = luaL_checkudata(L, 1, EJDBCURSORMT);
static int db_del(lua_State *L) {
EJDBDATA *data = luaL_checkudata(L, 1, EJDBUDATAMT);
- EJDB *db = data->db;
- if (db) {
- ejdbdel(db);
+ EJDB *jb = data->db;
+ if (jb) {
+ ejdbdel(jb);
data->db = NULL;
}
return 0;
luaL_checktype(L, 1, LUA_TTABLE); //self
lua_getfield(L, 1, EJDBUDATAKEY);
EJDBDATA *data = luaL_checkudata(L, -1, EJDBUDATAMT);
- EJDB *db = data->db;
- if (db) {
- if (!ejdbclose(db)) {
- EJDBERR(L, db);
+ EJDB *jb = data->db;
+ if (jb) {
+ if (!ejdbclose(jb)) {
+ EJDBERR(L, jb);
+ }
+ }
+ return 0;
+}
+
+static int db_is_open(lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE); //self
+ lua_getfield(L, 1, EJDBUDATAKEY);
+ lua_pushboolean(L, ejdbisopen(((EJDBDATA*) luaL_checkudata(L, -1, EJDBUDATAMT))->db));
+ return 1;
+}
+
+static int db_ensure_collection(lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE); //self
+ lua_getfield(L, 1, EJDBUDATAKEY);
+ EJDBDATA *data = luaL_checkudata(L, -1, EJDBUDATAMT);
+ EJDB *jb = data->db;
+ const char *cname = luaL_checkstring(L, 2);
+ EJCOLLOPTS opts = {NULL};
+ if (lua_istable(L, 3)) {
+ lua_getfield(L, 3, "cachedrecords");
+ if (lua_isnumber(L, -1)) {
+ opts.cachedrecords = lua_tointeger(L, -1);
+ }
+ lua_pop(L, 1);
+
+ lua_getfield(L, 3, "records");
+ if (lua_isnumber(L, -1)) {
+ opts.records = lua_tointeger(L, -1);
+ }
+ lua_pop(L, 1);
+
+ lua_getfield(L, 3, "large");
+ opts.large = lua_toboolean(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, 3, "compressed");
+ opts.compressed = lua_toboolean(L, -1);
+ lua_pop(L, 1); //-field
+ }
+ if (!ejdbcreatecoll(jb, cname, &opts)) {
+ return set_ejdb_error(L, jb);
+ }
+ return 0;
+}
+
+static int db_drop_collection(lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE); //self
+ lua_getfield(L, 1, EJDBUDATAKEY);
+ EJDBDATA *data = luaL_checkudata(L, -1, EJDBUDATAMT);
+ EJDB *jb = data->db;
+ const char *cname = luaL_checkstring(L, 2);
+ bool unlink = lua_toboolean(L, 3);
+ if (!ejdbrmcoll(jb, cname, unlink)) {
+ return set_ejdb_error(L, jb);
+ }
+ return 0;
+}
+
+static int db_remove(lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE); //self
+ lua_getfield(L, 1, EJDBUDATAKEY);
+ EJDBDATA *data = luaL_checkudata(L, -1, EJDBUDATAMT);
+ EJDB *jb = data->db;
+ bson_oid_t oid;
+ memset(&oid, 0, sizeof (oid));
+ const char *cname = luaL_checkstring(L, 2); //collections name
+ if (lua_isstring(L, 3)) {
+ const char *soid = lua_tostring(L, 3);
+ if (ejdbisvalidoidstr(soid)) {
+ bson_oid_from_string(&oid, soid);
+ }
+ } else if (luaL_getmetafield(L, 3, "__bsontype") && lua_tointeger(L, -1) == BSON_OID) {
+ lua_pop(L, 1);
+ lua_rawgeti(L, 3, 1);
+ const char *soid = lua_tostring(L, -1);
+ if (ejdbisvalidoidstr(soid)) {
+ bson_oid_from_string(&oid, soid);
+ }
+ lua_pop(L, 1);
+ }
+ if (!oid.ints[0] && !oid.ints[1] && !oid.ints[2]) {
+ return luaL_error(L, "Invalid OID arg #2");
+ }
+ EJCOLL *coll = ejdbgetcoll(jb, cname);
+ if (!coll) {
+ return 0;
+ }
+ if (!ejdbrmbson(coll, &oid)) {
+ return set_ejdb_error(L, jb);
+ }
+ return 0;
+}
+
+static int db_sync(lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE); //self
+ lua_getfield(L, 1, EJDBUDATAKEY);
+ EJDBDATA *data = luaL_checkudata(L, -1, EJDBUDATAMT);
+ EJDB *jb = data->db;
+ if (lua_isstring(L, 2)) { //sync coll
+ const char *cname = lua_tostring(L, 2);
+ EJCOLL *coll = ejdbgetcoll(jb, cname);
+ if (coll) {
+ if (!ejdbsyncoll(coll)) {
+ return set_ejdb_error(L, jb);
+ }
+ }
+ } else { //sync db
+ if (!ejdbsyncdb(jb)) {
+ return set_ejdb_error(L, jb);
}
}
return 0;
}
+static int db_set_index(lua_State *L) {
+ //todo
+ return 0;
+}
+
static int db_save(lua_State *L) {
int argc = lua_gettop(L);
luaL_checktype(L, 1, LUA_TTABLE); //self
lua_pushcfunction(L, db_find);
lua_setfield(L, -2, "_find");
+ lua_pushcfunction(L, db_is_open);
+ lua_setfield(L, -2, "isOpen");
+
+ lua_pushcfunction(L, db_ensure_collection);
+ lua_setfield(L, -2, "ensureCollection");
+
+ lua_pushcfunction(L, db_drop_collection);
+ lua_setfield(L, -2, "dropCollection");
+
+ lua_pushcfunction(L, db_remove);
+ lua_setfield(L, -2, "remove");
+
+ lua_pushcfunction(L, db_sync);
+ lua_setfield(L, -2, "sync");
+
+ lua_pushcfunction(L, db_set_index);
+ lua_setfield(L, -2, "_setIndex");
+
if (lua_gettop(L) - argc != 1) {
ejdbdel(db);
udb->db = NULL;
local B = ejdb.B
local db = ejdb:open("testdb", "rwct");
+assert(db:isOpen() == true)
local q = Q("name", "Andy"):F("_id"):Eq("510f7fa91ad6270a00000000"):F("age"):Gt(20):Lt(40):F("score"):In({ 11, 22.12333, 1362835380447, db.toNull() }):Max(232);
assert([[.name(2)=Andy
-- Test save
--
local oid = db:save("mycoll", { foo = "bar", k1 = "v1" });
+local firstOid = oid;
ejdb.check_valid_oid_string(oid)
oid = db:save("mycoll", B("foo2", "bar2"):KV("g", "d"):KV("e", 1):KV("a", "g"));
local r, err = pcall(qres.object, qres, 1);
assert(err == "Cursor closed")
-
local qres, count, log = db:find("mycoll", Q("foo", "bar"), "l")
assert(type(log) == "string")
assert(qres ~= nil)
assert(count == 1)
assert(vobj["foo"] == "bar")
+db:ensureCollection("ecoll", { large = true, records = 200000 })
+db:dropCollection("ecoll", true);
+
+assert(db:count("mycoll", Q("_id", firstOid)) == 1)
+db:remove("mycoll", firstOid)
+assert(db:count("mycoll", Q("_id", firstOid)) == 0)
+
+db:sync("mycoll") -- sync only mycoll
+db:sync() -- sync whole db
+assert(db:isOpen() == true)
db:close()
+assert(db:isOpen() == false)
collectgarbage()
collectgarbage()
collectgarbage()
-
-
-