103 lines
3.4 KiB
Lua
103 lines
3.4 KiB
Lua
|
local modname = minetest.get_current_modname()
|
||
|
|
||
|
local thismod = _G[modname]
|
||
|
|
||
|
---- Table creation & deletion
|
||
|
|
||
|
function thismod.create_table_sql(name, params)
|
||
|
local lines = {}
|
||
|
for _, coldata in ipairs(params.columns) do
|
||
|
local line = (coldata.name or coldata[1]) .. ' ' .. (coldata.type or coldata[2])
|
||
|
if coldata.notnull then
|
||
|
line = line .. ' NOT NULL'
|
||
|
end
|
||
|
if coldata.autoincrement then
|
||
|
line = line .. ' AUTO_INCREMENT'
|
||
|
end
|
||
|
table.insert(lines, line)
|
||
|
end
|
||
|
table.insert(lines, 'PRIMARY KEY (' .. table.concat(params.pkey, ',') .. ')')
|
||
|
for fkeyname, fkeydata in pairs(params.fkeys or {}) do
|
||
|
table.insert(lines, 'FOREIGN KEY (' .. fkeyname .. ') REFERENCES ' .. fkeydata.table ..
|
||
|
'(' .. fkeydata.column .. ')')
|
||
|
end
|
||
|
for _, ucol in pairs(params.unique or {}) do
|
||
|
if type(ucol) == 'table' then
|
||
|
table.insert(lines, 'UNIQUE (' .. table.concat(ucol, ',') .. ')')
|
||
|
else
|
||
|
table.insert(lines, 'UNIQUE (' .. ucol .. ')')
|
||
|
end
|
||
|
end
|
||
|
return 'CREATE TABLE ' .. name .. ' (' .. table.concat(lines, ',') .. ')'
|
||
|
end
|
||
|
function thismod.create_table(name, params)
|
||
|
thismod.conn:query(thismod.create_table_sql(name, params))
|
||
|
end
|
||
|
|
||
|
function thismod.drop_table_sql(name)
|
||
|
return 'DROP TABLE ' .. name
|
||
|
end
|
||
|
function thismod.drop_table(name)
|
||
|
thismod.conn:query(thismod.drop_table_sql(name))
|
||
|
end
|
||
|
|
||
|
---- INSERT prepare
|
||
|
|
||
|
function thismod.prepare_insert_sql(tablename, colnames)
|
||
|
local qmarks = {}
|
||
|
for i = 1, #colnames do
|
||
|
qmarks[i] = '?'
|
||
|
end
|
||
|
return 'INSERT INTO ' .. tablename .. '(' .. table.concat(colnames, ',') .. ') VALUES (' ..
|
||
|
table.concat(qmarks, ',') .. ')'
|
||
|
end
|
||
|
function thismod.prepare_insert(tablename, cols)
|
||
|
local colnames, coltypes = {}, {}
|
||
|
for _, col in ipairs(cols) do
|
||
|
table.insert(colnames, col.name or col[1])
|
||
|
table.insert(coltypes, col.type or col[2])
|
||
|
end
|
||
|
local stmt = thismod.conn:prepare(thismod.prepare_insert_sql(tablename, colnames))
|
||
|
return stmt, stmt:bind_params(coltypes)
|
||
|
end
|
||
|
|
||
|
---- UPDATE prepare
|
||
|
|
||
|
function thismod.prepare_update_sql(tablename, colnames, where)
|
||
|
return 'UPDATE ' .. tablename .. ' SET ' .. table.concat(colnames, ',') .. ' WHERE ' .. where
|
||
|
end
|
||
|
function thismod.prepare_update(tablename, cols, where, wheretypes)
|
||
|
local colnames, paramtypes = {}, {}
|
||
|
for _, col in ipairs(cols) do
|
||
|
table.insert(colnames, (col.name or col[1]) .. '=?')
|
||
|
table.insert(paramtypes, col.type or col[2])
|
||
|
end
|
||
|
for _, wheretype in ipairs(wheretypes) do
|
||
|
table.insert(paramtypes, wheretype)
|
||
|
end
|
||
|
local stmt = thismod.conn:prepare(thismod.prepare_update_sql(tablename, colnames, where))
|
||
|
return stmt, stmt:bind_params(paramtypes)
|
||
|
end
|
||
|
|
||
|
---- DELETE prepare
|
||
|
|
||
|
function thismod.prepare_delete(tablename, where, wheretypes)
|
||
|
local stmt = thismod.conn:prepare('DELETE FROM ' .. tablename .. ' WHERE ' .. where)
|
||
|
return stmt, stmt:bind_params(wheretypes)
|
||
|
end
|
||
|
|
||
|
---- SELECT prepare
|
||
|
|
||
|
function thismod.prepare_select_sql(tablename, colnames, where)
|
||
|
return 'SELECT ' .. table.concat(colnames, ',') .. ' FROM ' .. tablename .. ' WHERE ' .. where
|
||
|
end
|
||
|
function thismod.prepare_select(tablename, cols, where, wheretypes)
|
||
|
local colnames, coltypes = {}, {}
|
||
|
for _, col in ipairs(cols) do
|
||
|
table.insert(colnames, col.name or col[1])
|
||
|
table.insert(coltypes, col.type or col[2])
|
||
|
end
|
||
|
local stmt = thismod.conn:prepare(thismod.prepare_select_sql(tablename, colnames, where))
|
||
|
return stmt, stmt:bind_params(wheretypes), stmt:bind_result(coltypes)
|
||
|
end
|