metadata_store/lib/init.ml
2024-12-11 08:34:53 +01:00

100 lines
3.0 KiB
OCaml

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