100 lines
3.0 KiB
OCaml
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
|
|
|