Procházet zdrojové kódy

app_lua: added registrar API to Lua

Daniel-Constantin Mierla před 15 roky
rodič
revize
36f053fd2c
1 změnil soubory, kde provedl 128 přidání a 14 odebrání
  1. 128 14
      modules/app_lua/app_lua_exp.c

+ 128 - 14
modules/app_lua/app_lua_exp.c

@@ -37,16 +37,18 @@
 #include "../../modules/auth/api.h"
 #include "../../modules_k/auth_db/api.h"
 #include "../../modules_k/maxfwd/api.h"
+#include "../../modules_k/registrar/api.h"
 
 #include "app_lua_api.h"
 
-#define SR_LUA_EXP_MOD_SL       (1<<0)
-#define SR_LUA_EXP_MOD_TM       (1<<1)
-#define SR_LUA_EXP_MOD_SQLOPS   (1<<2)
-#define SR_LUA_EXP_MOD_RR       (1<<3)
-#define SR_LUA_EXP_MOD_AUTH     (1<<4)
-#define SR_LUA_EXP_MOD_AUTH_DB  (1<<5)
-#define SR_LUA_EXP_MOD_MAXFWD   (1<<6)
+#define SR_LUA_EXP_MOD_SL         (1<<0)
+#define SR_LUA_EXP_MOD_TM         (1<<1)
+#define SR_LUA_EXP_MOD_SQLOPS     (1<<2)
+#define SR_LUA_EXP_MOD_RR         (1<<3)
+#define SR_LUA_EXP_MOD_AUTH       (1<<4)
+#define SR_LUA_EXP_MOD_AUTH_DB    (1<<5)
+#define SR_LUA_EXP_MOD_MAXFWD     (1<<6)
+#define SR_LUA_EXP_MOD_REGISTRAR  (1<<7)
 
 /**
  *
@@ -68,6 +70,11 @@ static auth_db_api_t _lua_auth_dbb;
  */
 static maxfwd_api_t _lua_maxfwdb;
 
+/**
+ * registrar
+ */
+static registrar_api_t _lua_registrarb;
+
 /**
  * rr
  */
@@ -791,6 +798,98 @@ static const luaL_reg _sr_maxfwd_Map [] = {
 	{NULL, NULL}
 };
 
+
+/**
+ *
+ */
+static int lua_sr_registrar_save(lua_State *L)
+{
+	int ret;
+	int flags;
+	char *table;
+	sr_lua_env_t *env_L;
+
+	flags = 0;
+	env_L = sr_lua_env_get();
+
+	if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_MAXFWD))
+	{
+		LM_WARN("weird: maxfwd function executed but module not registered\n");
+		return app_lua_return_false(L);
+	}
+	if(env_L->msg!=NULL)
+	{
+		LM_WARN("invalid parameters from Lua env\n");
+		return app_lua_return_false(L);
+	}
+	if(lua_gettop(L)==1)
+	{
+		table  = (char*)lua_tostring(L, -1);
+	} else if(lua_gettop(L)==2) {
+		table  = (char*)lua_tostring(L, -2);
+		flags = lua_tointeger(L, -1);
+	} else {
+		LM_WARN("invalid number of parameters from Lua\n");
+		return app_lua_return_false(L);
+	}
+	if(table==NULL || strlen(table)==0)
+	{
+		LM_WARN("invalid parameters from Lua\n");
+		return app_lua_return_false(L);
+	}
+	ret = _lua_registrarb.save(env_L->msg, table, flags);
+
+	return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static int lua_sr_registrar_lookup(lua_State *L)
+{
+	int ret;
+	char *table;
+	sr_lua_env_t *env_L;
+
+	env_L = sr_lua_env_get();
+
+	if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_MAXFWD))
+	{
+		LM_WARN("weird: maxfwd function executed but module not registered\n");
+		return app_lua_return_false(L);
+	}
+	if(env_L->msg!=NULL)
+	{
+		LM_WARN("invalid parameters from Lua env\n");
+		return app_lua_return_false(L);
+	}
+	if(lua_gettop(L)!=1)
+	{
+		LM_WARN("invalid number of parameters from Lua\n");
+		return app_lua_return_false(L);
+	}
+	table  = (char*)lua_tostring(L, -1);
+	if(table==NULL || strlen(table)==0)
+	{
+		LM_WARN("invalid parameters from Lua\n");
+		return app_lua_return_false(L);
+	}
+	ret = _lua_registrarb.lookup(env_L->msg, table);
+
+	return app_lua_return_int(L, ret);
+}
+
+
+/**
+ *
+ */
+static const luaL_reg _sr_registrar_Map [] = {
+	{"save",      lua_sr_registrar_save},
+	{"lookup",    lua_sr_registrar_lookup},
+	{NULL, NULL}
+};
+
+
 /**
  *
  */
@@ -865,6 +964,16 @@ int lua_sr_exp_init_mod(void)
 		}
 		LM_DBG("loaded maxfwd api\n");
 	}
+	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_REGISTRAR)
+	{
+		/* bind the REGISTRAR API */
+		if (registrar_load_api(&_lua_registrarb) < 0)
+		{
+			LM_ERR("cannot bind to REGISTRAR API\n");
+			return -1;
+		}
+		LM_DBG("loaded registrar api\n");
+	}
 	return 0;
 }
 
@@ -899,6 +1008,9 @@ int lua_sr_exp_register_mod(char *mname)
 	} else 	if(len==6 && strcmp(mname, "maxfwd")==0) {
 		_sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_MAXFWD;
 		return 0;
+	} else 	if(len==9 && strcmp(mname, "registrar")==0) {
+		_sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_REGISTRAR;
+		return 0;
 	}
 
 	return -1;
@@ -910,18 +1022,20 @@ int lua_sr_exp_register_mod(char *mname)
 void lua_sr_exp_openlibs(lua_State *L)
 {
 	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SL)
-		luaL_openlib(L, "sr.sl",      _sr_sl_Map,       0);
+		luaL_openlib(L, "sr.sl",         _sr_sl_Map,          0);
 	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TM)
-		luaL_openlib(L, "sr.tm",      _sr_tm_Map,       0);
+		luaL_openlib(L, "sr.tm",         _sr_tm_Map,          0);
 	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SQLOPS)
-		luaL_openlib(L, "sr.sqlops",  _sr_sqlops_Map,   0);
+		luaL_openlib(L, "sr.sqlops",     _sr_sqlops_Map,      0);
 	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RR)
-		luaL_openlib(L, "sr.rr",      _sr_rr_Map,       0);
+		luaL_openlib(L, "sr.rr",         _sr_rr_Map,          0);
 	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_AUTH)
-		luaL_openlib(L, "sr.auth",    _sr_auth_Map,     0);
+		luaL_openlib(L, "sr.auth",       _sr_auth_Map,        0);
 	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_AUTH_DB)
-		luaL_openlib(L, "sr.auth_db", _sr_auth_db_Map,  0);
+		luaL_openlib(L, "sr.auth_db",    _sr_auth_db_Map,     0);
 	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_MAXFWD)
-		luaL_openlib(L, "sr.maxfwd",  _sr_maxfwd_Map,   0);
+		luaL_openlib(L, "sr.maxfwd",     _sr_maxfwd_Map,      0);
+	if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_REGISTRAR)
+		luaL_openlib(L, "sr.registrar",  _sr_registrar_Map,   0);
 }