New clues! It worked (sort of): it has something to do with the use of
lua stack.. when I use a non-empty table as a reference to pass into
cur_fetch it works well.. if the table is empty all hell break lose.
..
row = cur:fetch ({ test="test" }, "n") -- returns values correctly
row = cur:fetch ({ }, "n") -- access violation
..
On the source code, all seems right.. the table passed as a parameter
is in stack index 2 when the following line runs:
ls_sqlite3.c: 153 lua_rawset(L, 2);
If this table is empty, this like violates memory - I can´t figure out
why.. same for numeric indexes (ls_sqlite3.c: 141).
Luís Santos escreveu:
Yes.. I tried to compile it with GCC and I got a lot of linking
errors.. then I changed $(CC) to $(CXX) - that´s g++ - and finaly it
worked out. The colateral effect was that my DLL got all functions
mangled (C++ style) and the Lua require engine couldn't find the
luaopen_ routine.. when I discovered that was the problem, I included a
#IFDEF __cplusplus directive to add an export "C" to the function - the
same way sqlite3 does.
Here goes my modified makefile:
#---------------------------------------------------
#config
#---------------------------------------------------
# Driver (leave uncommented ONLY the line with the name of
the driver)
#T= mysql
#T= oci8
#T= odbc
#T= postgres
#T= sqlite
T=sqlite3
# Installation directories
# System's libraries directory (where binary libraries are installed)
LUA_LIBDIR= dependencies/org.lua.engine/lib
# System's lua directory (where Lua libraries are installed)
LUA_DIR= dependencies/org.lua.engine/lib
# Lua includes directory
LUA_INC= dependencies/org.lua.engine/include
# Lua version number (first and second digits of target version)
LUA_VERSION_NUM= 501
# OS dependent
#LIB_OPTION= -shared #for Linux
LIB_OPTION= #-bundle -undefined dynamic_lookup #for MacOS X
LIBNAME= $T.so
COMPAT_DIR= ../compat-5.1r5
# Compilation parameters
# Driver specific
######## MySQL
#DRIVER_LIBS= -L/usr/local/mysql/lib -lmysqlclient -lz
#DRIVER_INCS= -I/usr/local/mysql/include
######## 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
######## PostgreSQL
#DRIVER_LIBS= -L/usr/local/pgsql/lib -lpq
#DRIVER_INCS= -I/usr/local/pgsql/include
######## SQLite
#DRIVER_LIBS= -lsqlite
#DRIVER_INCS=
######## SQLite3
DRIVER_LIBS= -Ldependencies/org.sqlite.engine/lib -lsqlite3
DRIVER_INCS= -Idependencies/org.sqlite.engine/include
######## ODBC
#DRIVER_LIBS= -L/usr/local/lib -lodbc
#DRIVER_INCS= -DUNIXODBC -I/usr/local/include
WARN= -Wall #-Wmissing-prototypes -Wmissing-declarations -ansi
INCS= -I$(LUA_INC)
CFLAGS= -O2 $(WARN) -I$(COMPAT_DIR) $(DRIVER_INCS) $(INCS) $(DEFS)
CC= g++
# $Id: config,v 1.6 2007/04/06 23:46:04 mascarenhas Exp $
#---------------------------------------------------
#makefile
#---------------------------------------------------
V= 2.0.3
CONFIG= ./config
include $(CONFIG)
ifeq "$(LUA_VERSION_NUM)" "500"
COMPAT_O= $(COMPAT_DIR)/compat-5.1.o
endif
OBJS= src/luasql.o src/ls_$T.o $(COMPAT_O)
SRCS= src/luasql.h src/luasql.c \
src/ls_postgres.c \
src/ls_odbc.c \
src/ls_oci8.c \
src/ls_mysql.c \
src/ls_sqlite.c
AR= ar rcu
RANLIB= ranlib
lib: src/$(LIBNAME)
src/$(LIBNAME): $(OBJS)
export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) -o
$@
$(LIB_OPTION) $(OBJS) $(DRIVER_LIBS)
$(COMPAT_DIR)/compat-5.1.o: $(COMPAT_DIR)/compat-5.1.c
$(CC) -c $(CFLAGS) -o $@ $(COMPAT_DIR)/compat-5.1.c
dll: $T.dll
$T.exp: src/$T.def
echo ------------------------------
echo Generating Definitions - $@
echo ------------------------------
dlltool --def src/$T.def --dllname $T.dll --output-exp
$T.exp
--output-lib $T.a
$T.dll: $(OBJS) $T.exp
echo ------------------------------
echo Assembling DLL - $@
echo ------------------------------
$(CC) -shared -o $T.dll $(LIB_OPTION) $T.exp $(OBJS)
-L$(LUA_LIBDIR) -llua $(DRIVER_LIBS) -Wall -Wl,--out-implib,$T.a
strip $T.dll
install:
mkdir -p $(LUA_LIBDIR)/luasql
cp src/$(LIBNAME) $(LUA_LIBDIR)/luasql
jdbc_driver:
cd src/jdbc; make $@
clean:
rm -f src/$(LIBNAME) src/*.o $(COMPAT_O)
# $Id: Makefile,v 1.52 2007/04/06 23:46:04 mascarenhas Exp $
Aditionally, I have folowed the problem into the C file, and cornered
the Access Violation exactly in the loop to get the values in the
cur_fetch() function. It expodes on either numeric and string keys, in
the very first field. Value is obtained ok from sqlite (I log it to
disk) but something went wrong in the rawset() function.
I am beginning to run out of clues.. but I will poke it a little more..
:-)
Fabio Mascarenhas escreveu:
This is strange indeed, LuaSQL is a C file so should not
need to 'export "C"' anything... can you send a script of your build
commands, so I can try to replicate your build? Also try to run under
gdb (or even better, valgrind) to see if it sheds some light on why it
barfs.
--
Fabio Mascarenhas
On 6/11/07, Luís Santos <lsantos@itquality.com.br
>
wrote:
I have compiled every
library
and binary with my G++ 3.4.2 (MinGW
Edition)..
The only thing I believe to be strange here is that it seems that
luasql wasn´t prepared to compile under G++ (I needed to add some const
char casts and an 'export "C" for luaopen_*')
Fabio Mascarenhas escreveu:
Did you compile Lua on your own, or are you using someone
else's binaries? What about other modules? Your problem looks like
mixup of different C runtimes.
--
Fabio Mascarenhas
--
--