From 6d3e391da8b8b25a84285a066a60237553891ae1 Mon Sep 17 00:00:00 2001 From: Jean-Paul Calderone <exarkun@twistedmatrix.com> Date: Fri, 11 Sep 2020 08:57:25 -0400 Subject: [PATCH] Simplify initialization error handling with bracketOnError --- src/PaymentServer/Persistence.hs | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/PaymentServer/Persistence.hs b/src/PaymentServer/Persistence.hs index 572fd16..dd30d76 100644 --- a/src/PaymentServer/Persistence.hs +++ b/src/PaymentServer/Persistence.hs @@ -18,6 +18,7 @@ import Control.Exception , throwIO , catch , bracket + , bracketOnError ) import Data.Text @@ -332,7 +333,7 @@ insertVoucherAndFingerprint dbConn (voucher, counter) fingerprint = sqlite :: Text -> IO VoucherDatabaseState sqlite path = let - initialize :: Sqlite.Connection -> IO () + initialize :: Sqlite.Connection -> IO Sqlite.Connection initialize dbConn = do let exec = Sqlite.execute_ dbConn exec "PRAGMA busy_timeout = 1000" @@ -340,18 +341,10 @@ sqlite path = Sqlite.withExclusiveTransaction dbConn $ do exec "CREATE TABLE IF NOT EXISTS vouchers (id INTEGER PRIMARY KEY, name TEXT UNIQUE)" exec "CREATE TABLE IF NOT EXISTS redeemed (id INTEGER PRIMARY KEY, voucher_id INTEGER, counter INTEGER, fingerprint TEXT, FOREIGN KEY (voucher_id) REFERENCES vouchers(id))" - - cleanup :: Sqlite.Connection -> Sqlite.SQLError -> IO () - cleanup dbConn e = do - -- Don't leak the open connection. - Sqlite.close dbConn - -- Propagate the exception - throwIO e + return dbConn connect :: IO Sqlite.Connection - connect = do - dbConn <- Sqlite.open (unpack path) - catch (initialize dbConn) (cleanup dbConn) - return dbConn + connect = + bracketOnError (Sqlite.open . unpack $ path) Sqlite.close initialize in return . SQLiteDB $ connect -- GitLab