108 lines
3.5 KiB
Lua
108 lines
3.5 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.default then
|
|
line = line .. ' DEFAULT ' .. coldata.default
|
|
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]) .. '=' .. (col.value or '?'))
|
|
if col.type or col[2] then
|
|
table.insert(paramtypes, col.type or col[2])
|
|
end
|
|
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
|