diff --git a/README.md b/README.md index 82b6f1a..dcbe856 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Concept | FlatDB | Disk | Lua | |:--------------:|:-------------:|:--------------:| | Database | Directory | Table | -| Book | File | Table | +| Page | File | Table | | Key-value pair | File content | Key-value pair | Keys and values can be all Lua types except coroutines, userdata, cdata and C functions. @@ -36,32 +36,32 @@ local flatdb = require 'flatdb' local db = flatdb('./db') ``` -2. Open or create a book +2. Open or create a page ```lua - if not db.book then - db.book = {} + if not db.page then + db.page = {} end ``` 3. Store key-value items ```lua - db.book.key = 'value' - -- equivalent to db.book['key'] = 'value' + db.page.key = 'value' + -- equivalent to db.page['key'] = 'value' ``` 4. Retrieve items ```lua - print(db.book.key) -- prints 'value' + print(db.page.key) -- prints 'value' ``` 5. Save to file ```lua db:save() - -- 'book' will be saved to './db/book' + -- 'page' will be saved to './db/page' ``` More usage can be found in the *cli.lua*(a Redis-like command line interface example using FlatDB). @@ -73,21 +73,21 @@ Quick Look local flatdb = require("flatdb") -- open a directory as a database --- 'db' is just a plain empty Lua table that can contain books +-- 'db' is just a plain empty Lua table that can contain pages local db = flatdb("./db") --- open or create a book named "default" +-- open or create a page named "default" -- it is also a plain empty Lua table where key-value pair stored in if not db.default then db.default = {} end --- extend db methods for getting values from 'default' book +-- extend db methods for getting values from 'default' page flatdb.hack.get = function(db, key) return db.default[key] end --- extend db methods for setting values to 'default' book +-- extend db methods for setting values to 'default' page flatdb.hack.set = function(db, key, value) db.default[key] = value end @@ -97,21 +97,21 @@ flatdb.hack.guard = function(db, f) setmetatable(db.default, {__newindex = f}) end --- get key-value data from 'default' book +-- get key-value data from 'default' page print(db:get("hello")) --- set key-value data to 'default' book +-- set key-value data to 'default' page db:set("hello", "world") --- get key-value data from 'default' book +-- get key-value data from 'default' page print(db:get("hello")) -- set guard function -db:guard(function(book, key, value) +db:guard(function(page, key, value) print("CREATE KEY permission denied!") end) --- try creating new key-value pair to 'default' book +-- try creating new key-value pair to 'default' page db:set("key1", 1) db:set("key2", 2) @@ -122,7 +122,7 @@ print(db:get("key1")) -- prints nil print(db:get("key2")) -- prints nil print(db:get("hello")) -- prints 'bye' --- store 'default' book to './db/default' file +-- store 'default' page to './db/default' file db:save() ``` @@ -136,15 +136,15 @@ API Bind a directory as a database, returns nil if 'dir' doesn't exists. Otherwise, it returns a 'db' obeject. - - **db:save([book])** + - **db:save([page])** - Save all books or the given book(if specified) contained in db to file. The 'book' argument is a string, the book's name. + Save all pages or the given page(if specified) contained in db to file. The 'page' argument is a string, the page's name. - **Tables** - **flatdb.hack** - The 'hack' table contains db's methods. There is only one method 'save(db, book)' in it by default. + The 'hack' table contains db's methods. There is only one method 'save(db, page)' in it by default. It is usually used to extend db methods. Dependencies diff --git a/cli.lua b/cli.lua index 008a7bb..cb6a596 100644 --- a/cli.lua +++ b/cli.lua @@ -22,7 +22,7 @@ local function split(s, sep, maxsplit, plain) end local db = assert(flatdb("./db")) -local book = "0" +local page = "0" local function handle(input) local c = split(input, " ", 2) @@ -41,59 +41,59 @@ local function handle(input) end end if db[key] then - book = key + page = key print("OK") else print("ERROR") end elseif cmd == "GET" then - print(pp.format(db[book][key])) + print(pp.format(db[page][key])) elseif cmd == "SET" then local ok, tmp = pcall(load("return "..tostring(value), "=(load)", "t", db)) - db[book][key] = ok and tmp or value + db[page][key] = ok and tmp or value print("OK") elseif cmd == "INCR" then - if not db[book][key] then - db[book][key] = 0 + if not db[page][key] then + db[page][key] = 0 end - db[book][key] = db[book][key] + 1 + db[page][key] = db[page][key] + 1 print("OK") elseif cmd == "DECR" then - if not db[book][key] then - db[book][key] = 0 + if not db[page][key] then + db[page][key] = 0 end - db[book][key] = db[book][key] - 1 + db[page][key] = db[page][key] - 1 print("OK") elseif cmd == "RPUSH" then - if not db[book][key] then - db[book][key] = {} + if not db[page][key] then + db[page][key] = {} end - table.insert(db[book][key], value) - print(#db[book][key]) + table.insert(db[page][key], value) + print(#db[page][key]) elseif cmd == "LPUSH" then - if not db[book][key] then - db[book][key] = {} + if not db[page][key] then + db[page][key] = {} end - table.insert(db[book][key], 1, value) - print(#db[book][key]) + table.insert(db[page][key], 1, value) + print(#db[page][key]) elseif cmd == "RPOP" then - if not db[book][key] then - db[book][key] = {} + if not db[page][key] then + db[page][key] = {} end - print(table.remove(db[book][key], value)) + print(table.remove(db[page][key], value)) elseif cmd == "LPOP" then - if not db[book][key] then - db[book][key] = {} + if not db[page][key] then + db[page][key] = {} end - print(table.remove(db[book][key], 1)) + print(table.remove(db[page][key], 1)) elseif cmd == "LLEN" then - print(db[book][key] and #db[book][key] or 0) + print(db[page][key] and #db[page][key] or 0) elseif cmd == "LINDEX" then - if db[book][key] then + if db[page][key] then local i = tonumber(value) - if i < 0 then i = i + #db[book][key] end + if i < 0 then i = i + #db[page][key] end i = i + 1 - print(db[book][key][i]) + print(db[page][key][i]) else print("nil") end @@ -106,7 +106,7 @@ local function main() end io.stdout:setvbuf("no") while true do - local prefix = book == "0" and "" or ("["..book.."]") + local prefix = page == "0" and "" or ("["..page.."]") io.write("flatdb"..prefix.."> ") local input = io.read("*l") if string.upper(input) == "EXIT" or string.upper(input) == "QUIT" then diff --git a/flatdb.lua b/flatdb.lua index 12416aa..c85c8d6 100644 --- a/flatdb.lua +++ b/flatdb.lua @@ -9,16 +9,16 @@ local function isDir(path) return lfs.attributes(path, "mode") == "directory" end -local function load_book(path) +local function load_page(path) return dofile(path) end -local function store_book(path, book) - if type(book) == "table" then +local function store_page(path, page) + if type(page) == "table" then local f = io.open(path, "wb") if f then f:write("return ") - f:write(pp.format(book)) + f:write(pp.format(page)) f:close() return true end @@ -29,16 +29,16 @@ end local pool = {} local db_funcs = { - save = function(db, bk) - if bk then - if type(bk) == "string" and type(db[bk]) == "table" then - return store_book(pool[db].."/"..bk, db[bk]) + save = function(db, p) + if p then + if type(p) == "string" and type(db[p]) == "table" then + return store_page(pool[db].."/"..p, db[p]) else return false end end - for bk, book in pairs(db) do - store_book(pool[db].."/"..bk, book) + for p, page in pairs(db) do + store_page(pool[db].."/"..p, page) end return true end @@ -48,7 +48,7 @@ local mt = { __index = function(db, k) if db_funcs[k] then return db_funcs[k] end if isFile(pool[db].."/"..k) then - db[k] = load_book(pool[db].."/"..k) + db[k] = load_page(pool[db].."/"..k) end return rawget(db, k) end