HDBC-1.0.1.0を使ってMySQL 5.0.24に接続するテスト。HDBCにはMySQLのドライバが無いので、unixODBCを使ってODBC経由で接続します。
unixODBCは2.2.11、mysql-connector-odbcは3.51.12、HDBC-ODBCは1.0.1.0を使います。
import IO import qualified Database.HDBC as DB import qualified Database.HDBC.ODBC as ODBC main :: IO () main = process `DB.catchSql` print where process = bracket (ODBC.connectODBC "DSN=MySQL-test;") DB.disconnect proc proc conn = q conn q conn = do res <- DB.quickQuery conn "select * from test" [] mapM_ (mapM_ p) res p (DB.SqlString s) = printWithLen s p x = printWithLen $ show x printWithLen x = putStrLn $ x ++ " (" ++ (show $ length x) ++ ")"
ただし、このバージョンの組み合わせだとうまく接続できないので、HDBC-ODBCにパッチを当てます。
diff -ur hdbc-odbc-1.0.1.0.orig/Database/HDBC/ODBC/Connection.hsc hdbc-odbc-1.0.1.0/Database/HDBC/ODBC/Connection.hsc --- hdbc-odbc-1.0.1.0.orig/Database/HDBC/ODBC/Connection.hsc 2006-07-19 05:18:31.000000000 +0900 +++ hdbc-odbc-1.0.1.0/Database/HDBC/ODBC/Connection.hsc 2006-08-23 16:57:30.000000000 +0900 @@ -97,7 +97,7 @@ -- Now connect. sqlDriverConnect dbcptr nullPtr cs (fromIntegral cslen) nullPtr 0 nullPtr - #{const SQL_DRIVER_COMPLETE} + #{const SQL_DRIVER_NOPROMPT} >>= checkError "connectODBC/sqlDriverConnect" (DbcHandle dbcptr) mkConn args fdbcptr
ついでに、mysql-odbc-connectorのコードがバグっていて、DSNなどを渡す文字列が\0で終わっていないとゴミを拾ってしまいます。とりあえず、文字列の最後に「;」をぶら下げておくとごまかせます。