diff --git a/sample/lua/userdb.lua b/sample/lua/userdb.lua new file mode 100644 index 0000000..fed86f6 --- /dev/null +++ b/sample/lua/userdb.lua @@ -0,0 +1,73 @@ +#! /usr/bin/env lua +-- +-- userdb.lua +-- Copyright (C) 2024 Shewer Lu +-- +-- Distributed under terms of the MIT license. +-- +--[[ +example: +local userdb = require 'userdb' +local ldb=userdb.LevelDb('ecdict') +ldb:open() +for k,v in ldb:query('a'):iter() do print(k,v) end + +--]] +local db_pool_ = {} +local vars_get= { + _loaded=true, + read_only=true, + disabled=true, + name=true, + file_name=true, + } +local vars_set= {} +local userdb_mt = {} +function userdb_mt.__newindex(tab,key,value) + local db = db_pool_[tab._db_key] + if not db then + db = UserDb(tab._db_name, tab._db_class) + db_pool_[tab._db_key] = db + end + if db and vars_set[key] then + db[key]= value + end +end + +function userdb_mt.__index(tab,key) + local db = db_pool_[tab._db_key] + if not db then + db = UserDb(tab._db_name, tab._db_class) + db_pool_[tab._db_key] = db + end + + if db and vars_get[key] then + return db[key] + else + return function (tab, ...) + return db[key](db,...) + end + end +end + +local userdb= {} + +function userdb.UserDb(db_name, db_class) + local db_key = db_name .. "." .. db_class + local db = { + _db_key = db_key, + _db_name= db_name, + _db_class = db_class, + } + db_pool_[db_key] = UserDb(db_name, db_class) + return setmetatable(db , userdb_mt) +end + +function userdb.LevelDb(db_name) + return userdb.UserDb(db_name, "userdb") +end +function userdb.TableDb(db_name) + return userdb.UserDb(db_name, "plain_userdb") +end + +return userdb diff --git a/src/types_ext.cc b/src/types_ext.cc index cd8c6ea..673fdfa 100644 --- a/src/types_ext.cc +++ b/src/types_ext.cc @@ -252,12 +252,10 @@ namespace UserDbReg{ using A = DbAccessor; an make(const string& db_name, const string& db_class) { - if (auto comp= UserDb::Require(db_class)){ - return an( comp->Create(db_name)) ; - } - else { - return {}; + if (auto comp= Db::Require(db_class)) { + return an(comp->Create(db_name)); } + return {}; } an make_leveldb(const string& db_name) { @@ -275,16 +273,6 @@ namespace UserDbReg{ return {}; } - bool Open(T &t) { return t.Open(); } - bool Close(T &t) { return t.Close(); } - bool OpenReadOnly(T &t) { return t.OpenReadOnly(); } - bool Erase(T &t, const string &key) { return t.Erase(key); } - bool Update(T &t, const string &key, const string &value) { - return t.Update(key, value); - } - - an Query(T &t, const string& key) { return t.Query(key); } - static const luaL_Reg funcs[] = { {"UserDb", WRAP(make)},// an LevelDb( db_file, db_name) {"LevelDb", WRAP(make_leveldb)},// an LevelDb( db_file, db_name) @@ -293,13 +281,13 @@ namespace UserDbReg{ }; static const luaL_Reg methods[] = { - {"open", WRAP(Open)}, - {"open_read_only", WRAP(OpenReadOnly)}, - {"close", WRAP(Close)}, - {"query", WRAP(Query)}, // query(prefix_key) return DbAccessor + {"open", WRAPMEM(T, Open)}, + {"open_read_only", WRAPMEM(T, OpenReadOnly)}, + {"close", WRAPMEM(T, Close)}, + {"query", WRAPMEM(T, Query)}, // query(prefix_key) return DbAccessor {"fetch", WRAP(fetch)}, // fetch(key) return value - {"update", WRAP(Update)}, // update(key,value) return bool - {"erase", WRAP(Erase)}, // erase(key) return bool + {"update", WRAPMEM(T, Update)}, // update(key,value) return bool + {"erase", WRAPMEM(T, Erase)}, // erase(key) return bool {"loaded",WRAPMEM(T, loaded)}, {"disable", WRAPMEM(T, disable)},