Commits

Bryan O'Sullivan  committed d2e1b01

Document withRTSSignalsBlocked more clearly.

  • Participants
  • Parent commits c8b7934
  • Tags 0.6.4.0

Comments (0)

Files changed (2)

File Database/HDBC/MySQL.hs

 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/.
+* 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.
 
-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.
+* 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

File Database/HDBC/MySQL/RTS.hsc

 -- 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: