HDBC-mysql 0.7.0.0 → 0.7.1.0
raw patch · 4 files changed
+275/−48 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ChangeLog +15/−0
- Database/HDBC/MySQL/Connection.hsc +214/−28
- HDBC-mysql.cabal +7/−1
- README.md +39/−19
ChangeLog view
@@ -1,3 +1,18 @@+2016-11-05 0.7.1.0 release prepared by Ryan Mulligan @ryantm++ * Debug flag. Add Debug flag to cabal file to ease debugging by+ tracing each type of call to the mysql library. By @kakkun61.++2016-08-25 0.7.0.0 release prepared by Ryan Mulligan @ryantm++ * Support and requirement for GHC 8.0.1 added. By @ryantm and @wahjava.+ * Specify previously required by unspecified dependencies on ssl and zlib.++2016-08-25 0.6.6.4 release prepared by Ryan Mulligan @ryantm++ * Specifically require GHC to be less than version 8.0.1 to avoid+ problems with cabal interface conflicts.+ 2010-06-01 Chris Waterson <waterson@maubi.net> * Database/HDBC/MySQL/Connection.hsc. Add runRaw, patch from Rune
Database/HDBC/MySQL/Connection.hsc view
@@ -1,4 +1,4 @@-{-# LANGUAGE EmptyDataDecls, ForeignFunctionInterface, ScopedTypeVariables #-}+{-# LANGUAGE EmptyDataDecls, ForeignFunctionInterface, ScopedTypeVariables, CPP #-} module Database.HDBC.MySQL.Connection (@@ -23,6 +23,10 @@ import Database.HDBC.ColTypes as ColTypes import Database.HDBC (throwSqlError) +#if DEBUG+import Debug.Trace+#endif+ #include <mysql.h> {- | Connection information to use with connectMySQL.@@ -426,7 +430,7 @@ buf_ <- new n bindOfSqlValue' (8::Int) buf_ #{const MYSQL_TYPE_LONGLONG} Unsigned -bindOfSqlValue (Types.SqlEpochTime epoch) = +bindOfSqlValue (Types.SqlEpochTime epoch) = bindOfSqlValue (Types.SqlUTCTime t) where t = posixSecondsToUTCTime (fromIntegral epoch) @@ -800,28 +804,210 @@ {- ---------------------------------------------------------------------- -} +mysql_get_client_info :: IO CString+mysql_get_client_info =+#if DEBUG+ trace "mysql_get_client_info"+#endif+ mysql_get_client_info_++mysql_get_server_info :: Ptr MYSQL -> IO CString+mysql_get_server_info =+#if DEBUG+ trace "mysql_get_server_info"+#endif+ mysql_get_server_info_++mysql_get_proto_info :: Ptr MYSQL -> IO CUInt+mysql_get_proto_info =+#if DEBUG+ trace "mysql_get_proto_info"+#endif+ mysql_get_proto_info_++mysql_init :: Ptr MYSQL -> IO (Ptr MYSQL)+mysql_init =+#if DEBUG+ trace "mysql_init"+#endif+ mysql_init_++mysql_options :: Ptr MYSQL -> CInt -> Ptr () -> IO CInt+mysql_options =+#if DEBUG+ trace "mysql_options"+#endif+ mysql_options_++mysql_real_connect :: Ptr MYSQL -> CString -> CString -> CString -> CString -> CInt -> CString -> IO (Ptr MYSQL)+mysql_real_connect =+#if DEBUG+ trace "mysql_real_connect"+#endif+ mysql_real_connect_++mysql_close :: FunPtr (Ptr MYSQL -> IO ())+mysql_close =+#if DEBUG+ trace "mysql_close"+#endif+ mysql_close_++mysql_stmt_init :: Ptr MYSQL -> IO (Ptr MYSQL_STMT)+mysql_stmt_init =+#if DEBUG+ trace "mysql_stmt_init"+#endif+ mysql_stmt_init_++mysql_stmt_prepare :: Ptr MYSQL_STMT -> CString -> CInt -> IO CInt+mysql_stmt_prepare =+#if DEBUG+ trace "mysql_stmt_prepare"+#endif+ mysql_stmt_prepare_++mysql_stmt_result_metadata :: Ptr MYSQL_STMT -> IO (Ptr MYSQL_RES)+mysql_stmt_result_metadata =+#if DEBUG+ trace "mysql_stmt_result_metadata"+#endif+ mysql_stmt_result_metadata_++mysql_stmt_bind_param :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> IO CChar+mysql_stmt_bind_param =+#if DEBUG+ trace "mysql_stmt_bind_param"+#endif+ mysql_stmt_bind_param_++mysql_stmt_bind_result :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> IO CChar+mysql_stmt_bind_result =+#if DEBUG+ trace "mysql_stmt_bind_result"+#endif+ mysql_stmt_bind_result_++mysql_stmt_param_count :: Ptr MYSQL_STMT -> IO CULong+mysql_stmt_param_count =+#if DEBUG+ trace "mysql_stmt_param_count"+#endif+ mysql_stmt_param_count_++mysql_free_result :: Ptr MYSQL_RES -> IO ()+mysql_free_result =+#if DEBUG+ trace "mysql_free_result"+#endif+ mysql_free_result_++mysql_stmt_execute :: Ptr MYSQL_STMT -> IO CInt+mysql_stmt_execute =+#if DEBUG+ trace "mysql_stmt_execute"+#endif+ mysql_stmt_execute_++mysql_stmt_affected_rows :: Ptr MYSQL_STMT -> IO CULLong+mysql_stmt_affected_rows =+#if DEBUG+ trace "mysql_stmt_affected_rows"+#endif+ mysql_stmt_affected_rows_++mysql_fetch_field :: Ptr MYSQL_RES -> IO (Ptr MYSQL_FIELD)+mysql_fetch_field =+#if DEBUG+ trace "mysql_fetch_field"+#endif+ mysql_fetch_field_++mysql_stmt_fetch :: Ptr MYSQL_STMT -> IO CInt+mysql_stmt_fetch =+#if DEBUG+ trace "mysql_stmt_fetch"+#endif+ mysql_stmt_fetch_++mysql_stmt_fetch_column :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> CUInt -> CULong -> IO CInt+mysql_stmt_fetch_column =+#if DEBUG+ trace "mysql_stmt_fetch_column"+#endif+ mysql_stmt_fetch_column_++mysql_stmt_close :: Ptr MYSQL_STMT -> IO ()+mysql_stmt_close =+#if DEBUG+ trace "mysql_stmt_close"+#endif+ mysql_stmt_close_++mysql_stmt_errno :: Ptr MYSQL_STMT -> IO CInt+mysql_stmt_errno =+#if DEBUG+ trace "mysql_stmt_errno"+#endif+ mysql_stmt_errno_++mysql_stmt_error :: Ptr MYSQL_STMT -> IO CString+mysql_stmt_error =+#if DEBUG+ trace "mysql_stmt_error"+#endif+ mysql_stmt_error_++mysql_errno :: Ptr MYSQL -> IO CInt+mysql_errno =+#if DEBUG+ trace "mysql_errno"+#endif+ mysql_errno_++mysql_error :: Ptr MYSQL -> IO CString+mysql_error =+#if DEBUG+ trace "mysql_error"+#endif+ mysql_error_++mysql_autocommit :: Ptr MYSQL -> CChar -> IO CChar+mysql_autocommit =+#if DEBUG+ trace "mysql_autocommit"+#endif+ mysql_autocommit_++mysql_query :: Ptr MYSQL -> CString -> IO CInt+mysql_query =+#if DEBUG+ trace "mysql_query"+#endif+ mysql_query_+ -- Here are all the FFI imports. -foreign import ccall unsafe mysql_get_client_info+foreign import ccall unsafe "mysql_get_client_info" mysql_get_client_info_ :: IO CString -foreign import ccall unsafe mysql_get_server_info+foreign import ccall unsafe "mysql_get_server_info" mysql_get_server_info_ :: Ptr MYSQL -> IO CString -foreign import ccall unsafe mysql_get_proto_info+foreign import ccall unsafe "mysql_get_proto_info" mysql_get_proto_info_ :: Ptr MYSQL -> IO CUInt -foreign import ccall unsafe mysql_init+foreign import ccall unsafe "mysql_init" mysql_init_ :: Ptr MYSQL -> IO (Ptr MYSQL) -foreign import ccall unsafe mysql_options+foreign import ccall unsafe "mysql_options" mysql_options_ :: Ptr MYSQL -> CInt -> Ptr () -> IO CInt -foreign import ccall unsafe mysql_real_connect+foreign import ccall unsafe "mysql_real_connect" mysql_real_connect_ :: Ptr MYSQL -- the context -> CString -- hostname -> CString -- username@@ -831,64 +1017,64 @@ -> CString -- unix socket -> IO (Ptr MYSQL) -foreign import ccall unsafe "&mysql_close" mysql_close+foreign import ccall unsafe "&mysql_close" mysql_close_ :: FunPtr (Ptr MYSQL -> IO ()) -foreign import ccall unsafe mysql_stmt_init+foreign import ccall unsafe "mysql_stmt_init" mysql_stmt_init_ :: Ptr MYSQL -> IO (Ptr MYSQL_STMT) -foreign import ccall unsafe mysql_stmt_prepare+foreign import ccall unsafe "mysql_stmt_prepare" mysql_stmt_prepare_ :: Ptr MYSQL_STMT -> CString -> CInt -> IO CInt -foreign import ccall unsafe mysql_stmt_result_metadata+foreign import ccall unsafe "mysql_stmt_result_metadata" mysql_stmt_result_metadata_ :: Ptr MYSQL_STMT -> IO (Ptr MYSQL_RES) -foreign import ccall unsafe mysql_stmt_bind_param+foreign import ccall unsafe "mysql_stmt_bind_param" mysql_stmt_bind_param_ :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> IO CChar -foreign import ccall unsafe mysql_stmt_bind_result+foreign import ccall unsafe "mysql_stmt_bind_result" mysql_stmt_bind_result_ :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> IO CChar -foreign import ccall unsafe mysql_stmt_param_count+foreign import ccall unsafe "mysql_stmt_param_count" mysql_stmt_param_count_ :: Ptr MYSQL_STMT -> IO CULong -foreign import ccall unsafe mysql_free_result+foreign import ccall unsafe "mysql_free_result" mysql_free_result_ :: Ptr MYSQL_RES -> IO () -foreign import ccall unsafe mysql_stmt_execute+foreign import ccall unsafe "mysql_stmt_execute" mysql_stmt_execute_ :: Ptr MYSQL_STMT -> IO CInt -foreign import ccall unsafe mysql_stmt_affected_rows+foreign import ccall unsafe "mysql_stmt_affected_rows" mysql_stmt_affected_rows_ :: Ptr MYSQL_STMT -> IO CULLong -foreign import ccall unsafe mysql_fetch_field+foreign import ccall unsafe "mysql_fetch_field" mysql_fetch_field_ :: Ptr MYSQL_RES -> IO (Ptr MYSQL_FIELD) -foreign import ccall unsafe mysql_stmt_fetch+foreign import ccall unsafe "mysql_stmt_fetch" mysql_stmt_fetch_ :: Ptr MYSQL_STMT -> IO CInt -foreign import ccall unsafe mysql_stmt_fetch_column+foreign import ccall unsafe "mysql_stmt_fetch_column" mysql_stmt_fetch_column_ :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> CUInt -> CULong -> IO CInt -foreign import ccall unsafe mysql_stmt_close+foreign import ccall unsafe "mysql_stmt_close" mysql_stmt_close_ :: Ptr MYSQL_STMT -> IO () -foreign import ccall unsafe mysql_stmt_errno+foreign import ccall unsafe "mysql_stmt_errno" mysql_stmt_errno_ :: Ptr MYSQL_STMT -> IO CInt -foreign import ccall unsafe mysql_stmt_error+foreign import ccall unsafe "mysql_stmt_error" mysql_stmt_error_ :: Ptr MYSQL_STMT -> IO CString -foreign import ccall unsafe mysql_errno+foreign import ccall unsafe "mysql_errno" mysql_errno_ :: Ptr MYSQL -> IO CInt -foreign import ccall unsafe mysql_error+foreign import ccall unsafe "mysql_error" mysql_error_ :: Ptr MYSQL -> IO CString -foreign import ccall unsafe mysql_autocommit+foreign import ccall unsafe "mysql_autocommit" mysql_autocommit_ :: Ptr MYSQL -> CChar -> IO CChar -foreign import ccall unsafe mysql_query+foreign import ccall unsafe "mysql_query" mysql_query_ :: Ptr MYSQL -> CString -> IO CInt foreign import ccall unsafe memset
HDBC-mysql.cabal view
@@ -1,7 +1,7 @@ name: HDBC-mysql category: Database synopsis: MySQL driver for HDBC-version: 0.7.0.0+version: 0.7.1.0 stability: Experimental maintainer: Ryan Mulligan <ryan@ryantm.com> author: Chris Waterson@@ -25,6 +25,10 @@ base >= 4.9 && < 5, Cabal >= 1.24 +flag debug+ description: Enable debug support+ default: False+ library exposed-modules: Database.HDBC.MySQL other-modules:@@ -37,6 +41,8 @@ time, utf8-string ghc-options: -Wall+ if flag(debug)+ cpp-options: -DDEBUG extra-libraries: z ssl mysqlclient default-language: Haskell2010
README.md view
@@ -1,29 +1,30 @@-HDBC-mysql-==========+#HDBC-mysql This is a "native" HDBC driver for MySQL that makes use of libmysqlclient to communicate with a MySQL server. By way of synopsis: - import Control.Monad- import Database.HDBC- import Database.HDBC.MySQL- main = do conn <- connectMySQL defaultMySQLConnectInfo {- mysqlHost = "db1.example.com",- mysqlUser = "scott",- mysqlPassword = "tiger"- }+```haskell+import Control.Monad+import Database.HDBC+import Database.HDBC.MySQL+main = do conn <- connectMySQL defaultMySQLConnectInfo {+ mysqlHost = "db1.example.com",+ mysqlUser = "scott",+ mysqlPassword = "tiger"+ } - rows <- quickQuery' conn "SELECT 1 + 1" []- forM_ rows $ \row -> putStrLn $ show row+ rows <- quickQuery' conn "SELECT 1 + 1" []+ forM_ rows $ \row -> putStrLn $ show row+``` At the moment, please consider this to be "alpha" software. As far as I can tell, it works. There are some limitations that you should be aware of. -Caveats-=======+## Caveats + * This works with MySQL server and client libraries 5.0.75. I haven't tried with 4.x nor 5.1. I suspect that using a server version less than 4.1 won't work, due to lack of support for@@ -71,20 +72,39 @@ * It probably makes sense to marshall to the SqlByteString type when retrieving BLOB data. -Testing-=======+## Testing There's a little test program that runs a query and spews out the results. To compile it, - ghc -idist/build -L/opt/local/lib/mysql5/mysql -lmysqlclient --make Test+```+ghc -idist/build -L/opt/local/lib/mysql5/mysql -lmysqlclient --make Test+``` I'm still trying to get the Makefile right so that it can build the test sources: it's not there yet. Here's how I've been doing it, for now: - cd testsrc- ghc --make -package HUnit -package HDBC -Wall -i../dist/build -i.. -L/opt/local/lib/mysql5/mysql -lmysqlclient -o runtests runtests.hs+```+cd testsrc+ghc --make -package HUnit -package HDBC -Wall -i../dist/build -i.. -L/opt/local/lib/mysql5/mysql -lmysqlclient -o runtests runtests.hs+``` One issue is that I want the location of the MySQL library to come from the configuration data, rather than be hard-coded.++## Developing hdbc-mysql with nix++```+# Nix shell+nix-shell -p haskell.packages.ghc801.ghc gcc mysql57 pkgconfig zlib openssl haskellPackages.haddock++# Use Cabal to build+cabal clean && cabal build++# Build test script+ghc -idist/build -L/nix/store/vksgj509kdnk3rva0x64qwp21nzrxy9b-mariadb-10.1.16/lib -lmysqlclient --make Test++# Run test script+./Test+```