Skip to content

Commit

Permalink
Document withRTSSignalsBlocked more clearly.
Browse files Browse the repository at this point in the history
  • Loading branch information
bos committed Apr 26, 2011
1 parent ea826fc commit a84dc21
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 26 deletions.
59 changes: 34 additions & 25 deletions Database/HDBC/MySQL.hs
Expand Up @@ -13,34 +13,43 @@ To use it, invoke the 'connectMySQL' method to create an
database. Use the 'defaultMySQLConnectInfo', overriding the default
values as necessary.
> 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
@
import Control.Monad
import Database.HDBC
import Database.HDBC.MySQL
main = do
rows <- 'withRTSSignalsBlocked' $ do
conn <- 'connectMySQL' 'defaultMySQLConnectInfo' {
'mysqlHost' = \"db1.example.com\",
'mysqlUser' = \"scott\",
'mysqlPassword' = \"tiger\"
}
'quickQuery'' conn \"SELECT 1 + 1\" []
forM_ rows $ \row -> putStrLn $ show row
@
There are some important caveats to note about this driver.
The first relates to transaction support. The MySQL server supports a
variety of backend \"engines\", only some of which support
transactional access (e.g., InnoDB). This driver will report that the
database supports transactions. Should you decide to make use of the
transactional support in the HDBC API,
/it is up to you to make sure that you use a MySQL engine that supports transactions/.
The next relates to dates and times. MySQL does not store time zone
information in @DATETIME@ or @TIMESTAMP@ columns: instead, it assumes
that all dates are stored in the \"server's time zone\". At some
point in the future, this driver may query for the server's time zone
and apply appropriate time zone conversion to these datatypes. For
now, it simply treats all times as UTC; i.e., it assumes the server's
time zone is UTC.
* RTS signals. If you are writing an application that links against GHC's
threaded runtime (as most server-side applications do), you must use
'withRTSSignalsBlocked' to defend the @mysqlclient@ library against the
signals the RTS uses, or you may experience crashes.
* Transaction support. The MySQL server supports a
variety of backend \"engines\", only some of which support
transactional access (e.g., InnoDB). This driver will report that the
database supports transactions. Should you decide to make use of the
transactional support in the HDBC API,
/it is up to you to make sure that you use a MySQL engine that supports transactions/.
* Dates and times. MySQL does not store time zone
information in @DATETIME@ or @TIMESTAMP@ columns: instead, it assumes
that all dates are stored in the \"server's time zone\". At some
point in the future, this driver may query for the server's time zone
and apply appropriate time zone conversion to these datatypes. For
now, it simply treats all times as UTC; i.e., it assumes the server's
time zone is UTC.
-}
module Database.HDBC.MySQL
Expand Down
5 changes: 4 additions & 1 deletion Database/HDBC/MySQL/RTS.hsc
Expand Up @@ -15,11 +15,14 @@ import Foreign.Storable (Storable(..))
-- blocked. The @mysqlclient@ C library does not correctly restart
-- system calls if they are interrupted by signals, so many MySQL API
-- calls can unexpectedly fail when called from a Haskell application.
-- This is most likely to occur if you are linking against GHC's
-- threaded runtime (using the @-threaded@ option).
--
-- This function blocks @SIGALRM@ and @SIGVTALRM@, runs your action,
-- then unblocks those signals. If you have a series of HDBC calls
-- that may block for a period of time, it may be wise to wrap them in
-- this action.
-- this action. Blocking and unblocking signals is cheap, but not
-- free.
--
-- Here is an example of an exception that could be avoided by
-- temporarily blocking GHC's runtime signals:
Expand Down

0 comments on commit a84dc21

Please sign in to comment.