aboutsummaryrefslogtreecommitdiff
path: root/Database
diff options
context:
space:
mode:
Diffstat (limited to 'Database')
-rw-r--r--Database/Handle.hs26
1 files changed, 18 insertions, 8 deletions
diff --git a/Database/Handle.hs b/Database/Handle.hs
index f5a0a5dda..5670acb99 100644
--- a/Database/Handle.hs
+++ b/Database/Handle.hs
@@ -142,11 +142,15 @@ data Job
| CloseJob
workerThread :: T.Text -> TableName -> MVar Job -> IO ()
-workerThread db tablename jobs =
- catchNonAsync (runSqliteRobustly tablename db loop) showerr
+workerThread db tablename jobs = go
where
- showerr e = hPutStrLn stderr $
- "sqlite worker thread crashed: " ++ show e
+ go = do
+ v <- tryNonAsync (runSqliteRobustly tablename db loop)
+ case v of
+ Left e -> hPutStrLn stderr $
+ "sqlite worker thread crashed: " ++ show e
+ Right True -> go
+ Right False -> return ()
getjob :: IO (Either BlockedIndefinitelyOnMVar Job)
getjob = try $ takeMVar jobs
@@ -157,15 +161,21 @@ workerThread db tablename jobs =
-- Exception is thrown when the MVar is garbage
-- collected, which means the whole DbHandle
-- is not used any longer. Shutdown cleanly.
- Left BlockedIndefinitelyOnMVar -> return ()
- Right CloseJob -> return ()
+ Left BlockedIndefinitelyOnMVar -> return False
+ Right CloseJob -> return False
Right (QueryJob a) -> a >> loop
- Right (ChangeJob a) -> a >> loop
+ Right (ChangeJob a) -> do
+ a
+ -- Exit this sqlite transaction so the
+ -- database gets updated on disk.
+ return True
-- Change is run in a separate database connection
-- since sqlite only supports a single writer at a
-- time, and it may crash the database connection
-- that the write is made to.
- Right (RobustChangeJob a) -> liftIO (a (runSqliteRobustly tablename db)) >> loop
+ Right (RobustChangeJob a) -> do
+ liftIO (a (runSqliteRobustly tablename db))
+ loop
-- like runSqlite, but calls settle on the raw sql Connection.
runSqliteRobustly :: TableName -> T.Text -> (SqlPersistM a) -> IO a