Revision
16979
Author
nazim
Date
2010-03-12 17:06:36 -0600 (Fri, 12 Mar 2010)

Log Message

Luaexec improvements

Modified Paths

Diff

Modified: freeswitch/trunk/contrib/nazim/xmlcdrd/conf/test.lua (16978 => 16979)


--- freeswitch/trunk/contrib/nazim/xmlcdrd/conf/test.lua	2010-03-12 22:11:43 UTC (rev 16978)
+++ freeswitch/trunk/contrib/nazim/xmlcdrd/conf/test.lua	2010-03-12 23:06:36 UTC (rev 16979)
@@ -1,18 +1,34 @@
---print(xcdr_varget("uuid"), xcdr_varget("billsec"), xcdr_varget("uuid") )
+--  Lua script _must_ provide three functions:
+--  luaexec_init()
+--  luaexec_free()
+--  luaexec_man()
+--  Functions listed above can be empty, but they must exist for successful run.
 
-uuid = xcdr_varget("uuid")
-billsec = xcdr_varget("billsec")
 
-
 require "luasql.odbc"
-env = assert(luasql.odbc())
-db_conn = assert(env:connect("ddp") )
-db_conn:execute(string.format("insert into cdr (uuid,billsec) values ('%s', %d)", uuid, billsec))
 
-db_conn:close()
-env:close()
+env = nil
+db_conn = nil
+count = 0
 
---local file = assert(io.open("output.lua", "w"))
---file:write("Hello world\n")
---file:close()
+function luaexec_init ()
+  env = assert(luasql.odbc())
+  db_conn = assert(env:connect("ddp") )
+  count = 1
+end
 
+
+function luaexec_free ()
+  db_conn:close()
+  env:close()
+end
+
+function luaexec_main ()
+
+  uuid = xcdr_varget("uuid")
+  billsec = xcdr_varget("billsec")
+
+  db_conn:execute(string.format("insert into planeta_cdr_notify (uuid,billsec) values ('%s', %d)", uuid, billsec + count))
+  count = count + 1
+end
+

Modified: freeswitch/trunk/contrib/nazim/xmlcdrd/plugins/luaexec/luaexec.c (16978 => 16979)


--- freeswitch/trunk/contrib/nazim/xmlcdrd/plugins/luaexec/luaexec.c	2010-03-12 22:11:43 UTC (rev 16978)
+++ freeswitch/trunk/contrib/nazim/xmlcdrd/plugins/luaexec/luaexec.c	2010-03-12 23:06:36 UTC (rev 16979)
@@ -1,6 +1,44 @@
 /*
   plugin_init() accepts single option - absolute name of configuration file to parse.
+
+  Lua script _must_ provide three functions:
+  luaexec_init()
+  luaexec_free()
+  luaexec_man()
+
+  Functions listed above can be empty, but they must exist for successful run.
+
+  ******* Example script ********
+require "luasql.odbc"
+
+env = nil
+db_conn = nil
+count = 0
+
+function luaexec_init ()
+  env = assert(luasql.odbc())
+  db_conn = assert(env:connect("ddp") )
+  count = 1
+end
+
+
+function luaexec_free ()
+  db_conn:close()
+  env:close()
+end
+
+function luaexec_main ()
+  uuid = xcdr_varget("uuid")
+  billsec = xcdr_varget("billsec")
+
+  db_conn:execute(string.format("insert into planeta_cdr_notify (uuid,billsec) values ('%s', %d)", uuid, billsec + count))
+
+  count = count + 1
+end
+
+  ******* End of example script ********
 */
+
 #include "plugcommon.h"
 #include "plug.h"
 #include "stmtexp.h"
@@ -22,8 +60,13 @@
 #define STR_LEN_MAX 256
 
 /*that's what lua script would call to get variable*/
-#define LUA_VAR_GET_FUNC "xcdr_varget"
+#define LUAEXEC_VAR_GET_FUNC "xcdr_varget"
 
+/*Names of standard function which script must provide*/
+#define LUAEXEC_FUNC_INIT "luaexec_init"
+#define LUAEXEC_FUNC_FREE "luaexec_free"
+#define LUAEXEC_FUNC_PROCESS_CDR "luaexec_main"
+
 typedef struct luaexec_local_vars
 {
     char *t;
@@ -117,6 +160,30 @@
         snprintf (vars->luascript, FILENAME_LEN_MAX - 1, "%s", t);
 
     config_destroy(&vars->cfg);
+
+    vars->L = lua_open();
+    luaL_openlibs (vars->L);
+
+    lua_pushcfunction(vars->L, l_varget);
+    lua_setglobal(vars->L, LUAEXEC_VAR_GET_FUNC);
+
+    
+    if (luaL_loadfile(vars->L, vars->luascript) )
+        fprintf(stderr, "can't load file: %s, %s\n", vars->luascript,
+                lua_tostring(vars->L, -1));
+
+    if(lua_pcall(vars->L, 0, 0, 0) )
+        fprintf(stderr, "can't run file: %s, %s\n", vars->luascript,
+                lua_tostring(vars->L, -1));
+
+    
+    lua_getglobal(vars->L, LUAEXEC_FUNC_INIT);
+    if(lua_pcall(vars->L, 0, 0, 0) )
+        fprintf(stderr, "can't run %s function: %s, %s\n", 
+                LUAEXEC_FUNC_INIT,
+                vars->luascript,
+                lua_tostring(vars->L, -1));
+    
     return PLUG_STATUS_OK;
 }
 
@@ -125,6 +192,16 @@
 {
     vars = state->local_vars;
 
+    lua_getglobal(vars->L, LUAEXEC_FUNC_FREE);
+    if(lua_pcall(vars->L, 0, 0,0) )
+        fprintf(stderr, "can't run %s function: %s, %s\n",
+                LUAEXEC_FUNC_FREE,
+                vars->luascript,
+                lua_tostring(vars->L, -1));
+
+
+    lua_close (vars->L);
+
     free (vars);
     
     return PLUG_STATUS_OK;
@@ -137,23 +214,19 @@
     vars = state->local_vars;
     vars->vex = vex;
 
-    vars->L = lua_open();
-    luaL_openlibs (vars->L);
-
-    lua_pushcfunction(vars->L, l_varget);
-    lua_setglobal(vars->L, LUA_VAR_GET_FUNC);
-
     
-    if (luaL_loadfile(vars->L, vars->luascript) )
-        fprintf(stderr, "can't load file: %s, %s\n", vars->luascript,
-            lua_tostring(vars->L, -1));
-    
+    int res = PLUG_STATUS_OK;
 
-    if(lua_pcall(vars->L, 0, 0, 0) )
-        fprintf(stderr, "can't run file: %s, %s\n", vars->luascript,
+    lua_getglobal(vars->L, LUAEXEC_FUNC_PROCESS_CDR);
+    if(lua_pcall(vars->L, 0, 0, 0))
+    {
+        fprintf(stderr, "can't run %s function: %s, %s\n", 
+                LUAEXEC_FUNC_PROCESS_CDR,
+                vars->luascript,
                 lua_tostring(vars->L, -1));
+        
+        res = PLUG_STATUS_ERROR;
+    }
     
-    lua_close (vars->L);
-    
-    return PLUG_STATUS_OK;
+    return res;
 }