geochan/src/caqti_db.ml

49 lines
1.2 KiB
OCaml
Raw Normal View History

2023-12-18 00:45:46 +01:00
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 ();
()