vif/examples/06-caqti/main.ml

75 lines
2.2 KiB
OCaml

#require "caqti-miou" ;;
#require "caqti-miou.unix" ;;
#require "caqti-driver-sqlite3" ;;
#require "vif" ;;
type cfg =
{ sw : Caqti_miou.Switch.t
; uri : Uri.t }
;;
let caqti =
let finally (module Conn : Caqti_miou.CONNECTION) = Conn.disconnect () in
Vif.D.device ~name:"caqti" ~finally [] @@ fun { sw; uri } ->
match Caqti_miou_unix.connect ~sw uri with
| Ok conn -> conn
| Error err ->
Logs.err (fun m -> m "%a" Caqti_error.pp err);
Fmt.failwith "%a" Caqti_error.pp err
;;
open Vif ;;
open Caqti_request.Infix ;;
let add req n server _cfg =
let (module Conn) = Vif.S.device caqti server in
let sql = Caqti_type.(int ->. unit) ("INSERT INTO t (f) VALUES (?)") in
match Conn.exec sql n with
| Ok () ->
let str = (Fmt.str "%d Added\n" n) in
let field = "content-type" in
let* () = Response.add ~field "text/plain; charset=utf-8" in
let* () = Response.with_string req str in
Response.respond `OK
| Error err ->
let str = Fmt.str "SQL error: %a" Caqti_error.pp err in
let* () = Response.with_string req str in
Response.respond `Internal_server_error
;;
let list req server _cfg =
let (module Conn) = Vif.S.device caqti server in
let sql = Caqti_type.(unit ->* int) ("SELECT f FROM t") in
match Conn.collect_list sql () with
| Ok lst ->
let str = Fmt.str "%a" Fmt.(Dump.list int) lst in
let field = "content-type" in
let* () = Response.add ~field "text/plain; charset=utf-8" in
let* () = Response.with_string req str in
Response.respond `OK
| Error err ->
let str = Fmt.str "SQL error: %a" Caqti_error.pp err in
let* () = Response.with_string req str in
Response.respond `Internal_server_error
;;
let default req target server _ =
let str = Fmt.str "%s not found\n" target in
let* () = Response.with_string req str in
Response.respond `Not_found
;;
let routes =
let open Vif.U in
let open Vif.R in
let open Vif.Content_type in
[ post any (rel / "add" /% Tyre.int /?? nil) --> add
; get (rel /?? nil) --> list ]
let () =
Miou_unix.run @@ fun () ->
Caqti_miou.Switch.run @@ fun sw ->
let uri = Uri.of_string "sqlite3:foo.sqlite?create=false" in
let cfg = { sw; uri } in
Vif.run ~default ~devices:Vif.Ds.[ caqti ] routes cfg
;;