49 lines
1.2 KiB
OCaml
49 lines
1.2 KiB
OCaml
|
|
open Caqti_request.Infix
|
||
|
|
|
||
|
|
let map_err = function
|
||
|
|
| Error e -> Error (Err.Internal (Db (Caqti_error.show e)))
|
||
|
|
| Ok _ as ok -> ok
|
||
|
|
|
||
|
|
module Db = struct
|
||
|
|
module Db =
|
||
|
|
(val Caqti_blocking.connect Config_serv.db_uri |> Caqti_blocking.or_fail)
|
||
|
|
|
||
|
|
let exec q v = Db.exec q v |> map_err
|
||
|
|
|
||
|
|
let find q v = Db.find q v |> map_err
|
||
|
|
|
||
|
|
let find_opt q v = Db.find_opt q v |> map_err
|
||
|
|
|
||
|
|
let collect_list q v = Db.collect_list q v |> map_err
|
||
|
|
|
||
|
|
let exec_unsafe q v =
|
||
|
|
match Db.exec q v with
|
||
|
|
| Error e ->
|
||
|
|
Dream.error (fun log -> log "%s" (Caqti_error.show e));
|
||
|
|
exit 1
|
||
|
|
| Ok () -> ()
|
||
|
|
|
||
|
|
let do_transaction f =
|
||
|
|
let open Syntax in
|
||
|
|
let* () = Db.start () |> map_err in
|
||
|
|
match f () with
|
||
|
|
| Error _ as error ->
|
||
|
|
let* () = Db.rollback () |> map_err in
|
||
|
|
error
|
||
|
|
| Ok v ->
|
||
|
|
let* () = Db.commit () |> map_err in
|
||
|
|
Ok v
|
||
|
|
end
|
||
|
|
|
||
|
|
let set_foreign_keys_on = Caqti_type.(unit ->. unit) "PRAGMA foreign_keys = ON"
|
||
|
|
|
||
|
|
let create_dream_session =
|
||
|
|
Caqti_type.(unit ->. unit)
|
||
|
|
"CREATE TABLE IF NOT EXISTS dream_session (id TEXT PRIMARY KEY, label TEXT \
|
||
|
|
NOT NULL, expires_at REAL NOT NULL, payload TEXT NOT NULL)"
|
||
|
|
|
||
|
|
let () =
|
||
|
|
Db.exec_unsafe set_foreign_keys_on ();
|
||
|
|
Db.exec_unsafe create_dream_session ();
|
||
|
|
()
|