2025-02-02 12:29:07 +00:00
|
|
|
#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
|
|
|
|
;;
|
|
|
|
|
2025-02-13 16:17:00 +00:00
|
|
|
open Vif ;;
|
2025-02-02 12:29:07 +00:00
|
|
|
open Caqti_request.Infix ;;
|
|
|
|
|
|
|
|
let add req n server _cfg =
|
|
|
|
let (module Conn) = Vif.S.device caqti server in
|
2025-02-13 16:17:00 +00:00
|
|
|
let sql = Caqti_type.(int ->. unit) ("INSERT INTO t (f) VALUES (?)") in
|
|
|
|
match Conn.exec sql n with
|
2025-02-02 12:29:07 +00:00
|
|
|
| Ok () ->
|
2025-02-13 16:17:00 +00:00
|
|
|
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
|
2025-02-02 12:29:07 +00:00
|
|
|
| Error err ->
|
|
|
|
let str = Fmt.str "SQL error: %a" Caqti_error.pp err in
|
2025-02-13 16:17:00 +00:00
|
|
|
let* () = Response.with_string req str in
|
|
|
|
Response.respond `Internal_server_error
|
2025-02-02 12:29:07 +00:00
|
|
|
;;
|
|
|
|
|
|
|
|
let list req server _cfg =
|
|
|
|
let (module Conn) = Vif.S.device caqti server in
|
2025-02-13 16:17:00 +00:00
|
|
|
let sql = Caqti_type.(unit ->* int) ("SELECT f FROM t") in
|
|
|
|
match Conn.collect_list sql () with
|
2025-02-02 12:29:07 +00:00
|
|
|
| Ok lst ->
|
|
|
|
let str = Fmt.str "%a" Fmt.(Dump.list int) lst in
|
2025-02-13 16:17:00 +00:00
|
|
|
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
|
2025-02-02 12:29:07 +00:00
|
|
|
| Error err ->
|
|
|
|
let str = Fmt.str "SQL error: %a" Caqti_error.pp err in
|
2025-02-13 16:17:00 +00:00
|
|
|
let* () = Response.with_string req str in
|
|
|
|
Response.respond `Internal_server_error
|
2025-02-02 12:29:07 +00:00
|
|
|
;;
|
|
|
|
|
|
|
|
let routes =
|
|
|
|
let open Vif.U in
|
|
|
|
let open Vif.R in
|
2025-02-21 09:33:20 +00:00
|
|
|
let open Vif.T in
|
2025-02-02 12:29:07 +00:00
|
|
|
[ 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
|
2025-02-18 18:25:30 +00:00
|
|
|
Vif.run ~devices:Vif.Ds.[ caqti ] routes cfg
|
2025-02-02 12:29:07 +00:00
|
|
|
;;
|