diff --git a/.gitignore b/.gitignore index dbf16ae..897e386 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,11 @@ nimcache/ *.a # OS -.DS_Store \ No newline at end of file +.DS_Store + +# Temporary files +*.db + +# Compiled files +chat_sdk/* +!*.nim \ No newline at end of file diff --git a/chat_sdk.nimble b/chat_sdk.nimble index a64bb4f..6a66714 100644 --- a/chat_sdk.nimble +++ b/chat_sdk.nimble @@ -16,3 +16,6 @@ task buildSharedLib, "Build shared library for C bindings": task buildStaticLib, "Build static library for C bindings": exec "nim c --app:staticLib --out:../library/c-bindings/libchatsdk.a chat_sdk/chat_sdk.nim" + +task migrate, "Run database migrations": + exec "nim c -r chat_sdk/migration.nim" \ No newline at end of file diff --git a/chat_sdk/migration.nim b/chat_sdk/migration.nim new file mode 100644 index 0000000..31269ac --- /dev/null +++ b/chat_sdk/migration.nim @@ -0,0 +1,40 @@ +import os, osproc, sequtils, algorithm +import db_connector/db_sqlite + +proc ensureMigrationTable(db: DbConn) = + db.exec(sql""" + CREATE TABLE IF NOT EXISTS schema_migrations ( + filename TEXT PRIMARY KEY, + applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + """) + +proc hasMigrationRun(db: DbConn, filename: string): bool = + for row in db.fastRows(sql"SELECT 1 FROM schema_migrations WHERE filename = ?", filename): + return true + return false + +proc markMigrationRun(db: DbConn, filename: string) = + db.exec(sql"INSERT INTO schema_migrations (filename) VALUES (?)", filename) + +proc runMigrations*(db: DbConn, dir = "migrations") = + ensureMigrationTable(db) + let files = walkFiles(dir / "*.sql").toSeq().sorted() + for file in files: + if hasMigrationRun(db, file): + echo "Already applied: ", file + else: + echo "Applying: ", file + let sql = readFile(file) + db.exec(sql(sql)) + markMigrationRun(db, file) + +proc main() = + let db = open("test.db", "", "", "") + try: + runMigrations(db) + finally: + db.close() + +when isMainModule: + main() \ No newline at end of file diff --git a/migrations/README.md b/migrations/README.md new file mode 100644 index 0000000..2aca949 --- /dev/null +++ b/migrations/README.md @@ -0,0 +1,9 @@ +## Database Migrations + +This directory contains SQL migration files for the Nim Chat SDK. + +Each migration file should be named in the format `NNN_description.sql`, where `NNN` is a zero-padded number indicating the order of the migration. For example, `001_create_user_table.sql` is the first migration. + +## Running Migrations + +If you want to install a test sqlite database with tables setup, you can run `nimble migrate` from the command line. This will execute all migration files in order, ensuring that your database schema is up to date. \ No newline at end of file