diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | bin/dune | 21 | ||||
-rw-r--r-- | bin/mainlite.ml | 40 | ||||
-rw-r--r-- | flake.nix | 114 | ||||
-rw-r--r-- | litedb/dune | 12 | ||||
-rw-r--r-- | litedb/query.ml | 71 |
6 files changed, 196 insertions, 63 deletions
@@ -1,3 +1,4 @@ .direnv _build gatling +bulkdata @@ -1,8 +1,7 @@ (executable (public_name combattant) (name main) - (flags - (:standard -cclib -static -cclib -no-pie)) + (modules main) (libraries combattant piaf @@ -10,4 +9,20 @@ eio_main logs.fmt fmt.tty - logs.threaded)) + logs.threaded + caqti-driver-postgresql)) + +(executable + (public_name sordb) + (name mainlite) + (modules mainlite) + (libraries + litedb + combattant + piaf + routes + eio_main + logs.fmt + fmt.tty + logs.threaded + caqti-driver-sqlite3)) diff --git a/bin/mainlite.ml b/bin/mainlite.ml new file mode 100644 index 0000000..3fd7e0f --- /dev/null +++ b/bin/mainlite.ml @@ -0,0 +1,40 @@ +open Eio +open Piaf + +let setup_log ?style_renderer level = + Logs_threaded.enable (); + Fmt_tty.setup_std_outputs ?style_renderer (); + Logs.set_level ~all:true level; + Logs.set_reporter (Logs_fmt.reporter ()) +;; + +let request_handler ~db_pool Server.{ request; _ } = + match Combattant.Router.match_route request.meth request.target with + | Some handler -> Result.get_ok @@ handler db_pool request + | None -> + Logs.info (fun d -> d "Não encontrei %S\n" request.target); + Response.create `Not_found +;; + +let () = + setup_log (Some Logs.Info); + Eio_main.run + @@ fun env -> + Switch.run + @@ fun sw -> + let config = + let interface = Net.Ipaddr.V4.any in + let port = 4455 in + `Tcp (interface, port) + in + let config = Server.Config.create config in + let db_uri = + Uri.make ~scheme:"sqlite3" ~path:"/home/y/code/ocaml/combattant/bulkdata/blog.db" () + in + match Caqti_eio_unix.connect_pool ~sw ~stdenv:(env :> Caqti_eio.stdenv) db_uri with + | Ok pool -> + let server = Server.create ~config (request_handler ~db_pool:pool) in + ignore @@ Server.Command.start ~sw env server + | Error err -> + Logs.err (fun m -> m "Error connecting to database: %a" Caqti_error.pp err) +;; @@ -4,69 +4,63 @@ nixpkgs.url = "github:nix-ocaml/nix-overlays"; }; - outputs = { self, nixpkgs, flake-utils }: - flake-utils.lib.eachDefaultSystem (system: - let - pkgs = nixpkgs.legacyPackages.${system}.appendOverlays [ - (self: super: { - ocamlPackages = super.ocaml-ng.ocamlPackages_5_1.overrideScope' - (oself: osuper: { - pg_query = osuper.pg_query.overrideAttrs (prev: { - propagatedBuildInputs = prev.propagatedBuildInputs - ++ [ osuper.cmdliner ]; - }); + outputs = { + self, + nixpkgs, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = nixpkgs.legacyPackages.${system}.appendOverlays [ + (self: super: { + ocamlPackages = + super.ocaml-ng.ocamlPackages_5_1.overrideScope' + (oself: osuper: { + pg_query = osuper.pg_query.overrideAttrs (prev: { + propagatedBuildInputs = + prev.propagatedBuildInputs + ++ [osuper.cmdliner]; }); - }) - ]; - - pkgs' = pkgs.pkgsCross.musl64; - - combattant = pkgs'.ocamlPackages.buildDunePackage { - pname = "combattant"; - version = "0.0.1"; - src = ./.; - buildInputs = with pkgs'.ocamlPackages; [ - ppx_rapper - ppx_rapper_eio - yojson - eio_main - piaf - routes - caqti-driver-postgresql - ppx_expect - - logs - ]; - }; + }); + }) + ]; - in { - devShells.default = pkgs'.mkShell rec { - nativeBuildInputs = with pkgs'.ocamlPackages; [ - dune_3 - findlib - ocaml - ocaml-lsp - ocamlformat - pkgs.openjdk17 - ]; + combattant = pkgs.ocamlPackages.buildDunePackage { + pname = "combattant"; + version = "0.0.1"; + src = ./.; + buildInputs = with pkgs.ocamlPackages; [ + ppx_rapper + ppx_rapper_eio + yojson + eio_main + piaf + routes + caqti-dynload + caqti-driver-postgresql + caqti-driver-sqlite3 + pkgs.sqlite + ppx_expect - buildInputs = combattant.buildInputs - ++ (with pkgs'.ocamlPackages; [ utop ]); - }; - - packages.default = combattant; + logs + ]; + }; + in { + devShells.default = pkgs.mkShell rec { + nativeBuildInputs = with pkgs.ocamlPackages; [ + dune_3 + findlib + ocaml + ocaml-lsp + ocamlformat + pkgs.openjdk17 + pkgs.sqlite + ]; - packages.docker = pkgs.dockerTools.buildImage { - name = "ghcr.io/molvrr/combattant"; - tag = "latest"; - copyToRoot = pkgs.buildEnv { - name = "image-root"; - paths = [ pkgs.bashInteractive pkgs.coreutils pkgs.curl combattant ]; - pathsToLink = [ "/bin" ]; - }; - config = { Cmd = [ "combattant" ]; }; - }; + buildInputs = + combattant.buildInputs + ++ (with pkgs.ocamlPackages; [utop]); + }; - formatter = pkgs.nixfmt; - }); + packages.default = combattant; + }); } diff --git a/litedb/dune b/litedb/dune new file mode 100644 index 0000000..61eb60b --- /dev/null +++ b/litedb/dune @@ -0,0 +1,12 @@ +(library + (name litedb) + (libraries + piaf + routes + yojson + caqti + caqti-driver-sqlite3 + caqti-eio + ppx_rapper_eio) + (preprocess + (pps ppx_rapper))) diff --git a/litedb/query.ml b/litedb/query.ml new file mode 100644 index 0000000..4929fdf --- /dev/null +++ b/litedb/query.ml @@ -0,0 +1,71 @@ +module Query = struct + let poasts = + [%rapper + get_many + {sql| + SELECT @int{id}, @string{title}, @string{content}, @string{date} + FROM Posts + ORDER BY id DESC LIMIT 100 + |sql}] + ;; + + let poast = + [%rapper + get_opt + {sql| + SELECT @int{id}, @string{title}, @string{content}, @string{date}, @string{tags}, @string{url} + FROM Posts + WHERE id = %int{post_id} + |sql}] + ;; + + let comment = + [%rapper + get_opt + {sql| + SELECT @int{id}, @string{content}, @string{date}, @string{tags}, @string{url} + FROM Comments + WHERE id = %int{id} + |sql}] + ;; + + let user_comments = + [%rapper + get_opt + {sql| + SELECT @int{id}, @string{content}, @string{date}, @string{tags}, @string{url} + FROM Comments + WHERE author = %string{username} + |sql}] + ;; + + let post_comments = + [%rapper + get_opt + {sql| + SELECT @int{id}, @string{content}, @string{date}, @string{tags}, @string{url} + FROM Comments + WHERE post_id = %int{post_id} + |sql}] + ;; + + let comment_children = + [%rapper + get_opt + {sql| + SELECT @int{id}, @string{content}, @string{date}, @string{tags}, @string{url} + FROM Comments + WHERE parent= %int{post_id} + |sql}] + ;; +end + +let get_poasts conn = Query.poast conn +let get_poast post_id conn = Query.poast ~post_id conn + +(* db.exec("PRAGMA journal_mode = WAL"); *) +(* db.exec("PRAGMA foreign_keys = ON"); *) +(* db.exec("PRAGMA cache_size = -8000"); // 8MB cache *) +(* db.exec("PRAGMA temp_store = MEMORY"); *) +(* db.exec("PRAGMA synchronous = NORMAL"); *) +(* db.exec("PRAGMA mmap_size = 30000000000"); // 30GB memory map *) |