@@ -20,10 +20,13 @@ import Data.String.Regex (Regex) as Regex
20import Data.String.Regex.Flags (global) as Regex
20import Data.String.Regex.Flags (global) as Regex
21import Control.Monad.Except (except, runExcept)
21import Control.Monad.Except (except, runExcept)
22import Data.Either (Either(..), note)
22import Data.Either (Either(..), note)
23+import Data.List.Types (NonEmptyList)
24+import Data.Traversable (traverse)
25+import Effect.Exception (error) as Exception
23import Data.Map as Map
26import Data.Map as Map
24import Data.Symbol (class IsSymbol, reflectSymbol)
27import Data.Symbol (class IsSymbol, reflectSymbol)
25import Type.Function (type (#))
28import Type.Function (type (#))
26−import Effect.Aff (Aff)
29+import Effect.Aff (Aff, throwError)
27import Foreign (Foreign, ForeignError(..), unsafeToForeign)
30import Foreign (Foreign, ForeignError(..), unsafeToForeign)
28import Prim.Boolean (True, False)
31import Prim.Boolean (True, False)
29import Prim.Row (class Cons, class Lacks, class Union, class Nub) as Row
32import Prim.Row (class Cons, class Lacks, class Union, class Nub) as Row
@@ -3346,7 +3349,9 @@ runQuery conn params (Q q) = do
3346 let { sql, values } = replaceNamedParams (Array.length q.values) entries q.sql
3349 let { sql, values } = replaceNamedParams (Array.length q.values) entries q.sql
3347 let allValues = q.values <> values
3350 let allValues = q.values <> values
3348 result <- PG.query (PG.SQL sql) allValues conn
3351 result <- PG.query (PG.SQL sql) allValues conn
3349− pure (unsafeDecodeRows result.rows)
3352+ case decodeRows result.rows of
3353+ Left errs -> throwError (Exception.error ("Row decode failed: " <> show errs))
3354+ Right rows -> pure rows
3351runQueryOne
3356runQueryOne
3352 :: forall tables result params paramsRL stage
3357 :: forall tables result params paramsRL stage
@@ -3362,7 +3367,11 @@ runQueryOne conn params (Q q) = do
3362 let { sql, values } = replaceNamedParams (Array.length q.values) entries q.sql
3367 let { sql, values } = replaceNamedParams (Array.length q.values) entries q.sql
3363 let allValues = q.values <> values
3368 let allValues = q.values <> values
3364 result <- PG.queryOne (PG.SQL sql) allValues conn
3369 result <- PG.queryOne (PG.SQL sql) allValues conn
3365− pure (result <#> unsafeDecodeRow)
3370+ case result of
3371+ Nothing -> pure Nothing
3372+ Just row -> case decodeRow row of
3373+ Left errs -> throwError (Exception.error ("Row decode failed: " <> show errs))
3374+ Right a -> pure (Just a)
3367runExecute
3376runExecute
3368 :: forall tables params paramsRL stage
3377 :: forall tables params paramsRL stage
@@ -3394,7 +3403,9 @@ runQueryTx txn params (Q q) = do
3394 let { sql, values } = replaceNamedParams (Array.length q.values) entries q.sql
3403 let { sql, values } = replaceNamedParams (Array.length q.values) entries q.sql
3395 let allValues = q.values <> values
3404 let allValues = q.values <> values
3396 result <- PG.txQuery (PG.SQL sql) allValues txn
3405 result <- PG.txQuery (PG.SQL sql) allValues txn
3397− pure (unsafeDecodeRows result.rows)
3406+ case decodeRows result.rows of
3407+ Left errs -> throwError (Exception.error ("Row decode failed: " <> show errs))
3408+ Right rows -> pure rows
3399runExecuteTx
3410runExecuteTx
3400 :: forall tables params paramsRL stage
3411 :: forall tables params paramsRL stage
@@ -3410,10 +3421,8 @@ runExecuteTx txn params (Q q) = do
3410 let allValues = q.values <> values
3421 let allValues = q.values <> values
3411 PG.txExecute (PG.SQL sql) allValues txn
3422 PG.txExecute (PG.SQL sql) allValues txn
3413−unsafeDecodeRows :: forall a. ReadForeign a => Array Foreign -> Array a
3424+decodeRows :: forall a. ReadForeign a => Array Foreign -> Either (NonEmptyList ForeignError) (Array a)
3414−unsafeDecodeRows = map unsafeDecodeRow
3425+decodeRows = traverse (readImpl >>> runExcept)
3416−unsafeDecodeRow :: forall a. ReadForeign a => Foreign -> a
3427+decodeRow :: forall a. ReadForeign a => Foreign -> Either (NonEmptyList ForeignError) a
3417−unsafeDecodeRow f = case runExcept (readImpl f) of
3428+decodeRow = readImpl >>> runExcept
3418− Left _ -> unsafeCoerce unit