205 lines
6.0 KiB
Lua
205 lines
6.0 KiB
Lua
|
|
local skynet = require "skynet"
|
||
|
|
local mysql = require "skynet.db.mysql"
|
||
|
|
|
||
|
|
local function dump(obj)
|
||
|
|
local getIndent, quoteStr, wrapKey, wrapVal, dumpObj
|
||
|
|
getIndent = function(level)
|
||
|
|
return string.rep("\t", level)
|
||
|
|
end
|
||
|
|
quoteStr = function(str)
|
||
|
|
return '"' .. string.gsub(str, '"', '\\"') .. '"'
|
||
|
|
end
|
||
|
|
wrapKey = function(val)
|
||
|
|
if type(val) == "number" then
|
||
|
|
return "[" .. val .. "]"
|
||
|
|
elseif type(val) == "string" then
|
||
|
|
return "[" .. quoteStr(val) .. "]"
|
||
|
|
else
|
||
|
|
return "[" .. tostring(val) .. "]"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
wrapVal = function(val, level)
|
||
|
|
if type(val) == "table" then
|
||
|
|
return dumpObj(val, level)
|
||
|
|
elseif type(val) == "number" then
|
||
|
|
return val
|
||
|
|
elseif type(val) == "string" then
|
||
|
|
return quoteStr(val)
|
||
|
|
else
|
||
|
|
return tostring(val)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
dumpObj = function(obj, level)
|
||
|
|
if type(obj) ~= "table" then
|
||
|
|
return wrapVal(obj)
|
||
|
|
end
|
||
|
|
level = level + 1
|
||
|
|
local tokens = {}
|
||
|
|
tokens[#tokens + 1] = "{"
|
||
|
|
for k, v in pairs(obj) do
|
||
|
|
tokens[#tokens + 1] = getIndent(level) .. wrapKey(k) .. " = " .. wrapVal(v, level) .. ","
|
||
|
|
end
|
||
|
|
tokens[#tokens + 1] = getIndent(level - 1) .. "}"
|
||
|
|
return table.concat(tokens, "\n")
|
||
|
|
end
|
||
|
|
return dumpObj(obj, 0)
|
||
|
|
end
|
||
|
|
|
||
|
|
local function test2( db)
|
||
|
|
local i=1
|
||
|
|
while true do
|
||
|
|
local res = db:query("select * from cats order by id asc")
|
||
|
|
print ( "test2 loop times=" ,i,"\n","query result=",dump( res ) )
|
||
|
|
res = db:query("select * from cats order by id asc")
|
||
|
|
print ( "test2 loop times=" ,i,"\n","query result=",dump( res ) )
|
||
|
|
|
||
|
|
skynet.sleep(1000)
|
||
|
|
i=i+1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local function test3( db)
|
||
|
|
local i=1
|
||
|
|
while true do
|
||
|
|
local res = db:query("select * from cats order by id asc")
|
||
|
|
print ( "test3 loop times=" ,i,"\n","query result=",dump( res ) )
|
||
|
|
res = db:query("select * from cats order by id asc")
|
||
|
|
print ( "test3 loop times=" ,i,"\n","query result=",dump( res ) )
|
||
|
|
skynet.sleep(1000)
|
||
|
|
i=i+1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local function test4( db)
|
||
|
|
local stmt = db:prepare("SELECT * FROM cats WHERE name=?")
|
||
|
|
print ( "test4 prepare result=",dump( stmt ) )
|
||
|
|
local res = db:execute(stmt,'Bob')
|
||
|
|
print ( "test4 query result=",dump( res ) )
|
||
|
|
db:stmt_close(stmt)
|
||
|
|
end
|
||
|
|
|
||
|
|
-- 测试存储过程和blob读写
|
||
|
|
local function test_sp_blob(db)
|
||
|
|
print("test stored procedure")
|
||
|
|
-- 创建测试表
|
||
|
|
db:query "DROP TABLE IF EXISTS `test`"
|
||
|
|
db:query [[
|
||
|
|
CREATE TABLE `test` (
|
||
|
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||
|
|
`str` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL,
|
||
|
|
`dt` timestamp NULL DEFAULT NULL,
|
||
|
|
`flt` double DEFAULT NULL,
|
||
|
|
`blb` mediumblob,
|
||
|
|
`num` int(11) DEFAULT NULL,
|
||
|
|
PRIMARY KEY (`id`),
|
||
|
|
UNIQUE KEY `id_UNIQUE` (`id`)
|
||
|
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
||
|
|
]]
|
||
|
|
-- 创建测试存储过程
|
||
|
|
db:query "DROP PROCEDURE IF EXISTS `get_test`"
|
||
|
|
db:query [[
|
||
|
|
CREATE PROCEDURE `get_test`(IN p_id int)
|
||
|
|
BEGIN
|
||
|
|
select * from test where id=p_id;
|
||
|
|
END
|
||
|
|
]]
|
||
|
|
local stmt_insert = db:prepare("INSERT test (str,dt,flt,num,blb) VALUES (?,?,?,?,?)")
|
||
|
|
local stmt_csp = db:prepare("call get_test(?)")
|
||
|
|
local test_blob = string.char(0xFF,0x8F,0x03,0x04,0x0a,0x0b,0x0d,0x0e,0x10,0x20,0x30,0x40)
|
||
|
|
|
||
|
|
local r = db:execute(stmt_insert,'test_str','2020-3-20 15:30:40',3.1415,89,test_blob)
|
||
|
|
print("insert result : insert_id",r.insert_id,"affected_rows",r.affected_rows
|
||
|
|
,"server_status",r.server_status,"warning_count",r.warning_count)
|
||
|
|
|
||
|
|
r = db:execute(stmt_csp,1)
|
||
|
|
local rs = r[1][1]
|
||
|
|
print("call get_test() result : str",rs.str,"dt",rs.dt,"flt",rs.flt,"num",rs.num
|
||
|
|
,"blb len",#rs.blb,"equal",test_blob==rs.blb)
|
||
|
|
|
||
|
|
print("test stored procedure ok")
|
||
|
|
end
|
||
|
|
|
||
|
|
local function test_signed(db)
|
||
|
|
local res = db:query("drop table if exists test_i_u")
|
||
|
|
res = db:query("create table test_i_u (i tinyint primary key, u tinyint unsigned)")
|
||
|
|
print(dump(res))
|
||
|
|
|
||
|
|
res = db:query("insert into test_i_u (i,u) values (-1,1),(127,128),(-127,255)")
|
||
|
|
print(dump(res))
|
||
|
|
|
||
|
|
local prep = "SELECT * FROM test_i_u"
|
||
|
|
local stmt = db:prepare(prep)
|
||
|
|
local res = db:execute(stmt)
|
||
|
|
print("test_i_u: ", dump(res))
|
||
|
|
db:stmt_close(stmt)
|
||
|
|
end
|
||
|
|
|
||
|
|
skynet.start(function()
|
||
|
|
local function on_connect(db)
|
||
|
|
db:query("set charset utf8mb4");
|
||
|
|
end
|
||
|
|
local db=mysql.connect({
|
||
|
|
host="172.16.2.122",
|
||
|
|
port=3306,
|
||
|
|
database="fishing",
|
||
|
|
user="root",
|
||
|
|
password="Mcg!2345",
|
||
|
|
charset="utf8mb4",
|
||
|
|
max_packet_size = 1024 * 1024,
|
||
|
|
on_connect = on_connect
|
||
|
|
})
|
||
|
|
if not db then
|
||
|
|
print("failed to connect")
|
||
|
|
end
|
||
|
|
print("testmysql success to connect to mysql server")
|
||
|
|
|
||
|
|
|
||
|
|
local res = db:query("drop table if exists cats")
|
||
|
|
res = db:query("create table cats "
|
||
|
|
.."(id serial primary key, ".. "name varchar(5))")
|
||
|
|
print( dump( res ) )
|
||
|
|
|
||
|
|
res = db:query("insert into cats (name) "
|
||
|
|
.. "values (\'Bob\'),(\'\'),(null)")
|
||
|
|
print ( dump( res ) )
|
||
|
|
|
||
|
|
res = db:query("select * from cats order by id asc")
|
||
|
|
print ( dump( res ) )
|
||
|
|
if true then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
-- 测试存储过程和二进制blob
|
||
|
|
test_sp_blob(db)
|
||
|
|
|
||
|
|
test_signed(db)
|
||
|
|
|
||
|
|
-- test in another coroutine
|
||
|
|
skynet.fork( test2, db)
|
||
|
|
skynet.fork( test3, db)
|
||
|
|
skynet.fork( test4, db)
|
||
|
|
-- multiresultset test
|
||
|
|
res = db:query("select * from cats order by id asc ; select * from cats")
|
||
|
|
print ("multiresultset test result=", dump( res ) )
|
||
|
|
|
||
|
|
print ("escape string test result=", mysql.quote_sql_str([[\mysql escape %string test'test"]]) )
|
||
|
|
|
||
|
|
-- bad sql statement
|
||
|
|
local res = db:query("select * from notexisttable" )
|
||
|
|
print( "bad query test result=" ,dump(res) )
|
||
|
|
|
||
|
|
local i=1
|
||
|
|
while true do
|
||
|
|
local res = db:query("select * from cats order by id asc")
|
||
|
|
print ( "test1 loop times=" ,i,"\n","query result=",dump( res ) )
|
||
|
|
|
||
|
|
res = db:query("select * from cats order by id asc")
|
||
|
|
print ( "test1 loop times=" ,i,"\n","query result=",dump( res ) )
|
||
|
|
|
||
|
|
|
||
|
|
skynet.sleep(1000)
|
||
|
|
i=i+1
|
||
|
|
end
|
||
|
|
|
||
|
|
--db:disconnect()
|
||
|
|
--skynet.exit()
|
||
|
|
end)
|
||
|
|
|