lua-resty-tarantool icon indicating copy to clipboard operation
lua-resty-tarantool copied to clipboard

Tarantool SQL

Open alexz006 opened this issue 6 years ago • 0 comments

tarantool.lua:

function M.exec(self, q, args)
	q = q:gsub("'%?'", '?'):gsub('"%?"', '?'):gsub("'", "\\'")
	
	if args then
		local replacements = { ['\0'] = '\\0', ['\\'] = '\\\\', ["'"]  = "\\'\\'", ["%"]  = "%%" }
		if type(args) == 'table' then
			for i, arg in pairs(args) do
				arg = arg:gsub('?', '_________')
				arg = arg:gsub('[\'\\%z%%]', replacements)
				q = q:gsub('?', "\\'"..arg.."\\'", 1)
			end
		else
			args = args:gsub('?', '_________')
			args = args:gsub('[\'\\%z%%]', replacements)
			q = q:gsub('?', "\\'"..args.."\\'", 1)
		end
		q = q:gsub('_________', '?')
	end
	
	local eval, err = M.eval(self, "return box.execute('"..q.."')", {})
	if err then
		return nil, err
	end
	if eval[1] then
		return eval[1].row_count or eval[1].rows, nil
	end
	if eval[1]==nil and eval[2] then
		return nil, eval[2]
	end
	return eval, nil
end

how to use:

local res, err = tar:exec('CREATE TABLE tester (s1 INT PRIMARY KEY, s2 VARCHAR(6))')
local res, err = tar:exec('INSERT INTO tester VALUES (?,?)', {100, 'QWERTY'})
local res, err = tar:exec('SELECT * FROM tester WHERE s1=100')
local res, err = tar:exec('SELECT * FROM tester WHERE s1=?', 100)
local res, err = tar:exec('SELECT * FROM tester WHERE s1=? AND s2=?', {100, 'QWERTY'})

alexz006 avatar Jan 16 '20 19:01 alexz006