rename 'book' to 'page'

This commit is contained in:
uleelx 2015-04-07 15:37:11 +08:00
parent 544ae720a5
commit 52988e3b02
3 changed files with 61 additions and 61 deletions

View File

@ -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

58
cli.lua
View File

@ -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

View File

@ -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