void redis_command_cb(redisconn_t conn,struct redisReply* reply,void *pridata) { luaRef_t *cbObj = (luaRef_t*)pridata; const char * error; //callback,self,error,result if(!reply){ if((error = push_obj_callback(cbObj->L,"srsp","__callback",*cbObj,"unknow error",NULL))){ SYS_LOG(LOG_ERROR,"error on redis_command_cb:%s\n",error); } } else if(reply->type == REDIS_REPLY_NIL){ if((error = push_obj_callback(cbObj->L,"srpp","__callback",*cbObj,NULL,NULL))){ SYS_LOG(LOG_ERROR,"error on redis_command_cb:%s\n",error); } }else if(reply->type == REDIS_REPLY_ERROR){ if((error = push_obj_callback(cbObj->L,"srsp","__callback",*cbObj,reply->str,NULL))){ SYS_LOG(LOG_ERROR,"error on redis_command_cb:%s\n",error); } }else{ stPushResultSet st; st.reply = reply; st.base.Push = PushResultSet; if((error = push_obj_callback(cbObj->L,"srsf","__callback",*cbObj,NULL,&st))){ SYS_LOG(LOG_ERROR,"error on redis_command_cb:%s\n",error); } } release_luaRef(cbObj); free(cbObj); }
static int lua_destroy_aoi_obj(lua_State *L){ aoi_object* o = lua_touserdata(L,1); if(o->map) aoi_leave(o); del_bitset(o->view_objs); release_luaRef((luaRef_t*)o->ud); free(o->ud); free(o); return 0; }
static void cb_disconnected(redisconn_t conn,void *ud){ luaRef_t *cbObj = (luaRef_t*)ud; const char *error = push_obj_callback(cbObj->L,"sr","__on_disconnected",*cbObj); if(error){ SYS_LOG(LOG_ERROR,"error on __on_disconnected:%s\n",error); } release_luaRef(cbObj); free(cbObj); }
static void cb_connect(redisconn_t conn,int err,void *ud){ luaRef_t *cbObj = (luaRef_t*)ud; const char *e = errmsg[err == 0 ? 0:1]; const char *error = push_obj_callback(cbObj->L,"srps","__cb_connect",*cbObj,conn,e); if(error) SYS_LOG(LOG_ERROR,"error on lua redis __cb_connect:%s\n",error); if(error || e){ release_luaRef(cbObj); free(cbObj); } }
int lua_redis_connect(lua_State *L){ const char *ip = lua_tostring(L,1); uint16_t port = (uint16_t)lua_tointeger(L,2); luaRef_t *cbObj = calloc(1,sizeof(*cbObj)); *cbObj = toluaRef(L,3); int ret = kn_redisAsynConnect(g_engine,ip,port,cb_connect,cb_disconnected,(void*)cbObj); if(ret != 0){ release_luaRef(cbObj); free(cbObj); lua_pushstring(L,"connect to redis error"); }else lua_pushnil(L); return 1; }
int lua_redisCommandSync(lua_State *L){ redisconn_t conn = lua_touserdata(L,1); const char *cmd = lua_tostring(L,2); do{ if(!cmd || strcmp(cmd,"") == 0){ lua_pushboolean(L,0); break; } luaRef_t *cbObj = calloc(1,sizeof(*cbObj)); *cbObj = toluaRef(L,3); if(REDIS_OK!= kn_redisCommand(conn,cmd,redis_command_cb,cbObj)){ release_luaRef(cbObj); free(cbObj); lua_pushboolean(L,0); }else lua_pushboolean(L,1); }while(0); return 1; }
int main(int argc,char **argv){ if(argc < 2){ printf("usage testlua luafile\n"); return 0; } lua_State *L = luaL_newstate(); luaL_openlibs(L); if (luaL_dofile(L,argv[1])) { const char * error = lua_tostring(L, -1); lua_pop(L,1); printf("%s\n",error); } const char *err; printf("------makeLuaObjByStr---------\n\n"); //dynamic build a lua table and return luaRef tabRef = makeLuaObjByStr(L,"return {a=100}"); if(tabRef.L){ int a = 0; err = LuaRef_Get(tabRef,"si","a",&a); if(err) printf("%s\n",err); else{ printf("a == %d\n",a); } release_luaRef(&tabRef); } printf("------call 0 arg---------\n\n"); err = LuaCall(L,"fun0",NULL); if(err) printf("error on fun0:%s\n",err); printf("------call 2 arg(integer,str),1 ret(integer)---------\n\n"); unsigned int iret1; err = LuaCall(L,"fun1","is:i",0xfffffffff,"hello",&iret1); if(err) printf("error on fun1:%s\n",err); else printf("ret1=%u\n",iret1); printf("------call 2 arg(str),1 ret(str)---------\n\n"); char *sret1; err = LuaCall(L,"fun2","ss:s","hello","kenny",&sret1); if(err) printf("error on fun2:%s\n",err); else printf("sret1=%s\n",sret1); printf("------call 3 arg(str,str,lua str),2 ret(lua str)---------\n\n"); char *Sret1,*Sret2; size_t Lret1,Lret2; err = LuaCall(L,"fun3","ssS:SS","1","2","3",sizeof("3"),&Sret1,&Lret1,&Sret2,&Lret2); if(err) printf("error on fun3:%s\n",err); else{ printf("%s %ld\n",Sret1,Lret1); printf("%s %ld\n",Sret2,Lret2); } printf("------call 0 arg, 1 ret(luaobj)---------\n\n"); luaRef funRef; err = LuaCall(L,"fun5",":r",&funRef); if(err) printf("error on fun5:%s\n",err); int num = -1; int num2 = -1; LuaCallRefFunc(funRef,":ii",&num,&num2); printf("%d,%d\n",num,num2); printf("------call lua obj function---------\n\n"); err = LuaCall(L,"fun6",":ri",&tabRef,&num); if(err) printf("error on fun6:%s\n",err); printf("%d\n",num); err = LuaCallTabFuncS(tabRef,"hello",NULL); if(err) printf("%s\n",err); printf("------set and get luaobj field---------\n\n"); err = LuaRef_Set(tabRef,"siss","f1",99,"f2","hello haha"); if(err) printf("%s\n",err); else{ int f1; const char *f2; err = LuaRef_Get(tabRef,"siss","f1",&f1,"f2",&f2); if(err) printf("%s\n",err); else printf("get %d,%s\n",f1,f2); } err = LuaRef_Set(tabRef,"sp","f1",NULL); if(err) printf("%s\n",err); else{ err = LuaCall(L,"fun7",NULL); if(err) printf("error on fun7:%s\n",err); } printf("------iterate luaobj-------------\n\n"); lua_getglobal(L,"ttab4"); tabRef = toluaRef(L,-1); LuaTabForEach(tabRef){ const char *key = lua_tostring(L,EnumKey); const char *val = lua_tostring(L,EnumVal); printf("%s,%s\n",key,val); } printf("end\n"); return 0; }
static void destroy_luasocket(void *_){ luasocket_t lsock = (luasocket_t)_; release_luaRef(&lsock->luaObj); free(lsock); }