From 1aa9f6992bd385cb5d8744df84c58af37c7a9622 Mon Sep 17 00:00:00 2001 From: marisa Date: Sun, 28 Jan 2024 23:34:13 -0300 Subject: [PATCH] WIP: migrations --- source/db/db.d | 38 ++++++++++++++++++++++++++++ source/db/migrations/m_001_initial.d | 25 ++++++++++++++++++ source/db/migrations/migration.d | 31 +++++++++++++++++++++++ source/db/types.d | 17 +++++++++++++ source/main.d | 1 + 5 files changed, 112 insertions(+) create mode 100644 source/db/migrations/m_001_initial.d create mode 100644 source/db/migrations/migration.d create mode 100644 source/db/types.d diff --git a/source/db/db.d b/source/db/db.d index 26ad5dc..34028bd 100644 --- a/source/db/db.d +++ b/source/db/db.d @@ -23,6 +23,7 @@ class DB { protected DBSettings m_settings; protected DataSource m_ds; protected Connection m_conn; + protected Statement m_stmt = null; this(DBSettings settings) { this.m_settings = settings; @@ -46,5 +47,42 @@ class DB { void connect() { this.m_ds = this.getDataSource(); this.m_conn = this.m_ds.getConnection(); + this.m_conn.setAutoCommit(false); + } + + int runUpdate(string statement) { + if (this.m_stmt is null) + this.m_stmt = this.m_conn.createStatement(); + + debugF!"Running update: %s"(statement); + + return this.m_stmt.executeUpdate(statement); + } + + ResultSet runQuery(string statement) { + if (this.m_stmt is null) + this.m_stmt = this.m_conn.createStatement(); + + debugF!"Running query: %s"(statement); + + return this.m_stmt.executeQuery(statement); + } + + void runMigrations() { + ResultSet rs = this.runQuery( + `select * from information_schema.tables where table_name = 'migrations';`, + ); + + bool exists = rs.next(); + int ret = 0; + + if (exists == false) { + ret |= this.runUpdate( + `create table migrations( + id serial, + name character varying + )`, + ); + } } } diff --git a/source/db/migrations/m_001_initial.d b/source/db/migrations/m_001_initial.d new file mode 100644 index 0000000..365d367 --- /dev/null +++ b/source/db/migrations/m_001_initial.d @@ -0,0 +1,25 @@ +module db.migrations.m_001_initial; + +import db.migrations.migration; + +Migration Initial = Migration( + [ + `create table users( + id uuid not null, + name character varying(255), + handle character varying(255), + local boolean not null, + ap_id character varying(255) not null, + ap_privkey text, + ap_pubkey text, + ap_shared_inbox text, + ap_inbox text, + ap_outbox text, + ap_followers_addr text, + ap_following_addr text + );` +], + [ + `drop table users;` +], +); diff --git a/source/db/migrations/migration.d b/source/db/migrations/migration.d new file mode 100644 index 0000000..1f5bb33 --- /dev/null +++ b/source/db/migrations/migration.d @@ -0,0 +1,31 @@ +module db.migrations.migration; + +import singletons; +import db.migrations.m_001_initial; + +struct Migration { + string[] upStatements; + string[] downStatements; + + bool up() { + int result; + + foreach (string statement; upStatements) + result |= Db.runUpdate(statement); + + return result == 0; + } + + bool down() { + int result; + + foreach (string statement; downStatements) + result |= Db.runUpdate(statement); + + return result == 0; + } +} + +Migration[string] migrations = [ + "001_initial": Initial, +]; diff --git a/source/db/types.d b/source/db/types.d new file mode 100644 index 0000000..cd026d7 --- /dev/null +++ b/source/db/types.d @@ -0,0 +1,17 @@ +module db.types; + +class User { + string id; + string name; + string handle; + bool local; + + string ap_id; + string ap_privkey; + string ap_pubkey; + string ap_shared_inbox; + string ap_inbox; + string ap_outbox; + string ap_followers_addr; + string ap_following_addr; +} diff --git a/source/main.d b/source/main.d index d520425..fede4a0 100644 --- a/source/main.d +++ b/source/main.d @@ -40,6 +40,7 @@ int main() { Db = DB.getDB(dbSettings); Db.connect(); + Db.runMigrations(); return 0; }