mirror of
https://github.com/MinetestForFun/mysql_base.git
synced 2025-06-30 15:30:34 +02:00
Add SQL abstraction layer
This commit is contained in:
102
abstraction.lua
Normal file
102
abstraction.lua
Normal file
@ -0,0 +1,102 @@
|
||||
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
|
Reference in New Issue
Block a user