Lua & MySQL
Откуда: Москва
Сообщений: 3421
|
Lua & MySQL
Здравствуйте.
Изучаю вот Lua :-)
Собрал 1.6.1.10, pbx_lua.so. Работает.
Но только добавляю директиву require "luasql.mysql", получаю:
*CLI> module load pbx_lua.so
Unable to load module pbx_lua.so
Command 'module load pbx_lua.so' failed.
*CLI> [Nov 25 09:34:50] ERROR[31399]: pbx_lua.c:1440 load_or_reload_lua_stuff: Error loading extensions.lua: error loading module 'luasql.mysql' from file '/usr/local/lib/lua/5.1/luasql/mysql.so':
/usr/local/lib/lua/5.1/luasql/mysql.so: undefined symbol: lua_getfield
Гугл не особо щедр на помощь. Из того, то чего дошел сам. pbx_lua.so не экспортирует функцию lua_getfield, в чем можно убедиться так:
explorer pbx # nm pbx_lua.so | grep lua_getfield
U lua_getfield
explorer pbx #
man nm, "U" The symbol is undefined.
Теперь вопросы к программистам С:
1) Почему /usr/local/lib/lua/5.1/luasql/mysql.so хочет lua_getfield, который определен в pbx_lua.c?
2) Как собрать pbx_lua.so, чтобы он экспортировал lua_getfield?
Рад буду любому совету.
P.S. Да, скрипт пока такой:
require "luasql.mysql"
env = assert(luasql.mysql())
function mysql_connect()
local my_con = assert(env:connect("astpbx","asterisk","password"))
return my_con
end
function lookup_exten(number)
con = mysq_connect()
res = assert(con:execute(string.format("SELECT id FROM account WHERE code='%s'", channel.accountcode)))
row = res:fetch({}, a)
print(row.id)
end
|
Откуда: Москва
Сообщений: 3421
|
Re: Lua & MySQL
Да кстати, думал, что symbol stripped, пересобрал астер с DONT OPTIMIZE, не помогло.
Например:
explorer modules # nm /bin/ls
nm: /bin/ls: no symbols
Тут все понятно. А там - нет :-(
|
Откуда: Москва
Сообщений: 3421
|
Re: Lua & MySQL
Нашел вот: http://jira.freeswitch.org/browse/LBAPR-1
вот что надо сделать: load mod_lua with global symbols space so that sub modules are able to link to it properly.
|
Откуда: Москва
Сообщений: 3421
|
Re: Lua & MySQL
Проблема решена.
Во, первых, на 64-битных системах изначально такое сообщение:
explorer luasql-2.1.1 # make
gcc -O2 -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic -I../compat/src -I/usr/include/mysql -I/usr/local/include -c -o src/luasql.o src/luasql.c
gcc -O2 -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic -I../compat/src -I/usr/include/mysql -I/usr/local/include -c -o src/ls_mysql.o src/ls_mysql.c
In file included from src/ls_mysql.c:19:
/usr/include/mysql/mysql.h:129: warning: ISO C90 does not support ‘long long’
export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc -O2 -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic -I../compat/src -I/usr/include/mysql -I/usr/local/include -o src/mysql.so -shared -llua src/luasql.o src/ls_mysql.o -L/usr/lib/mysql/ -lmysqlclient -lz
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../../../x86_64-pc-linux-gnu/bin/ld: src/luasql.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
src/luasql.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [src/mysql.so] Error 1
Надо добавить в config файл директивы -fPIC, а заодно и -llua, которая и решает все проблемы.
explorer luasql-2.1.1 # make
gcc -fPIC -O2 -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic -I../compat/src -I/usr/include/mysql -I/usr/local/include -c -o src/luasql.o src/luasql.c
gcc -fPIC -O2 -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic -I../compat/src -I/usr/include/mysql -I/usr/local/include -c -o src/ls_mysql.o src/ls_mysql.c
In file included from src/ls_mysql.c:19:
/usr/include/mysql/mysql.h:129: warning: ISO C90 does not support ‘long long’
export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc -fPIC -O2 -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic -I../compat/src -I/usr/include/mysql -I/usr/local/include -o src/mysql.so -shared -llua src/luasql.o src/ls_mysql.o -L/usr/lib/mysql/ -lmysqlclient -lz
explorer luasql-2.1.1 # make install
mkdir -p /usr/local/lib/lua/5.1/luasql
cp src/mysql.so /usr/local/lib/lua/5.1/luasql
explorer luasql-2.1.1 #
Lua пока нравится. В отличие от AEL, где пишу одно, вижу другое, при выполнении Lua скрипта показаны Lua команды :-) Типа поддается отладке.
Продолжение следует ;-)
Решение:
explorer tmp # diff -u luasql-2.1.1/config config
--- luasql-2.1.1/config 2007-10-28 02:55:27.000000000 +0400
+++ config 2009-11-25 13:13:14.000000000 +0300
@@ -1,10 +1,10 @@
# Driver (leave uncommented ONLY the line with the name of the driver)
-#T= mysql
+T= mysql
#T= oci8
#T= odbc
#T= postgres
#T= sqlite
-T=sqlite3
+#T=sqlite3
# Installation directories
@@ -24,7 +24,7 @@
LUA_VERSION_NUM= 501
# OS dependent
-LIB_OPTION= -shared #for Linux
+LIB_OPTION= -shared -llua #for Linux
#LIB_OPTION= -bundle -undefined dynamic_lookup #for MacOS X
LIBNAME= $T.so
@@ -33,8 +33,8 @@
# Compilation parameters
# Driver specific
######## MySQL
-#DRIVER_LIBS= -L/usr/local/mysql/lib -lmysqlclient -lz
-#DRIVER_INCS= -I/usr/local/mysql/include
+DRIVER_LIBS= -L/usr/lib/mysql/ -lmysqlclient -lz
+DRIVER_INCS= -I/usr/include/mysql
######## Oracle OCI8
#DRIVER_LIBS= -L/home/oracle/OraHome1/lib -lz -lclntsh
#DRIVER_INCS= -I/home/oracle/OraHome1/rdbms/demo -I/home/oracle/OraHome1/rdbms/public
@@ -45,15 +45,15 @@
#DRIVER_LIBS= -lsqlite
#DRIVER_INCS=
######## SQLite3
-DRIVER_LIBS= -L/opt/local/lib -lsqlite3
-DRIVER_INCS= -I/opt/local/include
+#DRIVER_LIBS= -L/opt/local/lib -lsqlite3
+#DRIVER_INCS= -I/opt/local/include
######## ODBC
#DRIVER_LIBS= -L/usr/local/lib -lodbc
#DRIVER_INCS= -DUNIXODBC -I/usr/local/include
WARN= -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic
INCS= -I$(LUA_INC)
-CFLAGS= -O2 $(WARN) -I$(COMPAT_DIR) $(DRIVER_INCS) $(INCS) $(DEFS)
+CFLAGS= -fPIC -O2 $(WARN) -I$(COMPAT_DIR) $(DRIVER_INCS) $(INCS) $(DEFS)
CC= gcc
# $Id: config,v 1.8 2007/10/27 22:55:27 carregal Exp $
|
Откуда: Miass
Сообщений: 1
|
Re: Lua & MySQL
litnimax - подскажи где можно про использование луа в астериске почитать, все облазил уже нигде нету, кроме примера который идет вместе с pbx_lua.so меня интерисует какие библиотеки подключены, особенно ввод-вывод пробовал:
local file=io.open("./1.txt", "a+")
file:write("some text")
не выходит говорит что file == nil, хотя на io.open не ругается
P.S уж больно хочется Lua использовать для написания диалплана, а доков нигде немогу найти, на самом Lua немного умею кодить
|
Откуда: Москва
Сообщений: 3421
|
Re: Lua & MySQL
koqep, напиши на litnimax(@)asterisk-support.ru.
|
Откуда: Nsk
Сообщений: 3
|
Re: Lua & MySQL
для Centos 5 - 64 битной c учетом предыдущего дифа
в файле config
PREFIX = /usr
DRIVER_LIBS= -L/usr/lib64/mysql/ -lmysqlclient -lz
|
|