commit 59d81cb4d7fed152c8a59577fbbb1bc6dc1a8796
Author: Simon Petit <nomisp96@hotmail.fr>
Date:   Wed Dec 11 08:34:53 2024 +0100

    init

diff --git a/_build/.actions/default/test/runtest-eb464c2ec169067f8d7f0844c0dbfa40 b/_build/.actions/default/test/runtest-eb464c2ec169067f8d7f0844c0dbfa40
new file mode 100644
index 0000000..e69de29
diff --git a/_build/.db b/_build/.db
new file mode 100644
index 0000000..4ee82b0
Binary files /dev/null and b/_build/.db differ
diff --git a/_build/.digest-db b/_build/.digest-db
new file mode 100644
index 0000000..7630836
Binary files /dev/null and b/_build/.digest-db differ
diff --git a/_build/.filesystem-clock b/_build/.filesystem-clock
new file mode 100644
index 0000000..c61f4a7
--- /dev/null
+++ b/_build/.filesystem-clock
@@ -0,0 +1 @@
+<dummy>
\ No newline at end of file
diff --git a/_build/.lock b/_build/.lock
new file mode 100644
index 0000000..e69de29
diff --git a/_build/.sandbox/.hg/requires b/_build/.sandbox/.hg/requires
new file mode 100644
index 0000000..387e851
--- /dev/null
+++ b/_build/.sandbox/.hg/requires
@@ -0,0 +1 @@
+Escaping the Dune sandbox
\ No newline at end of file
diff --git a/_build/default/.dune/configurator b/_build/default/.dune/configurator
new file mode 100644
index 0000000..19708df
--- /dev/null
+++ b/_build/default/.dune/configurator
@@ -0,0 +1,2 @@
+(ocamlc /usr/bin/ocamlc.opt)
+(ocaml_config_vars (afl_instrument false) (architecture amd64) (asm x86_64-linux-gnu-as) (asm_cfi_supported true) (ast_impl_magic_number Caml1999M030) (ast_intf_magic_number Caml1999N030) (bytecomp_c_compiler "x86_64-linux-gnu-gcc -O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security -D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2") (bytecomp_c_libraries "-lm  -lpthread") (c_compiler x86_64-linux-gnu-gcc) (ccomp_type cc) (cma_magic_number Caml1999A030) (cmi_magic_number Caml1999I030) (cmo_magic_number Caml1999O030) (cmt_magic_number Caml1999T030) (cmx_magic_number Caml1999Y030) (cmxa_magic_number Caml1999Z030) (cmxs_magic_number Caml1999D030) (default_executable_name a.out) (default_safe_string true) (exec_magic_number Caml1999X030) (ext_asm .s) (ext_dll .so) (ext_exe "") (ext_lib .a) (ext_obj .o) (flambda false) (flat_float_array true) (function_sections true) (host x86_64-pc-linux-gnu) (int_size 63) (linear_magic_number Caml1999L030) (model default) (native_c_compiler "x86_64-linux-gnu-gcc -O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security -D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2") (native_c_libraries "-lm ") (native_pack_linker "x86_64-linux-gnu-ld -r -o ") (ocamlc_cflags "-O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security") (ocamlc_cppflags "-D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2") (ocamlopt_cflags "-O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security") (ocamlopt_cppflags "-D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2") (os_type Unix) (ranlib x86_64-linux-gnu-ranlib) (safe_string true) (standard_library /usr/lib/ocaml) (standard_library_default /usr/lib/ocaml) (supports_shared_libraries true) (system linux) (systhread_supported true) (target x86_64-pc-linux-gnu) (version 4.13.1) (windows_unicode false) (with_frame_pointers false) (word_size 64))
diff --git a/_build/default/.dune/configurator.v2 b/_build/default/.dune/configurator.v2
new file mode 100644
index 0000000..6fe4a49
--- /dev/null
+++ b/_build/default/.dune/configurator.v2
@@ -0,0 +1 @@
+((6:ocamlc19:/usr/bin/ocamlc.opt)(17:ocaml_config_vars((14:afl_instrument5:false)(12:architecture5:amd64)(3:asm19:x86_64-linux-gnu-as)(17:asm_cfi_supported4:true)(21:ast_impl_magic_number12:Caml1999M030)(21:ast_intf_magic_number12:Caml1999N030)(19:bytecomp_c_compiler241:x86_64-linux-gnu-gcc -O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security -D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2)(20:bytecomp_c_libraries14:-lm  -lpthread)(10:c_compiler20:x86_64-linux-gnu-gcc)(10:ccomp_type2:cc)(16:cma_magic_number12:Caml1999A030)(16:cmi_magic_number12:Caml1999I030)(16:cmo_magic_number12:Caml1999O030)(16:cmt_magic_number12:Caml1999T030)(16:cmx_magic_number12:Caml1999Y030)(17:cmxa_magic_number12:Caml1999Z030)(17:cmxs_magic_number12:Caml1999D030)(23:default_executable_name5:a.out)(19:default_safe_string4:true)(17:exec_magic_number12:Caml1999X030)(7:ext_asm2:.s)(7:ext_dll3:.so)(7:ext_exe0:)(7:ext_lib2:.a)(7:ext_obj2:.o)(7:flambda5:false)(16:flat_float_array4:true)(17:function_sections4:true)(4:host19:x86_64-pc-linux-gnu)(8:int_size2:63)(19:linear_magic_number12:Caml1999L030)(5:model7:default)(17:native_c_compiler241:x86_64-linux-gnu-gcc -O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security -D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2)(18:native_c_libraries4:-lm )(18:native_pack_linker26:x86_64-linux-gnu-ld -r -o )(13:ocamlc_cflags165:-O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security)(15:ocamlc_cppflags54:-D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2)(15:ocamlopt_cflags165:-O2 -fno-strict-aliasing -fwrapv -pthread -fPIC -g -O2 -ffile-prefix-map=/build/ocaml-SC7b9w/ocaml-4.13.1=. -fstack-protector-strong -Wformat -Werror=format-security)(17:ocamlopt_cppflags54:-D_FILE_OFFSET_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2)(7:os_type4:Unix)(6:ranlib23:x86_64-linux-gnu-ranlib)(11:safe_string4:true)(16:standard_library14:/usr/lib/ocaml)(24:standard_library_default14:/usr/lib/ocaml)(25:supports_shared_libraries4:true)(6:system5:linux)(19:systhread_supported4:true)(6:target19:x86_64-pc-linux-gnu)(7:version6:4.13.1)(15:windows_unicode5:false)(19:with_frame_pointers5:false)(9:word_size2:64))))
\ No newline at end of file
diff --git a/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/_ppx.ml-gen b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/_ppx.ml-gen
new file mode 100644
index 0000000..e3cba40
--- /dev/null
+++ b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/_ppx.ml-gen
@@ -0,0 +1 @@
+let () = Ppxlib.Driver.standalone ()
diff --git a/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmi b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmi
new file mode 100644
index 0000000..4d2aff5
Binary files /dev/null and b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmi differ
diff --git a/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmo b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmo
new file mode 100644
index 0000000..ce5f6a8
Binary files /dev/null and b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmo differ
diff --git a/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmx b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmx
new file mode 100644
index 0000000..f60cc87
Binary files /dev/null and b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.cmx differ
diff --git a/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.o b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.o
new file mode 100644
index 0000000..1247e7a
Binary files /dev/null and b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/dune__exe___ppx.o differ
diff --git a/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/ppx.exe b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/ppx.exe
new file mode 100755
index 0000000..7a49f48
Binary files /dev/null and b/_build/default/.ppx/e047dd045732eb45a5c5aa4a3855a525/ppx.exe differ
diff --git a/_build/default/META.metadata_store b/_build/default/META.metadata_store
new file mode 100644
index 0000000..e69de29
diff --git a/_build/default/bin/.merlin-conf/exe-main b/_build/default/bin/.merlin-conf/exe-main
new file mode 100644
index 0000000..aa769de
Binary files /dev/null and b/_build/default/bin/.merlin-conf/exe-main differ
diff --git a/_build/default/bin/main.ml b/_build/default/bin/main.ml
new file mode 100644
index 0000000..faeb25c
--- /dev/null
+++ b/_build/default/bin/main.ml
@@ -0,0 +1,4 @@
+open Metadata_store 
+
+(* Example usage *)
+let () = init_db "host=localhost dbname=metastore user=youruser password=yourpassword"
diff --git a/_build/default/bin/main.mli b/_build/default/bin/main.mli
new file mode 100644
index 0000000..335ae1f
--- /dev/null
+++ b/_build/default/bin/main.mli
@@ -0,0 +1 @@
+(* Auto-generated by Dune *)
\ No newline at end of file
diff --git a/_build/default/lib/.merlin-conf/lib-metadata_store b/_build/default/lib/.merlin-conf/lib-metadata_store
new file mode 100644
index 0000000..7586840
Binary files /dev/null and b/_build/default/lib/.merlin-conf/lib-metadata_store differ
diff --git a/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmi b/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmi
new file mode 100644
index 0000000..9d0a7d8
Binary files /dev/null and b/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmi differ
diff --git a/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmo b/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmo
new file mode 100644
index 0000000..d800443
Binary files /dev/null and b/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmo differ
diff --git a/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmt b/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmt
new file mode 100644
index 0000000..b8a866d
Binary files /dev/null and b/_build/default/lib/.metadata_store.objs/byte/metadata_store.cmt differ
diff --git a/_build/default/lib/.metadata_store.objs/byte/metadata_store__Init.cmt b/_build/default/lib/.metadata_store.objs/byte/metadata_store__Init.cmt
new file mode 100644
index 0000000..a89eceb
Binary files /dev/null and b/_build/default/lib/.metadata_store.objs/byte/metadata_store__Init.cmt differ
diff --git a/_build/default/lib/.metadata_store.objs/metadata_store__Init.impl.all-deps b/_build/default/lib/.metadata_store.objs/metadata_store__Init.impl.all-deps
new file mode 100644
index 0000000..e69de29
diff --git a/_build/default/lib/.metadata_store.objs/metadata_store__Init.impl.d b/_build/default/lib/.metadata_store.objs/metadata_store__Init.impl.d
new file mode 100644
index 0000000..1226207
--- /dev/null
+++ b/_build/default/lib/.metadata_store.objs/metadata_store__Init.impl.d
@@ -0,0 +1 @@
+lib/init.pp.ml: List PGOCaml Printf
diff --git a/_build/default/lib/.metadata_store.objs/native/metadata_store.cmx b/_build/default/lib/.metadata_store.objs/native/metadata_store.cmx
new file mode 100644
index 0000000..c0292d6
Binary files /dev/null and b/_build/default/lib/.metadata_store.objs/native/metadata_store.cmx differ
diff --git a/_build/default/lib/.metadata_store.objs/native/metadata_store.o b/_build/default/lib/.metadata_store.objs/native/metadata_store.o
new file mode 100644
index 0000000..4729841
Binary files /dev/null and b/_build/default/lib/.metadata_store.objs/native/metadata_store.o differ
diff --git a/_build/default/lib/init.ml b/_build/default/lib/init.ml
new file mode 100644
index 0000000..e863991
--- /dev/null
+++ b/_build/default/lib/init.ml
@@ -0,0 +1,99 @@
+let () =
+  let dbh = PGOCaml.connect () in
+  (* Define DDL statements for each table *)
+  let ddl_statements = [
+    "CREATE TABLE IF NOT EXISTS Databases (
+      id SERIAL PRIMARY KEY,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW()
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Schemas (
+      id SERIAL PRIMARY KEY,
+      database_id INT NOT NULL,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (database_id) REFERENCES Databases (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Tables (
+      id SERIAL PRIMARY KEY,
+      schema_id INT NOT NULL,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      is_partitioned BOOLEAN DEFAULT FALSE,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (schema_id) REFERENCES Schemas (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Columns (
+      id SERIAL PRIMARY KEY,
+      table_id INT NOT NULL,
+      name VARCHAR(255) NOT NULL,
+      data_type VARCHAR(50) NOT NULL,
+      is_nullable BOOLEAN DEFAULT TRUE,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (table_id) REFERENCES Tables (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Partitions (
+      id SERIAL PRIMARY KEY,
+      table_id INT NOT NULL,
+      partition_key VARCHAR(255) NOT NULL,
+      partition_value VARCHAR(255) NOT NULL,
+      created_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (table_id) REFERENCES Tables (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Users (
+      id SERIAL PRIMARY KEY,
+      username VARCHAR(255) UNIQUE NOT NULL,
+      email VARCHAR(255) UNIQUE NOT NULL,
+      role VARCHAR(50) DEFAULT 'user',
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW()
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Permissions (
+      id SERIAL PRIMARY KEY,
+      user_id INT NOT NULL,
+      resource_type VARCHAR(50) NOT NULL,
+      resource_id INT NOT NULL,
+      access_type VARCHAR(50) NOT NULL,
+      granted_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (user_id) REFERENCES Users (id) ON DELETE CASCADE
+    )";
+  ] in
+
+  (* Execute each DDL statement *)
+  let execute_ddl dbh ddl =
+    [%pgsql dbh "execute" "CREATE TABLE IF NOT EXISTS Databases (
+      id SERIAL PRIMARY KEY,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW()
+    )"]
+  in
+
+  let () =
+    try
+      List.iter (execute_ddl dbh) ddl_statements;
+      Printf.printf "Database initialized successfully.\n"
+    with
+    | PGOCaml.Error err ->
+        Printf.eprintf "Error initializing database: %s\n" (PGOCaml.string_of_error err)
+    | exn ->
+        Printf.eprintf "Unexpected error: %s\n" (Printexc.to_string exn)
+  in
+
+  (* Close the connection *)
+  PGOCaml.close dbh
+
diff --git a/_build/default/lib/metadata_store.ml-gen b/_build/default/lib/metadata_store.ml-gen
new file mode 100644
index 0000000..c05e234
--- /dev/null
+++ b/_build/default/lib/metadata_store.ml-gen
@@ -0,0 +1,4 @@
+(* generated by dune *)
+
+(** @canonical Metadata_store.Init *)
+module Init = Metadata_store__Init
diff --git a/_build/default/metadata_store.dune-package b/_build/default/metadata_store.dune-package
new file mode 100644
index 0000000..8d783bd
--- /dev/null
+++ b/_build/default/metadata_store.dune-package
@@ -0,0 +1,4 @@
+(lang dune 3.16)
+(name metadata_store)
+(sections (lib .) (bin ../../bin))
+(files (lib (META dune-package opam)) (bin (metadata_store)))
diff --git a/_build/default/metadata_store.opam b/_build/default/metadata_store.opam
new file mode 100644
index 0000000..b296c11
--- /dev/null
+++ b/_build/default/metadata_store.opam
@@ -0,0 +1,31 @@
+# This file is generated by dune, edit dune-project instead
+opam-version: "2.0"
+synopsis: "A short synopsis"
+description: "A longer description"
+maintainer: ["Maintainer Name"]
+authors: ["Author Name"]
+license: "LICENSE"
+tags: ["topics" "to describe" "your" "project"]
+homepage: "https://github.com/username/reponame"
+doc: "https://url/to/documentation"
+bug-reports: "https://github.com/username/reponame/issues"
+depends: [
+  "ocaml"
+  "dune" {>= "3.16"}
+  "odoc" {with-doc}
+]
+build: [
+  ["dune" "subst"] {dev}
+  [
+    "dune"
+    "build"
+    "-p"
+    name
+    "-j"
+    jobs
+    "@install"
+    "@runtest" {with-test}
+    "@doc" {with-doc}
+  ]
+]
+dev-repo: "git+https://github.com/username/reponame.git"
diff --git a/_build/default/test/.merlin-conf/exe-test_metadata_store b/_build/default/test/.merlin-conf/exe-test_metadata_store
new file mode 100644
index 0000000..248b37e
Binary files /dev/null and b/_build/default/test/.merlin-conf/exe-test_metadata_store differ
diff --git a/_build/default/test/.test_metadata_store.eobjs/byte/dune__exe__Test_metadata_store.cmi b/_build/default/test/.test_metadata_store.eobjs/byte/dune__exe__Test_metadata_store.cmi
new file mode 100644
index 0000000..18819d5
Binary files /dev/null and b/_build/default/test/.test_metadata_store.eobjs/byte/dune__exe__Test_metadata_store.cmi differ
diff --git a/_build/default/test/.test_metadata_store.eobjs/byte/dune__exe__Test_metadata_store.cmti b/_build/default/test/.test_metadata_store.eobjs/byte/dune__exe__Test_metadata_store.cmti
new file mode 100644
index 0000000..5f22e30
Binary files /dev/null and b/_build/default/test/.test_metadata_store.eobjs/byte/dune__exe__Test_metadata_store.cmti differ
diff --git a/_build/default/test/.test_metadata_store.eobjs/native/dune__exe__Test_metadata_store.cmx b/_build/default/test/.test_metadata_store.eobjs/native/dune__exe__Test_metadata_store.cmx
new file mode 100644
index 0000000..d989349
Binary files /dev/null and b/_build/default/test/.test_metadata_store.eobjs/native/dune__exe__Test_metadata_store.cmx differ
diff --git a/_build/default/test/.test_metadata_store.eobjs/native/dune__exe__Test_metadata_store.o b/_build/default/test/.test_metadata_store.eobjs/native/dune__exe__Test_metadata_store.o
new file mode 100644
index 0000000..311c58a
Binary files /dev/null and b/_build/default/test/.test_metadata_store.eobjs/native/dune__exe__Test_metadata_store.o differ
diff --git a/_build/default/test/test_metadata_store.exe b/_build/default/test/test_metadata_store.exe
new file mode 100755
index 0000000..1121e55
Binary files /dev/null and b/_build/default/test/test_metadata_store.exe differ
diff --git a/_build/default/test/test_metadata_store.ml b/_build/default/test/test_metadata_store.ml
new file mode 100644
index 0000000..e69de29
diff --git a/_build/default/test/test_metadata_store.mli b/_build/default/test/test_metadata_store.mli
new file mode 100644
index 0000000..335ae1f
--- /dev/null
+++ b/_build/default/test/test_metadata_store.mli
@@ -0,0 +1 @@
+(* Auto-generated by Dune *)
\ No newline at end of file
diff --git a/_build/install/default/lib/metadata_store/META b/_build/install/default/lib/metadata_store/META
new file mode 120000
index 0000000..e156ac0
--- /dev/null
+++ b/_build/install/default/lib/metadata_store/META
@@ -0,0 +1 @@
+../../../../default/META.metadata_store
\ No newline at end of file
diff --git a/_build/install/default/lib/metadata_store/dune-package b/_build/install/default/lib/metadata_store/dune-package
new file mode 120000
index 0000000..1e83b31
--- /dev/null
+++ b/_build/install/default/lib/metadata_store/dune-package
@@ -0,0 +1 @@
+../../../../default/metadata_store.dune-package
\ No newline at end of file
diff --git a/_build/install/default/lib/metadata_store/opam b/_build/install/default/lib/metadata_store/opam
new file mode 120000
index 0000000..ce27bcf
--- /dev/null
+++ b/_build/install/default/lib/metadata_store/opam
@@ -0,0 +1 @@
+../../../../default/metadata_store.opam
\ No newline at end of file
diff --git a/_build/log b/_build/log
new file mode 100644
index 0000000..4d4c891
--- /dev/null
+++ b/_build/log
@@ -0,0 +1,27 @@
+# dune build
+# OCAMLPARAM: unset
+# Shared cache: disabled
+# Shared cache location: /home/simon/.cache/dune/db
+# Workspace root: /home/simon/Documents/metadata_store
+# Auto-detected concurrency: 4
+# Dune context:
+#  { name = "default"
+#  ; kind = "default"
+#  ; profile = Dev
+#  ; merlin = true
+#  ; fdo_target_exe = None
+#  ; build_dir = In_build_dir "default"
+#  ; instrument_with = []
+#  }
+$ /usr/bin/ocamlc.opt -config > /tmp/dune_45b47b_output
+$ (cd _build/.sandbox/0ad8d6c85f98cad7a074d690c83848a3/default && .ppx/e047dd045732eb45a5c5aa4a3855a525/ppx.exe --cookie 'library-name="metadata_store"' -o lib/init.pp.ml --impl lib/init.ml -corrected-suffix .ppx-corrected -diff-cmd - -dump-ast)
+> File "lib/init.ml", lines 77-83, characters 4-7:
+> 77 | ....[%pgsql dbh "execute" "CREATE TABLE IF NOT EXISTS Databases (
+> 78 |       id SERIAL PRIMARY KEY,
+> 79 |       name VARCHAR(255) NOT NULL,
+> 80 |       description TEXT,
+> 81 |       created_at TIMESTAMP DEFAULT NOW(),
+> 82 |       updated_at TIMESTAMP DEFAULT NOW()
+> 83 |     )"]
+> Error: PG'OCaml PPX error: Could not make the connection host=unix, port=5432, user=simon, password=*****, database=simon, error: PGOCaml_generic.Make(Thread).Error("PGOCaml: Could not connect to database")
+[1]
diff --git a/bin/dune b/bin/dune
new file mode 100644
index 0000000..a681e6e
--- /dev/null
+++ b/bin/dune
@@ -0,0 +1,4 @@
+(executable
+ (public_name metadata_store)
+ (name main)
+ (libraries metadata_store))
diff --git a/bin/main.ml b/bin/main.ml
new file mode 100644
index 0000000..faeb25c
--- /dev/null
+++ b/bin/main.ml
@@ -0,0 +1,4 @@
+open Metadata_store 
+
+(* Example usage *)
+let () = init_db "host=localhost dbname=metastore user=youruser password=yourpassword"
diff --git a/dune-project b/dune-project
new file mode 100644
index 0000000..7bc53bb
--- /dev/null
+++ b/dune-project
@@ -0,0 +1,26 @@
+(lang dune 3.16)
+
+(name metadata_store)
+
+(generate_opam_files true)
+
+(source
+ (github username/reponame))
+
+(authors "Author Name")
+
+(maintainers "Maintainer Name")
+
+(license LICENSE)
+
+(documentation https://url/to/documentation)
+
+(package
+ (name metadata_store)
+ (synopsis "A short synopsis")
+ (description "A longer description")
+ (depends ocaml dune)
+ (tags
+  (topics "to describe" your project)))
+
+; See the complete stanza docs at https://dune.readthedocs.io/en/stable/reference/dune-project/index.html
diff --git a/lib/dune b/lib/dune
new file mode 100644
index 0000000..5061135
--- /dev/null
+++ b/lib/dune
@@ -0,0 +1,5 @@
+(library
+ (modules init)
+ (libraries pgocaml pgocaml_ppx)
+ (preprocess (pps pgocaml_ppx))
+ (name metadata_store))
diff --git a/lib/init.ml b/lib/init.ml
new file mode 100644
index 0000000..e863991
--- /dev/null
+++ b/lib/init.ml
@@ -0,0 +1,99 @@
+let () =
+  let dbh = PGOCaml.connect () in
+  (* Define DDL statements for each table *)
+  let ddl_statements = [
+    "CREATE TABLE IF NOT EXISTS Databases (
+      id SERIAL PRIMARY KEY,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW()
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Schemas (
+      id SERIAL PRIMARY KEY,
+      database_id INT NOT NULL,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (database_id) REFERENCES Databases (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Tables (
+      id SERIAL PRIMARY KEY,
+      schema_id INT NOT NULL,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      is_partitioned BOOLEAN DEFAULT FALSE,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (schema_id) REFERENCES Schemas (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Columns (
+      id SERIAL PRIMARY KEY,
+      table_id INT NOT NULL,
+      name VARCHAR(255) NOT NULL,
+      data_type VARCHAR(50) NOT NULL,
+      is_nullable BOOLEAN DEFAULT TRUE,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (table_id) REFERENCES Tables (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Partitions (
+      id SERIAL PRIMARY KEY,
+      table_id INT NOT NULL,
+      partition_key VARCHAR(255) NOT NULL,
+      partition_value VARCHAR(255) NOT NULL,
+      created_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (table_id) REFERENCES Tables (id) ON DELETE CASCADE
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Users (
+      id SERIAL PRIMARY KEY,
+      username VARCHAR(255) UNIQUE NOT NULL,
+      email VARCHAR(255) UNIQUE NOT NULL,
+      role VARCHAR(50) DEFAULT 'user',
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW()
+    )";
+
+    "CREATE TABLE IF NOT EXISTS Permissions (
+      id SERIAL PRIMARY KEY,
+      user_id INT NOT NULL,
+      resource_type VARCHAR(50) NOT NULL,
+      resource_id INT NOT NULL,
+      access_type VARCHAR(50) NOT NULL,
+      granted_at TIMESTAMP DEFAULT NOW(),
+      FOREIGN KEY (user_id) REFERENCES Users (id) ON DELETE CASCADE
+    )";
+  ] in
+
+  (* Execute each DDL statement *)
+  let execute_ddl dbh ddl =
+    [%pgsql dbh "execute" "CREATE TABLE IF NOT EXISTS Databases (
+      id SERIAL PRIMARY KEY,
+      name VARCHAR(255) NOT NULL,
+      description TEXT,
+      created_at TIMESTAMP DEFAULT NOW(),
+      updated_at TIMESTAMP DEFAULT NOW()
+    )"]
+  in
+
+  let () =
+    try
+      List.iter (execute_ddl dbh) ddl_statements;
+      Printf.printf "Database initialized successfully.\n"
+    with
+    | PGOCaml.Error err ->
+        Printf.eprintf "Error initializing database: %s\n" (PGOCaml.string_of_error err)
+    | exn ->
+        Printf.eprintf "Unexpected error: %s\n" (Printexc.to_string exn)
+  in
+
+  (* Close the connection *)
+  PGOCaml.close dbh
+
diff --git a/metadata_store.opam b/metadata_store.opam
new file mode 100644
index 0000000..b296c11
--- /dev/null
+++ b/metadata_store.opam
@@ -0,0 +1,31 @@
+# This file is generated by dune, edit dune-project instead
+opam-version: "2.0"
+synopsis: "A short synopsis"
+description: "A longer description"
+maintainer: ["Maintainer Name"]
+authors: ["Author Name"]
+license: "LICENSE"
+tags: ["topics" "to describe" "your" "project"]
+homepage: "https://github.com/username/reponame"
+doc: "https://url/to/documentation"
+bug-reports: "https://github.com/username/reponame/issues"
+depends: [
+  "ocaml"
+  "dune" {>= "3.16"}
+  "odoc" {with-doc}
+]
+build: [
+  ["dune" "subst"] {dev}
+  [
+    "dune"
+    "build"
+    "-p"
+    name
+    "-j"
+    jobs
+    "@install"
+    "@runtest" {with-test}
+    "@doc" {with-doc}
+  ]
+]
+dev-repo: "git+https://github.com/username/reponame.git"
diff --git a/test/dune b/test/dune
new file mode 100644
index 0000000..357f356
--- /dev/null
+++ b/test/dune
@@ -0,0 +1,2 @@
+(test
+ (name test_metadata_store))
diff --git a/test/test_metadata_store.ml b/test/test_metadata_store.ml
new file mode 100644
index 0000000..e69de29