mirror of
https://github.com/nikita-volkov/hasql.git
synced 2024-12-26 20:12:09 +03:00
Merge pull request #158 from domenkozar/queryerror-displayException
QueryError: add displayException
This commit is contained in:
commit
92007d724f
@ -10,6 +10,7 @@
|
|||||||
-- * Row-by-row fetching.
|
-- * Row-by-row fetching.
|
||||||
module Hasql.Private.Errors where
|
module Hasql.Private.Errors where
|
||||||
|
|
||||||
|
import qualified Data.ByteString.Char8 as BC
|
||||||
import Hasql.Private.Prelude
|
import Hasql.Private.Prelude
|
||||||
|
|
||||||
-- |
|
-- |
|
||||||
@ -19,7 +20,68 @@ data QueryError
|
|||||||
= QueryError ByteString [Text] CommandError
|
= QueryError ByteString [Text] CommandError
|
||||||
deriving (Show, Eq, Typeable)
|
deriving (Show, Eq, Typeable)
|
||||||
|
|
||||||
instance Exception QueryError
|
instance Exception QueryError where
|
||||||
|
displayException (QueryError query params commandError) =
|
||||||
|
let queryContext :: Maybe (ByteString, Int)
|
||||||
|
queryContext = case commandError of
|
||||||
|
ClientError _ -> Nothing
|
||||||
|
ResultError resultError -> case resultError of
|
||||||
|
ServerError _ message _ _ (Just position) -> Just (message, position)
|
||||||
|
_ -> Nothing
|
||||||
|
|
||||||
|
-- find the line number and position of the error
|
||||||
|
findLineAndPos :: ByteString -> Int -> (Int, Int)
|
||||||
|
findLineAndPos byteString errorPos =
|
||||||
|
let (_, line, pos) =
|
||||||
|
BC.foldl'
|
||||||
|
( \(total, line, pos) c ->
|
||||||
|
case total + 1 of
|
||||||
|
0 -> (total, line, pos)
|
||||||
|
cursor
|
||||||
|
| cursor == errorPos -> (-1, line, pos + 1)
|
||||||
|
| c == '\n' -> (total + 1, line + 1, 0)
|
||||||
|
| otherwise -> (total + 1, line, pos + 1)
|
||||||
|
)
|
||||||
|
(0, 1, 0)
|
||||||
|
byteString
|
||||||
|
in (line, pos)
|
||||||
|
|
||||||
|
formatErrorContext :: ByteString -> ByteString -> Int -> ByteString
|
||||||
|
formatErrorContext query message errorPos =
|
||||||
|
let lines = BC.lines query
|
||||||
|
(lineNum, linePos) = findLineAndPos query errorPos
|
||||||
|
in BC.unlines (take lineNum lines)
|
||||||
|
<> BC.replicate (linePos - 1) ' '
|
||||||
|
<> "^ "
|
||||||
|
<> message
|
||||||
|
|
||||||
|
prettyQuery :: ByteString
|
||||||
|
prettyQuery = case queryContext of
|
||||||
|
Nothing -> query
|
||||||
|
Just (message, pos) -> formatErrorContext query message pos
|
||||||
|
in "QueryError!\n"
|
||||||
|
<> "\n Query:\n"
|
||||||
|
<> BC.unpack prettyQuery
|
||||||
|
<> "\n"
|
||||||
|
<> "\n Params: "
|
||||||
|
<> show params
|
||||||
|
<> "\n Error: "
|
||||||
|
<> case commandError of
|
||||||
|
ClientError (Just message) -> "Client error: " <> show message
|
||||||
|
ClientError Nothing -> "Unknown client error"
|
||||||
|
ResultError resultError -> case resultError of
|
||||||
|
ServerError code message details hint position ->
|
||||||
|
"Server error "
|
||||||
|
<> BC.unpack code
|
||||||
|
<> ": "
|
||||||
|
<> BC.unpack message
|
||||||
|
<> maybe "" (\d -> "\n Details: " <> BC.unpack d) details
|
||||||
|
<> maybe "" (\h -> "\n Hint: " <> BC.unpack h) hint
|
||||||
|
UnexpectedResult message -> "Unexpected result: " <> show message
|
||||||
|
RowError row column rowError ->
|
||||||
|
"Row error: " <> show row <> ":" <> show column <> " " <> show rowError
|
||||||
|
UnexpectedAmountOfRows amount ->
|
||||||
|
"Unexpected amount of rows: " <> show amount
|
||||||
|
|
||||||
-- |
|
-- |
|
||||||
-- An error of some command in the session.
|
-- An error of some command in the session.
|
||||||
|
Loading…
Reference in New Issue
Block a user