@@ -21,7 +21,8 @@ import Data.Either (isRight)
2121import Data.Maybe (fromMaybe)
2222import qualified Data.List as L
2323import Control.Exception.Base
24−import qualified Data.Text.IO as TIO
24+import qualified Data.ByteString as BS
25+import qualified Data.Text.Encoding as TE
2526import Data.ByteString (ByteString)
2627import Data.Monoid
2728import qualified Crypto.Hash.SHA256 as SHA256
@@ -200,7 +201,7 @@ writeGraphTransactionIdFile sync destDirectory (TransactionGraph _ transSet) = w
200201
201202readGraphTransactionIdFileDigest :: FilePath -> IO LockFileHash
202203readGraphTransactionIdFileDigest dbdir = do
203− let graphTransactionIdData = TIO.readFile (transactionLogPath dbdir)
204+ let graphTransactionIdData = readUTF8FileOrError (transactionLogPath dbdir)
204205 SHA256.hash . encodeUtf8 <$> graphTransactionIdData
205206
206207readGraphTransactionIdFile :: FilePath -> IO (Either PersistenceError [(TransactionId, UTCTime, [TransactionId])])
@@ -210,5 +211,15 @@ readGraphTransactionIdFile dbdir = do
210211 (readUUID tid, readEpoch epochText, map readUUID parentIds)
211212 readUUID uuidText = fromMaybe (error "failed to read uuid") (U.fromText uuidText)
212213 readEpoch t = posixSecondsToUTCTime (realToFrac (either (error "failed to read epoch") fst (double t)))
213− Right . map grapher . T.lines <$> TIO.readFile (transactionLogPath dbdir)
214+ Right . map grapher . T.lines <$> readUTF8FileOrError (transactionLogPath dbdir)
214215
216+--rationale- reading essential database files must fail hard
217+readUTF8FileOrError :: FilePath -> IO (T.Text)
218+readUTF8FileOrError pathIn = do
219+ eFileBytes <- try (BS.readFile pathIn) :: IO (Either IOError BS.ByteString)
220+ case eFileBytes of
221+ Left err -> error (show err)
222+ Right fileBytes ->
223+ case TE.decodeUtf8' fileBytes of
224+ Left err -> error (show err)
225+ Right utf8Bytes -> pure utf8Bytes