LuaSQLでPostgreSQLへODBC接続
結果は、惨敗だったのですが、記録しておきます。
Windowsで開発してるので、ライブラリの拡張子は、dllです。
luasql/postgres.dll
目的は、aipoのデータベースからユーザの情報を取ってこようとしたところから始まっています。
aipoのデータベースは、postgresqlなので、Luaから接続するには、LuaSQLのpostgresql用のバイナリをダウンロードしようとしました。しかし、http://luaforge.net/frs/?group_id=12 を見ると、LuaSQL 2.1.1 には、PostgreSQL用のバイナリがありません。物は試しということで、古いバイナリ(LuaSQL2.0.2)をダウンロードしてみましたが、requireした所で読み込みに失敗してしまいます。これは、元々ダウンロードしたファイル名にlua50が含まれてるから、Lua5.0用なのでしょう。なんで、Lua5.1では、PostgreSQL用のバイナリが無くなっちゃったんだろう?
luasql/odbc.dll
次に試したのは、ODBC接続です。Windows上で、システムDSNでデータベースへの接続を作成します。CGIから実行するので、システムDSNで作成する必要があります。(ユーザDSNで作成して嵌りました。)
require "luasql.odbc" env = assert (luasql.odbc()) con = assert (env:connect('dbname', 'user', 'passwd')) cur = assert (con:execute"select user_id from turbine_user")
動きました。
でも、↓のSQLだとだめでした。
cur = assert (con:execute"select user_id, last_name from turbine_user")
SQLをちょっと変更しただけなのに、odbc.dll内でエラーというかassertされてしまっているようです。どうも、select で文字列型のフィールドを指定すると、下のようなエラーが出るみたいです。
--------------------------- Microsoft Visual C++ Runtime Library --------------------------- Assertion failed! Program: c:\Kepler\1.1\bin\lua5.1.exe File: src\ls_odbc.c Line: 163 Expression: 0 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts (Press Retry to debug the application - JIT must be enabled) --------------------------- 中止(A) 再試行(R) 無視(I) ---------------------------
src/ls_odbc.c を見てみても、結果のカラムの型判定で対応する型が無いというような場合にassert文が実行されるようです。Postgresのバージョンが新しすぎて、対応してない可能性もあるんですが、バグなのかどうかもわかりませんでした。Linuxなら大丈夫なのかな?Linuxで、luasql.postgres を使えるのが一番嬉しいんですが。
続く