From eea37b3df527119ea0bc9cf52c4eae9436b2219d Mon Sep 17 00:00:00 2001 From: chiko Date: Mon, 3 Nov 2025 00:22:01 +0000 Subject: [PATCH 1/2] Fixing the uid Column isn't unique. uid is required to be unique for the the Changed Events (with the new Data) to be inserted without creating new Rows. --- run/db_migration_v0.1.3.ts | 39 +++++++++++++++++++ sql/events/events_create_unique_index_uid.sql | 1 + sql/events/events_delete_duplicate_rows.sql | 6 +++ sql/events/events_find_duplicate_uid.sql | 4 ++ sql/sql_migration_v0.1.3.sql | 29 ++++++++++++++ src/component/event/events.ts | 12 +++--- src/sql.ts | 2 + 7 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 run/db_migration_v0.1.3.ts create mode 100644 sql/events/events_create_unique_index_uid.sql create mode 100644 sql/events/events_delete_duplicate_rows.sql create mode 100644 sql/events/events_find_duplicate_uid.sql create mode 100644 sql/sql_migration_v0.1.3.sql diff --git a/run/db_migration_v0.1.3.ts b/run/db_migration_v0.1.3.ts new file mode 100644 index 0000000..60aea85 --- /dev/null +++ b/run/db_migration_v0.1.3.ts @@ -0,0 +1,39 @@ +import db from "../src/sql"; + +const run_migration = db.transaction(() => { + // SQL 1: Insert a new user + db.run(`DELETE FROM events + WHERE rowid NOT IN ( + SELECT MIN(rowid) + FROM events + GROUP BY uid + );`); + + // SQL 2: Update product stock + db.run(`CREATE TABLE events_new ( + "event_uid" INTEGER PRIMARY KEY, + "uid" TEXT NOT NULL UNIQUE, + "title" TEXT NOT NULL, + "date_at" DATETIME NOT NULL, + "time_start" TEXT NOT NULL, + "time_end" TEXT NOT NULL, + "posted_by" TEXT NOT NULL, + "location" TEXT NOT NULL, + "event_type" TEXT NOT NULL, + "link" TEXT NOT NULL, + "description" TEXT NOT NULL, + "timezone" TEXT NOT NULL, + "notification" TEXT NOT NULL, + "deleteDate" INTEGER NULL + );`); + + // SQL 3: Log the transaction + db.run(`INSERT INTO events_new (event_uid, uid, title, date_at, time_start, time_end, posted_by, location, event_type, link, description, timezone, notification, deleteDate) + SELECT event_uid, uid, title, date_at, time_start, time_end, posted_by, location, event_type, link, description, timezone, notification, deleteDate FROM events; + `); + db.run(`DROP TABLE events; + ALTER TABLE events_new RENAME TO events;`); +}); + +// Run the transaction +run_migration(); \ No newline at end of file diff --git a/sql/events/events_create_unique_index_uid.sql b/sql/events/events_create_unique_index_uid.sql new file mode 100644 index 0000000..c928e12 --- /dev/null +++ b/sql/events/events_create_unique_index_uid.sql @@ -0,0 +1 @@ +CREATE UNIQUE INDEX idx_events_uid ON events(uid); \ No newline at end of file diff --git a/sql/events/events_delete_duplicate_rows.sql b/sql/events/events_delete_duplicate_rows.sql new file mode 100644 index 0000000..b1f1234 --- /dev/null +++ b/sql/events/events_delete_duplicate_rows.sql @@ -0,0 +1,6 @@ +DELETE FROM events +WHERE rowid NOT IN ( + SELECT MIN(rowid) + FROM events + GROUP BY uid +); \ No newline at end of file diff --git a/sql/events/events_find_duplicate_uid.sql b/sql/events/events_find_duplicate_uid.sql new file mode 100644 index 0000000..331fd14 --- /dev/null +++ b/sql/events/events_find_duplicate_uid.sql @@ -0,0 +1,4 @@ +SELECT uid, COUNT(*) AS count +FROM events +GROUP BY uid +HAVING COUNT(*) > 1; \ No newline at end of file diff --git a/sql/sql_migration_v0.1.3.sql b/sql/sql_migration_v0.1.3.sql new file mode 100644 index 0000000..ae309e4 --- /dev/null +++ b/sql/sql_migration_v0.1.3.sql @@ -0,0 +1,29 @@ +DELETE FROM events +WHERE rowid NOT IN ( + SELECT MIN(rowid) + FROM events + GROUP BY uid +); + +CREATE TABLE events_new ( + "event_uid" INTEGER PRIMARY KEY, + "uid" TEXT NOT NULL UNIQUE, + "title" TEXT NOT NULL, + "date_at" DATETIME NOT NULL, + "time_start" TEXT NOT NULL, + "time_end" TEXT NOT NULL, + "posted_by" TEXT NOT NULL, + "location" TEXT NOT NULL, + "event_type" TEXT NOT NULL, + "link" TEXT NOT NULL, + "description" TEXT NOT NULL, + "timezone" TEXT NOT NULL, + "notification" TEXT NOT NULL, + "deleteDate" INTEGER NULL +); + +INSERT INTO events_new (event_uid, uid, title, date_at, time_start, time_end, posted_by, location, event_type, link, description, timezone, notification, deleteDate) +SELECT event_uid, uid, title, date_at, time_start, time_end, posted_by, location, event_type, link, description, timezone, notification, deleteDate FROM events; + +DROP TABLE events; +ALTER TABLE events_new RENAME TO events; \ No newline at end of file diff --git a/src/component/event/events.ts b/src/component/event/events.ts index 59ea846..489efb6 100644 --- a/src/component/event/events.ts +++ b/src/component/event/events.ts @@ -42,9 +42,9 @@ export class Event implements TEventEntity { deleteDate: TEventEntity["deleteDate"]; static createTable (db: Database): void { - const query = db.query(`CREATE TABLE IF NOT EXISTS "events" ( - "event_uid" INTEGER NOT NULL, - "uid" TEXT NOT NULL, + const query = db.query(`CREATE TABLE IF NOT EXISTS "events" + "event_uid" INTEGER PRIMARY KEY, + "uid" TEXT NOT NULL UNIQUE, "title" TEXT NOT NULL, "date_at" DATETIME NOT NULL, "time_start" TEXT NOT NULL, @@ -56,10 +56,8 @@ export class Event implements TEventEntity { "description" TEXT NOT NULL, "timezone" TEXT NOT NULL, "notification" TEXT NOT NULL, - "deleteDate" INTEGER NULL, - PRIMARY KEY ("event_uid") - ); - CREATE UNIQUE INDEX "sqlite_autoindex_events_1" ON "events" ("uid");`); + "deleteDate" INTEGER NULL + );`); query.run(); } diff --git a/src/sql.ts b/src/sql.ts index 6d55878..9429e98 100644 --- a/src/sql.ts +++ b/src/sql.ts @@ -8,6 +8,8 @@ console.log(db_filepath); export const db = new Database(db_filepath); +export default db; + export function init () { Event.createTable(db); } -- 2.49.1 From 16593e0281342fe16d5d788b42f59b81ab2dca9e Mon Sep 17 00:00:00 2001 From: chiko Date: Mon, 3 Nov 2025 00:24:42 +0000 Subject: [PATCH 2/2] Fixed Syntax Error --- src/component/event/events.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/component/event/events.ts b/src/component/event/events.ts index 489efb6..b4ef02b 100644 --- a/src/component/event/events.ts +++ b/src/component/event/events.ts @@ -42,7 +42,7 @@ export class Event implements TEventEntity { deleteDate: TEventEntity["deleteDate"]; static createTable (db: Database): void { - const query = db.query(`CREATE TABLE IF NOT EXISTS "events" + const query = db.query(`CREATE TABLE IF NOT EXISTS "events" ( "event_uid" INTEGER PRIMARY KEY, "uid" TEXT NOT NULL UNIQUE, "title" TEXT NOT NULL, -- 2.49.1