1. 程式人生 > >C/C++ mysql模組匯出函式供lua使用

C/C++ mysql模組匯出函式供lua使用

因為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;
}