From f8cf03887906b98266c44097aaead7d22d03cc0e Mon Sep 17 00:00:00 2001 From: adam Date: Tue, 19 Mar 2013 17:20:53 +0700 Subject: [PATCH] #51 --- luaejdb/ejdb.lua | 11 ++++++-- luaejdb/{ => ejdb}/inspect.lua | 0 luaejdb/luaejdb-1.0-1.rockspec | 1 + luaejdb/luaejdb.c | 6 +++-- luaejdb/samples/sample1.lua | 59 ++++++++++++++++++++++++++++++++++++++++++ luaejdb/test/Makefile | 3 ++- luaejdb/test/t1.lua | 11 +++++--- 7 files changed, 83 insertions(+), 8 deletions(-) rename luaejdb/{ => ejdb}/inspect.lua (100%) create mode 100644 luaejdb/samples/sample1.lua diff --git a/luaejdb/ejdb.lua b/luaejdb/ejdb.lua index aa3de39..b294c99 100644 --- a/luaejdb/ejdb.lua +++ b/luaejdb/ejdb.lua @@ -1,6 +1,6 @@ local luaejdb = require("luaejdb") assert(type(luaejdb) == "table") -local inspect = require("inspect") +local inspect = require("ejdb.inspect") -- ------------ Misc ----------------------- @@ -74,10 +74,17 @@ function luaejdb.toOID(val) end function luaejdb.toDate(val) + if type(val) == "table" then + val = os.time(val) * 1000 + end assert(type(val) == "number") return setmetatable({ val }, mtBSON_DATE); end +function luaejdb.toDateNow() + return luaejdb.toDate(os.time() * 1000) +end + function luaejdb.toRegexp(re, opts) opts = opts or "" assert(type(re) == "string" and type(opts) == "string") @@ -113,7 +120,7 @@ local mtDBObj = { -- ------- EJDB DB --------------------------- local luaejdb_open = luaejdb.open -function luaejdb:open(path, omode, ...) +function luaejdb.open(path, omode, ...) return setmetatable(luaejdb_open(path, omode), mtDBObj) end diff --git a/luaejdb/inspect.lua b/luaejdb/ejdb/inspect.lua similarity index 100% rename from luaejdb/inspect.lua rename to luaejdb/ejdb/inspect.lua diff --git a/luaejdb/luaejdb-1.0-1.rockspec b/luaejdb/luaejdb-1.0-1.rockspec index 043a6a9..89741cb 100644 --- a/luaejdb/luaejdb-1.0-1.rockspec +++ b/luaejdb/luaejdb-1.0-1.rockspec @@ -26,6 +26,7 @@ build = { type = "builtin", modules = { ["ejdb"] = "ejdb.lua", + ["ejdb.inspect"] = "ejdb/inspect.lua", ["luaejdb"] = { sources = {"luaejdb.c", "luabson.c"}, libraries = {"tcejdb"} , diff --git a/luaejdb/luaejdb.c b/luaejdb/luaejdb.c index ec1ddc2..bbb1cda 100644 --- a/luaejdb/luaejdb.c +++ b/luaejdb/luaejdb.c @@ -519,7 +519,8 @@ static int db_meta(lua_State *L) { if (!cols) { return set_ejdb_error(L, jb); } - for (int i = 0; i < TCLISTNUM(cols); ++i) { + int i; + for (i = 0; i < TCLISTNUM(cols); ++i) { EJCOLL *coll = (EJCOLL*) TCLISTVALPTR(cols, i); if (!ejcollockmethod(coll, false)) continue; @@ -554,7 +555,8 @@ static int db_meta(lua_State *L) { lua_newtable(L); //+ coll indexes int ic = 0; - for (int j = 0; j < coll->tdb->inum; ++j) { + int j; + for (j = 0; j < coll->tdb->inum; ++j) { TDBIDX *idx = (coll->tdb->idxs + j); if (idx->type != TDBITLEXICAL && idx->type != TDBITDECIMAL && idx->type != TDBITTOKEN) { continue; diff --git a/luaejdb/samples/sample1.lua b/luaejdb/samples/sample1.lua new file mode 100644 index 0000000..3b92cce --- /dev/null +++ b/luaejdb/samples/sample1.lua @@ -0,0 +1,59 @@ +local ejdb = require("ejdb") +local inspect = require("ejdb.inspect") +local Q = ejdb.Q + +-- Used modes: +-- 'r' - read +-- 'w' - write +-- 'c' - create db if not exists +-- 't' - truncate existing db +local db = ejdb.open("zoo", "rwct") + +-- Unordered lua table +local parrot1 = { + name = "Grenny", + type = "African Grey", + male = true, + age = 1, + birthhdate = ejdb.toDateNow(), + likes = { "green color", "night", "toys" }, + extra1 = ejdb.toNull() +} + +-- Preserve order of BSON keys +local parrot2 = Q(); +parrot2:KV("name", "Bounty"):KV("type", "Cockatoo"):KV("male", false) +parrot2:KV("age", 15):KV("birthdate", + ejdb.toDate({ year = 2013, month = 1, day = 1, hour = 0, sec = 1 })) +parrot2:KV("likes", { "sugar cane" }):KV("extra1", ejdb.toNull()) + +--IF YOU WANT SOME DATA INSPECTIONS: +--print(ejdb.print_bson(parrot2:toBSON())) +--local obj = ejdb.from_bson(parrot2:toBSON()) +--print(inspect(obj)); + +db:save("parrots2", parrot1) +db:save("parrots2", parrot2) + +-- Below two equivalent queries: +-- Q1 +local res, count, log = +db:find("parrots2", Q("likes", "toys"):OrderBy("name asc", "age desc")) +for i = 1, #res do -- iterate one + local ob = res:object(i) + print("" .. ob["name"] .. " likes toys #1") +end + +-- Q2 +local res, count, log = +db:find("parrots2", Q():F("likes"):Eq("toys"):OrderBy({ name = 1 }, { age = -1 })) +for i = 1, #res do -- iterate one + print("" .. res:field(i, "name") .. " likes toys #2") +end + +-- Second way to iterate +for vobj, idx in res() do + print("" .. vobj["name"] .. " likes toys #3") +end + +db:close() diff --git a/luaejdb/test/Makefile b/luaejdb/test/Makefile index 24a397f..3cef465 100644 --- a/luaejdb/test/Makefile +++ b/luaejdb/test/Makefile @@ -2,7 +2,8 @@ check: $(RUNENV) $(RUNCMD) lua ./t1.lua + make clean clean: - rm -rf ./testdb* + rm -f ./testdb* diff --git a/luaejdb/test/t1.lua b/luaejdb/test/t1.lua index 757bfb5..14369c6 100644 --- a/luaejdb/test/t1.lua +++ b/luaejdb/test/t1.lua @@ -2,7 +2,7 @@ package.path = "../?.lua;" .. package.path package.cpath = "../?.so;" .. package.cpath -local inspect = require("inspect") +local inspect = require("ejdb.inspect") local ejdb = require("ejdb") assert(type(ejdb) == "table") @@ -12,7 +12,7 @@ assert(pcall(function() ejdb.check_valid_oid_string("510f7fa91ad6270a00000000") local Q = ejdb.Q local B = ejdb.B -local db = ejdb:open("testdb", "rwct"); +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); @@ -197,13 +197,18 @@ db:rollbackTransaction("mycoll") assert(db:getTransactionStatus("mycoll") == false) assert(db:findOne("mycoll", Q("name", 1)) == nil); +assert(db:update("ecoll", Q("k1", "v1"):Upsert({k1="v1"})) == 1) +assert(db:update("ecoll", Q("k1", "v1"):Upsert(Q("k1", "v2"))) == 1) +assert(db:count("ecoll", Q("k1", "v2")) == 1) db:ensureStringIndex("mycoll", "foo") -print(inspect(db:getDBMeta())) +--print(inspect(db:getDBMeta())) db:dropCollection("ecoll", true); +assert(db:count("ecoll", Q("k1", "v2")) == 0) + assert(db:isOpen() == true) db:close() assert(db:isOpen() == false) -- 2.7.4