local luaejdb = require("luaejdb")
assert(type(luaejdb) == "table")
-local inspect = require("inspect")
+local inspect = require("ejdb.inspect")
-- ------------ Misc -----------------------
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")
-- ------- 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
type = "builtin",
modules = {
["ejdb"] = "ejdb.lua",
+ ["ejdb.inspect"] = "ejdb/inspect.lua",
["luaejdb"] = {
sources = {"luaejdb.c", "luabson.c"},
libraries = {"tcejdb"} ,
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;
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;
--- /dev/null
+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()
check:
$(RUNENV) $(RUNCMD) lua ./t1.lua
+ make clean
clean:
- rm -rf ./testdb*
+ rm -f ./testdb*
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")
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);
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)