mysql 0.1.2.1 → 0.1.3
raw patch · 5 files changed
+84/−24 lines, 5 filessetup-changedPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Database.MySQL.Base: initLibrary :: IO ()
+ Database.MySQL.Base: initThread :: IO ()
+ Database.MySQL.Base.C: mysql_get_server_version :: Ptr MYSQL -> IO CULong
+ Database.MySQL.Base.C: mysql_library_init :: CInt -> Ptr (Ptr Char) -> Ptr (Ptr Char) -> IO CInt
+ Database.MySQL.Base.C: mysql_thread_init :: IO MyBool
Files
- ChangeLog.md +6/−0
- Database/MySQL/Base.hs +34/−0
- Database/MySQL/Base/C.hsc +28/−15
- Setup.hs +15/−8
- mysql.cabal +1/−1
ChangeLog.md view
@@ -1,3 +1,9 @@+## 0.1.3++* Safer concurrency - see https://ro-che.info/articles/2015-04-17-safe-concurrent-mysql-haskell+* Better support for building against MariaDB (not well tested).+* Additional C binding: mysql_get_server_version().+ ## 0.1.2.1 * Fix bystestring-valued connectOptions sometimes not being null terminated at the correct place (avoid unsafeUseAsCString).
Database/MySQL/Base.hs view
@@ -72,6 +72,9 @@ -- * General information , clientInfo , clientVersion+ -- * Concurrency+ , initLibrary+ , initThread ) where import Control.Applicative ((<$>), (<*>))@@ -176,6 +179,13 @@ , sslCiphers :: String -- ^ Comma-separated list of cipher names. } deriving (Eq, Read, Show, Typeable) +-- | The constructors of @MySQLError@ are not currently exported, but they+-- have a consistent set of field names which are exported. These fields are:+--+-- > errFunction :: String+-- > errNumber :: Int+-- > errMessage :: String+-- data MySQLError = ConnectionError { errFunction :: String , errNumber :: Int@@ -541,6 +551,30 @@ withConn :: Connection -> (Ptr MYSQL -> IO a) -> IO a withConn conn = withForeignPtr (connFP conn)++-- | Call @mysql_library_init@+--+-- See <https://ro-che.info/articles/2015-04-17-safe-concurrent-mysql-haskell>+-- for details.+initLibrary :: IO ()+initLibrary = do+ r <- mysql_library_init 0 nullPtr nullPtr+ if r == 0+ then return ()+ else throw $ ConnectionError "initLibrary" (-1)+ "mysql_library_init failed"++-- | Call @mysql_thread_init@+--+-- See <https://ro-che.info/articles/2015-04-17-safe-concurrent-mysql-haskell>+-- for details.+initThread :: IO ()+initThread = do+ r <- mysql_thread_init+ if r == 0+ then return ()+ else throw $ ConnectionError "initThread" (-1)+ "mysql_thread_init failed" withRes :: String -> Result -> (Ptr MYSQL_RES -> IO a) -> IO a withRes func res act = do
Database/MySQL/Base/C.hsc view
@@ -25,6 +25,7 @@ -- ** Connection information , mysql_thread_id , mysql_get_server_info+ , mysql_get_server_version , mysql_get_host_info , mysql_get_proto_info , mysql_character_set_name@@ -63,6 +64,9 @@ -- * Error handling , mysql_errno , mysql_error+ -- * Concurrency+ , mysql_library_init+ , mysql_thread_init ) where #include "mysql_signals.h"@@ -138,7 +142,7 @@ foreign import ccall safe "mysql.h mysql_options" mysql_options_ :: Ptr MYSQL -> CInt -> Ptr a -> IO CInt -foreign import ccall unsafe "mysql_signals.h _hs_mysql_real_connect"+foreign import ccall safe "mysql_signals.h _hs_mysql_real_connect" mysql_real_connect :: Ptr MYSQL -- ^ Context (from 'mysql_init'). -> CString -- ^ Host name.@@ -159,26 +163,26 @@ -> CString -- ^ Ciphers. -> IO MyBool -foreign import ccall unsafe "mysql_signals.h _hs_mysql_close" mysql_close+foreign import ccall safe "mysql_signals.h _hs_mysql_close" mysql_close :: Ptr MYSQL -> IO () -foreign import ccall unsafe "mysql_signals.h _hs_mysql_ping" mysql_ping+foreign import ccall safe "mysql_signals.h _hs_mysql_ping" mysql_ping :: Ptr MYSQL -> IO CInt foreign import ccall safe mysql_thread_id :: Ptr MYSQL -> IO CULong -foreign import ccall unsafe "mysql_signals.h _hs_mysql_autocommit" mysql_autocommit+foreign import ccall safe "mysql_signals.h _hs_mysql_autocommit" mysql_autocommit :: Ptr MYSQL -> MyBool -> IO MyBool -foreign import ccall unsafe "mysql_signals.h _hs_mysql_change_user" mysql_change_user+foreign import ccall safe "mysql_signals.h _hs_mysql_change_user" mysql_change_user :: Ptr MYSQL -> CString -- ^ user -> CString -- ^ password -> CString -- ^ database -> IO MyBool -foreign import ccall unsafe "mysql_signals.h _hs_mysql_select_db" mysql_select_db+foreign import ccall safe "mysql_signals.h _hs_mysql_select_db" mysql_select_db :: Ptr MYSQL -> CString -> IO CInt@@ -186,6 +190,9 @@ foreign import ccall safe mysql_get_server_info :: Ptr MYSQL -> IO CString +foreign import ccall safe mysql_get_server_version+ :: Ptr MYSQL -> IO CULong+ foreign import ccall safe mysql_get_host_info :: Ptr MYSQL -> IO CString @@ -201,10 +208,10 @@ foreign import ccall safe mysql_get_ssl_cipher :: Ptr MYSQL -> IO CString -foreign import ccall unsafe "mysql_signals.h _hs_mysql_stat" mysql_stat+foreign import ccall safe "mysql_signals.h _hs_mysql_stat" mysql_stat :: Ptr MYSQL -> IO CString -foreign import ccall unsafe "mysql_signals.h _hs_mysql_real_query" mysql_real_query+foreign import ccall safe "mysql_signals.h _hs_mysql_real_query" mysql_real_query :: Ptr MYSQL -> CString -> CULong -> IO CInt foreign import ccall safe mysql_insert_id@@ -216,13 +223,13 @@ foreign import ccall safe mysql_affected_rows :: Ptr MYSQL -> IO CULLong -foreign import ccall unsafe "mysql_signals.h _hs_mysql_store_result" mysql_store_result+foreign import ccall safe "mysql_signals.h _hs_mysql_store_result" mysql_store_result :: Ptr MYSQL -> IO (Ptr MYSQL_RES) -foreign import ccall unsafe "mysql_signals.h _hs_mysql_use_result" mysql_use_result+foreign import ccall safe "mysql_signals.h _hs_mysql_use_result" mysql_use_result :: Ptr MYSQL -> IO (Ptr MYSQL_RES) -foreign import ccall unsafe "mysql_signals.h _hs_mysql_free_result" mysql_free_result+foreign import ccall safe "mysql_signals.h _hs_mysql_free_result" mysql_free_result :: Ptr MYSQL_RES -> IO () foreign import ccall safe "mysql.h mysql_free_result" mysql_free_result_nonblock@@ -243,16 +250,16 @@ foreign import ccall safe mysql_row_tell :: Ptr MYSQL_RES -> IO MYSQL_ROW_OFFSET -foreign import ccall unsafe "mysql_signals.h _hs_mysql_next_result" mysql_next_result+foreign import ccall safe "mysql_signals.h _hs_mysql_next_result" mysql_next_result :: Ptr MYSQL -> IO CInt -foreign import ccall unsafe "mysql_signals.h _hs_mysql_commit" mysql_commit+foreign import ccall safe "mysql_signals.h _hs_mysql_commit" mysql_commit :: Ptr MYSQL -> IO MyBool -foreign import ccall unsafe "mysql_signals.h _hs_mysql_rollback" mysql_rollback+foreign import ccall safe "mysql_signals.h _hs_mysql_rollback" mysql_rollback :: Ptr MYSQL -> IO MyBool -foreign import ccall unsafe "mysql_signals.h _hs_mysql_fetch_row" mysql_fetch_row+foreign import ccall safe "mysql_signals.h _hs_mysql_fetch_row" mysql_fetch_row :: Ptr MYSQL_RES -> IO MYSQL_ROW foreign import ccall safe "mysql.h mysql_fetch_row" mysql_fetch_row_nonblock@@ -276,3 +283,9 @@ foreign import ccall safe mysql_error :: Ptr MYSQL -> IO CString++foreign import ccall safe "mysql.h mysql_server_init" mysql_library_init+ :: CInt -> Ptr (Ptr Char) -> Ptr (Ptr Char) -> IO CInt++foreign import ccall safe "mysql.h" mysql_thread_init+ :: IO MyBool
Setup.hs view
@@ -8,8 +8,8 @@ #define MIN_VERSION_Cabal(x,y,z) 0 #endif -import Control.Monad (liftM2, mplus)-import Data.List (isPrefixOf)+import Control.Monad (liftM, msum, sequence)+import Data.List (isPrefixOf, nub) import Distribution.PackageDescription import Distribution.Simple import Distribution.Simple.LocalBuildInfo@@ -41,13 +41,17 @@ } mysqlConfigProgram = (simpleProgram "mysql_config") {- programFindLocation = \verbosity -> constOrId $ liftM2 mplus+ programFindLocation = \verbosity -> constOrId $ liftM msum $ sequence #if MIN_VERSION_Cabal(1,24,0)- (findProgramOnSearchPath verbosity [ProgramSearchPathDefault] "mysql_config")- (findProgramOnSearchPath verbosity [ProgramSearchPathDefault] "mysql_config5")+ [ (findProgramOnSearchPath verbosity [ProgramSearchPathDefault] "mysql_config")+ , (findProgramOnSearchPath verbosity [ProgramSearchPathDefault] "mysql_config5")+ , (findProgramOnSearchPath verbosity [ProgramSearchPathDefault] "mariadb_config")+ ] #else- (findProgramLocation verbosity "mysql_config")- (findProgramLocation verbosity "mysql_config5")+ [ (findProgramLocation verbosity "mysql_config")+ , (findProgramLocation verbosity "mysql_config5")+ , (findProgramLocation verbosity "mariadb_config")+ ] #endif } @@ -58,10 +62,13 @@ include <- mysqlConfig ["--include"] libs <- mysqlConfig ["--libs"]+ libsR <- mysqlConfig ["--libs_r"] return emptyBuildInfo { extraLibDirs = map (drop 2) . filter ("-L" `isPrefixOf`) $ libs , extraLibs = map (drop 2) . filter ("-l" `isPrefixOf`) .- filter (/= "-lmygcc") $ libs+ filter (/= "-lmygcc") $+ filter (/= "-lmysqlclient_r") $+ nub (libs ++ libsR) , includeDirs = map (drop 2) include }
mysql.cabal view
@@ -1,5 +1,5 @@ name: mysql-version: 0.1.2.1+version: 0.1.3 homepage: https://github.com/paul-rouse/mysql bug-reports: https://github.com/paul-rouse/mysql/issues synopsis: A low-level MySQL client library.