#51
authoradam <adamansky@gmail.com>
Tue, 19 Mar 2013 10:20:53 +0000 (17:20 +0700)
committeradam <adamansky@gmail.com>
Tue, 19 Mar 2013 10:20:53 +0000 (17:20 +0700)
luaejdb/ejdb.lua
luaejdb/ejdb/inspect.lua [moved from luaejdb/inspect.lua with 100% similarity]
luaejdb/luaejdb-1.0-1.rockspec
luaejdb/luaejdb.c
luaejdb/samples/sample1.lua [new file with mode: 0644]
luaejdb/test/Makefile
luaejdb/test/t1.lua

index aa3de39..b294c99 100644 (file)
@@ -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
 
similarity index 100%
rename from luaejdb/inspect.lua
rename to luaejdb/ejdb/inspect.lua
index 043a6a9..89741cb 100644 (file)
@@ -26,6 +26,7 @@ build = {
   type = "builtin",
   modules = {
     ["ejdb"]  = "ejdb.lua",
+    ["ejdb.inspect"]  = "ejdb/inspect.lua",
     ["luaejdb"] = {
        sources = {"luaejdb.c", "luabson.c"},
        libraries = {"tcejdb"} ,
index ec1ddc2..bbb1cda 100644 (file)
@@ -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 (file)
index 0000000..3b92cce
--- /dev/null
@@ -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()
index 24a397f..3cef465 100644 (file)
@@ -2,7 +2,8 @@
 
 check:
        $(RUNENV) $(RUNCMD) lua ./t1.lua
+       make clean
 
 clean:
-       rm -rf ./testdb*
+       rm -f ./testdb*
 
index 757bfb5..14369c6 100644 (file)
@@ -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)