C/C++ mysql模組匯出函式供lua使用
阿新 • • 發佈:2018-12-18
因為lua是指令碼語言,所以在處理IO和高密度計算的時候效率會低,通常就會把這類高計算函式用C/C++編寫匯出給lua使用,這裡是使用tolua++來實現的
tolua++需要引用的標頭檔案
#ifdef __cplusplus
extern "C"{
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif
#include "tolua_fix.h"
C/C++匯出模組通過register函式呼叫tolua++把C/C++函式匯出到lua中使用,tolua_module和tolua_beginmodule中的mysql_wrapper是匯出的模組名稱,tolua_function引數二是匯出的函式名稱,引數三是C/C++函式,lua中執行引數二的名稱就會呼叫引數三的C/C++函式
int register_mysql_export(lua_State* toLua_S){ lua_getglobal(toLua_S, "_G"); if (lua_istable(toLua_S, -1)){ tolua_open(toLua_S); tolua_module(toLua_S, "mysql_wrapper", 0); tolua_beginmodule(toLua_S, "mysql_wrapper"); tolua_function(toLua_S, "connect", lua_mysql_connect); tolua_function(toLua_S, "close", lua_mysql_close); tolua_function(toLua_S, "query", lua_mysql_query); tolua_endmodule(toLua_S); } lua_pop(toLua_S, 1); return 0; }
當lua呼叫tolua++匯出的函式mysql_wrapper.connect會把引數壓入到lua棧中
function mysql_callback(err,context)
if(err) then
print(err)
return
end
print("connect success");
end
mysql_wrapper.connect("127.0.0.1", 3306, "class_sql", "root", "mima1234",mysql_callback);
C/C++函式就會執行tolua++匯出的函式lua_mysql_connect,C/C++函式呼叫mysql_wrapper::connect後,會執行回撥函式on_lua_mysql_open_cb,然後通過lua_wrapper執行lua檔案中的回撥函式mysql_callback
static void on_lua_mysql_open_cb(const char* err, void* context, void* udata){
//udata就是handler
if (err){
lua_pushstring(lua_wrapper::lua_state(), err);
lua_pushnil(lua_wrapper::lua_state());
}
else{
lua_pushnil(lua_wrapper::lua_state());
tolua_pushuserdata(lua_wrapper::lua_state(), context);
}
lua_wrapper::execute_script_handler((int)udata, 2);
lua_wrapper::remove_script_handler((int)udata);
}
static int lua_mysql_connect(lua_State* toLua_S){
char* ip = (char*)tolua_tostring(toLua_S, 1, NULL);
if (ip == NULL){
goto lua_failed;
}
int port = (int)tolua_tonumber(toLua_S, 2, NULL);
if (port == NULL){
goto lua_failed;
}
char* db_name = (char*)tolua_tostring(toLua_S, 3, NULL);
if (db_name == NULL){
goto lua_failed;
}
char* uname = (char*)tolua_tostring(toLua_S, 4, NULL);
if (uname == NULL){
goto lua_failed;
}
char* upwd = (char*)tolua_tostring(toLua_S, 5, NULL);
if (upwd == NULL){
goto lua_failed;
}
//lua檔案裡面的function儲存到tolua++的表中
int handler = toluafix_ref_function(toLua_S, 6, NULL);
if (handler == 0){
goto lua_failed;
}
mysql_wrapper::connect(ip, port, db_name, uname, upwd, on_lua_mysql_open_cb, (void*)handler);
lua_failed:
return 0;
}