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