let pg_server () =
  let cmdf fmt =
    ksprintf (fun s ->
        let ret = Sys.command s in
        if ret = 0 then () else failwith (sprintf "command %S returned %d" s ret)
      ) fmt in
  let dir =  "/tmp/trakeva_test/" in
  let port = try Sys.getenv "POSTGRESQL_PORT" |> int_of_string with _ -> 4242 in
  cmdf "rm -fr %s" dir;
  cmdf "mkdir -p %s" dir;
  cmdf "initdb -D %s" dir;
  cmdf "PGPORT=%d pg_ctl start -l %s/log -D %s" port dir dir;
  say "Starting postgresql test server on port %d with %s" port dir;
  let stop () = cmdf "PGPORT=%d pg_ctl -D %s -m fast stop" port dir in
  at_exit stop;
  object
    method stop = stop ()
    method status = cmdf "PGPORT=%d pg_ctl -D %s status" port dir
    method port = port
    method conninfo = sprintf "postgresql:///template1?port=%d" port
  end