summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--bin/dune21
-rw-r--r--bin/mainlite.ml40
-rw-r--r--flake.nix114
-rw-r--r--litedb/dune12
-rw-r--r--litedb/query.ml71
6 files changed, 196 insertions, 63 deletions
diff --git a/.gitignore b/.gitignore
index fcbfd70..c9a6693 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
.direnv
_build
gatling
+bulkdata
diff --git a/bin/dune b/bin/dune
index 3978ff9..69ebf28 100644
--- a/bin/dune
+++ b/bin/dune
@@ -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)
+;;
diff --git a/flake.nix b/flake.nix
index d0080d5..899547c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -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 *)