diff --git a/src/Gren/Kernel/Sqlite.js b/src/Gren/Kernel/Sqlite.js index 80e212c..f346e0d 100644 --- a/src/Gren/Kernel/Sqlite.js +++ b/src/Gren/Kernel/Sqlite.js @@ -1,6 +1,6 @@ /* -import Sqlite exposing (GenericError, ForeignKeyError, UniqueConstraintError, DecodingError) +import Sqlite exposing (GenericError, ForeignKeyError, UniqueConstraintError, DecodingError, MultipleResultsError) import Gren.Kernel.FilePath exposing (toString) import Gren.Kernel.Scheduler exposing (binding, succeed, fail) import Gren.Kernel.Json exposing (wrap, unwrap) @@ -8,6 +8,7 @@ import Json.Decode as Decode exposing (decodeValue) import Result exposing (isOk) import Sqlite.Encode as SqliteEncode exposing (toJson) import Sqlite.Decode as SqliteDecode exposing (toJson) +import Maybe exposing (Just, Nothing) */ @@ -82,6 +83,41 @@ var _Sqlite_getAll = F2(function (query, db) { }); }); +var _Sqlite_getMaybeOne = F2(function (query, db) { + return __Scheduler_binding(function (callback) { + try { + const prepped = db.prepare(query.__$query); + const params = __Json_unwrap(__SqliteEncode_toJson(query.__$parameters)); + const rowDecoder = __SqliteDecode_toJson(query.__$rowDecoder); + const iterator = prepped.iterate(params); + + const value = iterator.next().value; + + if (!value) { + return callback(__Scheduler_succeed(__Maybe_Nothing)); + } + + if (!iterator.next().done) { + var count = 2; + for (const value of iterator) { + count++; + } + return callback(__Scheduler_fail(__Sqlite_MultipleResultsError(count))); + } + + const result = A2(__Decode_decodeValue, rowDecoder, _Json_wrap(value)); + + if (__Result_isOk(result)) { + callback(__Scheduler_succeed(__Maybe_Just(result.a))); + } else { + return callback(__Scheduler_fail(__Sqlite_DecodingError(result.a))); + } + } catch (e) { + callback(_Sqlite_constructError(e)); + } + }); +}); + var _Sqlite_executeMany = F3(function (statement, values, db) { return __Scheduler_binding(function (callback) { try { diff --git a/src/Sqlite.gren b/src/Sqlite.gren index cc660cc..68ca15f 100644 --- a/src/Sqlite.gren +++ b/src/Sqlite.gren @@ -76,36 +76,21 @@ type alias Query value = getOne : Database -> Query value -> Task Error value getOne db query = - getAll db query + Gren.Kernel.Sqlite.getMaybeOne query db |> Task.andThen (\results -> when results is - [] -> + Nothing -> Task.fail NoResultsError - [ value ] -> + Just value -> Task.succeed value - - _ -> - Task.fail (MultipleResultsError (Array.length results)) ) getMaybeOne : Database -> Query value -> Task Error (Maybe value) getMaybeOne db query = - getAll db query - |> Task.andThen - (\results -> - when results is - [] -> - Task.succeed Nothing - - [ value ] -> - Task.succeed (Just value) - - _ -> - Task.fail (MultipleResultsError (Array.length results)) - ) + Gren.Kernel.Sqlite.getMaybeOne query db getAll : Database -> Query value -> Task Error (Array value)