Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 37 additions & 1 deletion src/Gren/Kernel/Sqlite.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
/*

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)
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)

*/

Expand Down Expand Up @@ -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 {
Expand Down
23 changes: 4 additions & 19 deletions src/Sqlite.gren
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading