diff --git a/integration-tests/sqlite/src/Main.gren b/integration-tests/sqlite/src/Main.gren index b93fe21..c2cc4fc 100644 --- a/integration-tests/sqlite/src/Main.gren +++ b/integration-tests/sqlite/src/Main.gren @@ -54,7 +54,7 @@ tests fsPerm = , awaitError "syntax error" (Sqlite.executeScript db "SELECT *") <| \err -> test "Is right type" <| \_ -> when err is - Sqlite.GenericError _ -> + Sqlite.Error _ -> Expect.pass _ -> @@ -62,18 +62,14 @@ tests fsPerm = , awaitError "Define friends" (defineFriendsById 1 2 db) <| \err -> test "Fails due to foreign key constraints" <| \_ -> when err is - Sqlite.ForeignKeyError message -> - if String.contains "foreign key" (String.toLower message) then - Expect.pass - - else - Expect.fail "Correct error type, but message doesn't mention foreign key" + Sqlite.ConstraintError Sqlite.ForeignKeyConstraintError -> + Expect.pass _ -> Expect.fail "Failed for unknown reason" , awaitError "Too many templates" (execBadTemplate 3 db) <| \err -> test "Is invalid" <| \_ -> - Expect.equal (Sqlite.GenericError "Unknown named parameter 'id1'") err + Expect.equal (Sqlite.Error "Unknown named parameter 'id1'") err , await "Closing the database" (Sqlite.close db) <| \_ -> test "Works" <| \_ -> Expect.pass @@ -203,11 +199,11 @@ tests fsPerm = , awaitError "Define same friends again" (defineFriends robin.name justin.name db) <| \err -> test "Fails due to unique constraint" <| \_ -> when err is - Sqlite.UniqueConstraintError _ -> + Sqlite.ConstraintError Sqlite.UniqueConstraintError -> Expect.pass _ -> - Expect.fail ("Expected UniqueConstraintError, but got: " ++ Sqlite.errorToString err) + Expect.fail ("Expected UniqueConstraintError") ] ] , await "Open db for executeAll tests" createTestDb <| \db -> diff --git a/src/Gren/Kernel/Sqlite.js b/src/Gren/Kernel/Sqlite.js index b193a46..0905fda 100644 --- a/src/Gren/Kernel/Sqlite.js +++ b/src/Gren/Kernel/Sqlite.js @@ -1,6 +1,6 @@ /* -import Sqlite exposing (GenericError, ForeignKeyError, UniqueConstraintError, DecodingError, MultipleResultsError) +import Sqlite exposing (errorCodeToError, DecodingError, MultipleResultsError) import Gren.Kernel.FilePath exposing (toString) import Gren.Kernel.Scheduler exposing (binding, succeed, fail) import Gren.Kernel.Json exposing (wrap, unwrap) @@ -255,13 +255,7 @@ var _Sqlite_executeScript = F2(function (script, db) { }); var _Sqlite_constructError = function (e) { - if (e.errcode === 787) { - return __Scheduler_fail(__Sqlite_ForeignKeyError(e.message)); - } - - if (e.errcode === 2067) { - return __Scheduler_fail(__Sqlite_UniqueConstraintError(e.message)); - } - - return __Scheduler_fail(__Sqlite_GenericError(e.message)); + return __Scheduler_fail( + A3(__Sqlite_errorCodeToError, e.code, e.errcode, e.message), + ); }; diff --git a/src/Sqlite.gren b/src/Sqlite.gren index 08f84b5..4a49d7e 100644 --- a/src/Sqlite.gren +++ b/src/Sqlite.gren @@ -218,33 +218,511 @@ inTransaction db f = -- ERRORS --- TODO: How detailed should we be with errors? +{-|-} type Error - = GenericError String + = AbortError AbortError + | AuthError AuthError + | BusyError BusyError + | CantOpenError CantOpenError + | ConstraintError ConstraintError + | CorruptError CorruptError + | Error String + | IoError IoError + | LockedError LockedError + | MismatchError + | MisuseError + | NoLfsError + | NoMemError + | NotADbError + | NotFoundError + | NoticeError NoticeError + | PermError + | ProtocolError + | RangeError + | ReadOnlyError ReadOnlyError + | FullError + | InternalError + | InterruptError + | TooBigError | NoResultsError + | SchemaError | MultipleResultsError Int - | ForeignKeyError String - | UniqueConstraintError String | DecodingError Decode.Error -errorToString : Error -> String -errorToString error = - when error is - GenericError s -> - s +{-|-} +type AbortError + = GenericAbortError String + | RollbackAbortError + + +{-|-} +type AuthError + = GenericAuthError String + | UserAuthError + + +{-|-} +type BusyError + = GenericBusyError String + | RecoveryBusyError + | SnapshotBusyError + | TimeoutBusyError + + +{-|-} +type CantOpenError + = GenericCantOpenError String + | ConvPathCantOpenError + | DirtyWalCantOpenError + | FullPathCantOpenError + | IsDirCantOpenError + | NoTempDirCantOpenError + | SymLinkCantOpenError + + +{-|-} +type ConstraintError + = GenericConstraintError String + | CheckConstraintError + | CommitHookConstraintError + | DataTypeConstraintError + | ForeignKeyConstraintError + | FunctionConstraintError + | NotNullConstraintError + | PinnedConstraintError + | PrimaryKeyConstraintError + | RowIdConstraintError + | TriggerConstraintError + | UniqueConstraintError + | VTabConstraintError + + +{-|-} +type CorruptError + = GenericCorruptError String + | IndexCorruptError + | SequenceCorruptError + | VTabCorruptError + + +{-|-} +type IoError + = GenericIoError String + | AccessIoError + | AuthIoError + | BeginAtomicIoError + | BlockedIoError + | CheckReservedLockIoError + | CloseIoError + | CommitAtomicIoError + | ConvPathIoError + | CorruptFsIoError + | DataIoError + | DeleteIoError + | DeleteNoEntIoError + | DirectoryCloseIoError + | DirFSyncIoError + | FStatIoError + | FSyncIoError + | GetTempPathIoError + | LockIoError + | MMapIoError + | NoMemIoError + | RdLockIoError + | ReadIoError + | RollbackAtomicIoError + | SeekIoError + | ShmLockIoError + | ShmMapIoError + | ShmOpenIoError + | ShmSizeIoError + | ShortReadIoError + | TruncateIoError + | UnlockIoError + | VNodeIoError + | WriteIoError + + +{-|-} +type LockedError + = GenericLockedError String + | SharedCacheLockedError + | VTabLockedError + + +{-|-} +type NoticeError + = GenericNoticeError String + | RecoverRollbackNoticeError + | RecoverWalNoticeError + + +{-|-} +type ReadOnlyError + = GenericReadOnlyError String + | CantInitReadOnlyError + | CantLockReadOnlyError + | DbMovedReadOnlyError + | DirectoryReadOnlyError + | RecoveryReadOnlyError + | RollbackReadOnlyError + + +{-|-} +errorCodeToError : String -> Int -> String -> Error +errorCodeToError errorType errorCode message = + when errorType is + "ERR_INVALID_STATE" -> + Error message + + "ERR_SQLITE_ERROR" -> + when errorCode is + -- Abort errors + + 4 -> + AbortError (GenericAbortError message) + + 516 -> + AbortError RollbackAbortError + + -- Auth errors + + 23 -> + AuthError (GenericAuthError message) + + 279 -> + AuthError UserAuthError + + -- Busy errors + + 5 -> + BusyError (GenericBusyError message) + + 261 -> + BusyError RecoveryBusyError + + 517 -> + BusyError SnapshotBusyError + + 773 -> + BusyError TimeoutBusyError + + -- Can't open errors + + 14 -> + CantOpenError (GenericCantOpenError message) - NoResultsError -> - "Expected a result but got none." + 1038 -> + CantOpenError ConvPathCantOpenError - MultipleResultsError n -> - "Expected one result but got " ++ String.fromInt n + 1294 -> + CantOpenError DirtyWalCantOpenError - ForeignKeyError s -> - "Foreign key error: " ++ s + 782 -> + CantOpenError FullPathCantOpenError - UniqueConstraintError s -> - "Unique constraint error: " ++ s + 526 -> + CantOpenError IsDirCantOpenError - DecodingError e -> - "Error decoding results: " ++ Decode.errorToString e + 270 -> + CantOpenError NoTempDirCantOpenError + + 1550 -> + CantOpenError SymLinkCantOpenError + + -- Constraint errors + + 19 -> + ConstraintError (GenericConstraintError message) + + 275 -> + ConstraintError CheckConstraintError + + 531 -> + ConstraintError CommitHookConstraintError + + 3091 -> + ConstraintError DataTypeConstraintError + + 787 -> + ConstraintError ForeignKeyConstraintError + + 1043 -> + ConstraintError FunctionConstraintError + + 1299 -> + ConstraintError NotNullConstraintError + + 2835 -> + ConstraintError PrimaryKeyConstraintError + + 1555 -> + ConstraintError PrimaryKeyConstraintError + + 2579 -> + ConstraintError RowIdConstraintError + + 1811 -> + ConstraintError TriggerConstraintError + + 2067 -> + ConstraintError UniqueConstraintError + + 2323 -> + ConstraintError VTabConstraintError + + -- Corrupt errors + + 11 -> + CorruptError (GenericCorruptError message) + + 779 -> + CorruptError IndexCorruptError + + 523 -> + CorruptError SequenceCorruptError + + 267 -> + CorruptError VTabCorruptError + + -- Error + + 1 -> + Error message + + 257 -> + Error message + + 513 -> + Error message + + 769 -> + Error message + + -- Full error + + 13 -> + FullError + + -- Internal error + + 2 -> + InternalError + + -- Interrupt Error + + 9 -> + InterruptError + + -- IO errors + + 10 -> + IoError (GenericIoError message) + + 3338 -> + IoError AccessIoError + + 7178 -> + IoError AuthIoError + + 7434 -> + IoError BeginAtomicIoError + + 2826 -> + IoError BlockedIoError + + 3594 -> + IoError CheckReservedLockIoError + + 4106 -> + IoError CloseIoError + + 7690 -> + IoError CommitAtomicIoError + + 6666 -> + IoError ConvPathIoError + + 8458 -> + IoError CorruptFsIoError + + 8202 -> + IoError DataIoError + + 2570 -> + IoError DeleteIoError + + 5898 -> + IoError DeleteNoEntIoError + + 4362 -> + IoError CloseIoError + + 1290 -> + IoError DirFSyncIoError + + 1802 -> + IoError FStatIoError + + 1034 -> + IoError FSyncIoError + + 6410 -> + IoError GetTempPathIoError + + 3850 -> + IoError LockIoError + + 6154 -> + IoError MMapIoError + + 3082 -> + IoError NoMemIoError + + 2314 -> + IoError RdLockIoError + + 266 -> + IoError ReadIoError + + 7946 -> + IoError RollbackAtomicIoError + + 5642 -> + IoError SeekIoError + + 5130 -> + IoError ShmLockIoError + + 5386 -> + IoError ShmMapIoError + + 4618 -> + IoError ShmOpenIoError + + 4874 -> + IoError ShmSizeIoError + + 522 -> + IoError ShortReadIoError + + 1546 -> + IoError TruncateIoError + + 2058 -> + IoError UnlockIoError + + 6922 -> + IoError VNodeIoError + + 778 -> + IoError WriteIoError + + -- Locked errors + + 6 -> + LockedError (GenericLockedError message) + + 262 -> + LockedError SharedCacheLockedError + + 518 -> + LockedError VTabLockedError + + -- Mismatch error + + 20 -> + MismatchError + + -- Misuse error + + 21 -> + MisuseError + + -- No LFS error + + 22 -> + NoLfsError + + -- No memory error + + 7 -> + NoMemError + + -- Not a DB error + + 26 -> + NotADbError + + -- Not found error + + 12 -> + NotFoundError + + -- Notice errors + + 27 -> + NoticeError (GenericNoticeError message) + + 539 -> + NoticeError RecoverRollbackNoticeError + + 283 -> + NoticeError RecoverWalNoticeError + + -- Perm error + + 3 -> + PermError + + -- Protocol error + + 15 -> + ProtocolError + + -- Range error + + 25 -> + RangeError + + -- Read only errors + + 8 -> + ReadOnlyError (GenericReadOnlyError message) + + 1288 -> + ReadOnlyError CantInitReadOnlyError + + 520 -> + ReadOnlyError CantLockReadOnlyError + + 1032 -> + ReadOnlyError DbMovedReadOnlyError + + 1544 -> + ReadOnlyError DirectoryReadOnlyError + + 264 -> + ReadOnlyError RecoveryReadOnlyError + + 776 -> + ReadOnlyError RollbackReadOnlyError + + -- Schema error + + 17 -> + SchemaError + + -- Too big error + + 18 -> + TooBigError + + -- All other errors (unknown) + + _ -> + Error message + + _ -> + Error message