[Release]Mysql lib

Indította ATAG, 2012-10-19, 00:37:21

2012-10-19, 00:37:21 Utolsó szerkesztés: 2012-10-19, 00:55:27 Szerző: ATAG
Sok helyen hibásan szerepel az eredetileg általam szült sql lib, így ideje hogy hibátlanul is felkerüljön a fórumra:

db_user="mt2"
db_pass="mt2"
db_host="localhost"

function mysql_select(query,notselect)
    local tmp=number(11111111,99999999)
os.execute('mysql -h '..db_host..' -u '..db_user..' -p'..db_pass..' -N -e '..string.format("%q",query)..' 2>&1 > /tmp/'..tmp)

if not notselect then
local res,i={},1
local f,e=io.open("/tmp/"..tmp)
if f then
local line=f:read("*l")
while line do
res[i]={}
string.gsub(line,"([^\t]+)\t*", function(s)
table.insert(res[i],s)
end)
i=i+1
line=f:read("*l")
end
f:close()
os.execute("rm /tmp/"..tmp)
end
return res
end
end

function mysql_notselect(query)
return mysql_select(query,true)
end

mysql_query = mysql_select


questlib.lua végére érdemes beszúrni, megadni a mysql adatokat (db_user, db_pass, db_host) és már lehet is örülni. Az eredményeket egy tömbben adja vissza.

Példa a használatra:

local rows = mysql_query("SELECT * FROM test.test")
for i, v in ipairs(rows) do
print(table.concat(v,"\t"))
end
end


Hanashi mysql megoldásával is kompatibilis KIVÉVE hogy nincs hibaüzenet probléma esetén ÉS hogy ez mindent stringben ad vissza, így a típusokra oda kell figyelni a questben. Pl relációban nem szereti a Lua a stringeket :)




A másik (az elterjedt) megoldás, ami nem tömbben adja vissza az eredményt, hanem egy iterátorként. Hátránya, hogy csak 1 változó szerepelhet a select-ben, vagy utána magunknak kell gondoskodni az adatok feldolgozásáról.

db_user="mt2"
db_pass="mt2"
db_host="localhost"

function mysql_query(text)
            local tmp=number(11111111,99999999)
            os.execute('mysql h '..db_host..' -u '..db_user..' -p'..db_pass..' -N -e '..text..' 2>&1 > /tmp/'..tmp)
            local f,e=io.open("/tmp/"..tmp)
            if f then
                return function()
                    local l=f:read("*l")
                    if l then
                        return l
                    else
                        f:close()
                        os.execute("rm /tmp/"..tmp)
                    end
                end
            else
                return nil, e
            end
        end


Ha csak insert/update kell, akkor tökéletes megoldás ez is...




quest_functions-ba ezek kellenek (már ami nem szerepel eddig):

mysql_select
mysql_notselect
mysql_query
io.open
string.gsub
table.insert
read
close



Eredeti post
ATAG