mirror of
https://github.com/lxsang/silk.git
synced 2024-11-13 00:38:23 +01:00
157 lines
3.6 KiB
Lua
157 lines
3.6 KiB
Lua
|
sqlite = modules.sqlite()
|
||
|
|
||
|
if sqlite == nil then return 0 end
|
||
|
require("OOP")
|
||
|
-- create class
|
||
|
DBModel = Object:inherit{db=nil, name=''}
|
||
|
|
||
|
function DBModel:createTable(m)
|
||
|
if self:available() then return true end
|
||
|
local sql = "CREATE TABLE "..self.name.."(id INTEGER PRIMARY KEY"
|
||
|
for k, v in pairs(m) do
|
||
|
if k ~= "id" then
|
||
|
sql = sql..","..k.." "..v
|
||
|
end
|
||
|
end
|
||
|
sql = sql..");"
|
||
|
return sqlite.query(self.db,sql) == 1
|
||
|
end
|
||
|
|
||
|
function DBModel:insert(m)
|
||
|
local keys = {}
|
||
|
local values = {}
|
||
|
for k,v in pairs(m) do
|
||
|
if k ~= "id" then
|
||
|
table.insert(keys,k)
|
||
|
if type(v) == "number" then
|
||
|
table.insert(values, v)
|
||
|
elseif type(v) == "boolean" then
|
||
|
table.insert( values, v and 1 or 0 )
|
||
|
else
|
||
|
local t = "\""..v:gsub('"', '""').."\""
|
||
|
table.insert(values,t)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
local sql = "INSERT INTO "..self.name.." ("..table.concat(keys,',')..') VALUES ('
|
||
|
sql = sql..table.concat(values,',')..');'
|
||
|
return sqlite.query(self.db, sql) == 1
|
||
|
end
|
||
|
|
||
|
function DBModel:get(id)
|
||
|
return sqlite.select(self.db, self.name, "*","id="..id)[1]
|
||
|
end
|
||
|
|
||
|
function DBModel:getAll()
|
||
|
--local sql = "SELECT * FROM "..self.name
|
||
|
--return sqlite.select(self.db, self.name, "1=1")
|
||
|
local data = sqlite.select(self.db, self.name, "*", "1=1")
|
||
|
if data == nil then return nil end
|
||
|
local a = {}
|
||
|
for n in pairs(data) do table.insert(a, n) end
|
||
|
table.sort(a)
|
||
|
return data, a
|
||
|
end
|
||
|
|
||
|
function DBModel:find(cond)
|
||
|
local cnd = "1=1"
|
||
|
local sel = "*"
|
||
|
if cond.exp then
|
||
|
cnd = self:gencond(cond.exp)
|
||
|
end
|
||
|
if cond.order then
|
||
|
cnd = cnd.." ORDER BY "
|
||
|
local l = {}
|
||
|
local i = 1
|
||
|
for k,v in pairs(cond.order) do
|
||
|
l[i] = k.." "..v
|
||
|
i = i+1
|
||
|
end
|
||
|
cnd = cnd..table.concat(l, ",")
|
||
|
end
|
||
|
if cond.limit then
|
||
|
cnd = cnd.." LIMIT "..cond.limit
|
||
|
end
|
||
|
if cond.fields then
|
||
|
sel = table.concat(cond.fields, ",")
|
||
|
--print(sel)
|
||
|
end
|
||
|
--print(cnd)
|
||
|
local data = sqlite.select(self.db, self.name, sel, cnd)
|
||
|
if data == nil then return nil end
|
||
|
local a = {}
|
||
|
for n in pairs(data) do table.insert(a, n) end
|
||
|
table.sort(a)
|
||
|
return data, a
|
||
|
end
|
||
|
|
||
|
function DBModel:query(sql)
|
||
|
return sqlite.query(self.db, sql) == 1
|
||
|
end
|
||
|
|
||
|
function DBModel:update(m)
|
||
|
local id = m['id']
|
||
|
if id ~= nil then
|
||
|
local lst = {}
|
||
|
for k,v in pairs(m) do
|
||
|
if(type(v)== "number") then
|
||
|
table.insert(lst,k.."="..v)
|
||
|
elseif type(v) == "boolean" then
|
||
|
table.insert( lst, k.."="..(v and 1 or 0) )
|
||
|
else
|
||
|
table.insert(lst,k.."=\""..v:gsub('"', '""').."\"")
|
||
|
end
|
||
|
end
|
||
|
local sql = "UPDATE "..self.name.." SET "..table.concat(lst,",").." WHERE id="..id..";"
|
||
|
return sqlite.query(self.db, sql) == 1
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function DBModel:available()
|
||
|
return sqlite.hasTable(self.db, self.name) == 1
|
||
|
end
|
||
|
function DBModel:deleteByID(id)
|
||
|
local sql = "DELETE FROM "..self.name.." WHERE id="..id..";"
|
||
|
return sqlite.query(self.db, sql) == 1
|
||
|
end
|
||
|
function DBModel:gencond(o)
|
||
|
for k,v in pairs(o) do
|
||
|
if k == "and" or k == "or" then
|
||
|
local cnd = {}
|
||
|
local i = 1
|
||
|
for k1,v1 in pairs(v) do
|
||
|
cnd[i] = self:gencond(v1)
|
||
|
i = i + 1
|
||
|
end
|
||
|
return " ("..table.concat(cnd, " "..k.." ")..") "
|
||
|
else
|
||
|
for k1,v1 in pairs(v) do
|
||
|
local t = type(v1)
|
||
|
if(t == "string") then
|
||
|
return " ("..k1.." "..k..' "'..v1:gsub('"','""')..'") '
|
||
|
end
|
||
|
return " ("..k1.." "..k.." "..v1..") "
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
function DBModel:delete(cond)
|
||
|
local sql = "DELETE FROM "..self.name.." WHERE "..self:gencond(cond)..";"
|
||
|
return sqlite.query(self.db, sql) == 1
|
||
|
end
|
||
|
|
||
|
function DBModel:lastInsertID()
|
||
|
return sqlite.lastInsertID(self.db)
|
||
|
end
|
||
|
|
||
|
function DBModel:close()
|
||
|
if self.db then
|
||
|
sqlite.dbclose(self.db)
|
||
|
end
|
||
|
end
|
||
|
function DBModel:open()
|
||
|
if self.db ~= nil then
|
||
|
self.db = sqlite.getdb(self.db)
|
||
|
end
|
||
|
end
|