import std / [options, times] import tiny_sqlite import dbUtils const migrations = [ """ CREATE TABLE schema_version ( version INTEGER NOT NULL ); CREATE TABLE url ( id INTEGER PRIMARY KEY, token TEXT NOT NULL UNIQUE, title TEXT NOT NULL, url TEXT, created DATE, expires DATE ); CREATE UNIQUE INDEX idx_url_token ON url(token); """, """ CREATE TABLE url2 ( id INTEGER PRIMARY KEY, token TEXT NOT NULL UNIQUE, title TEXT NOT NULL, url TEXT NOT NULL, created DATE NOT NULL, expires DATE NOT NULL ); INSERT INTO url2(id, token, title, url, created, expires) SELECT id, token, title, url, created, expires FROM url; DROP TABLE url; ALTER TABLE url2 RENAME TO url; CREATE UNIQUE INDEX idx_url_token ON url(token); """ ] const latestVersion = migrations.len proc Migrate*(db: DbConn): bool {.raises: [].} = var currentVersion: int try: currentVersion = db.value("SELECT version FROM schema_version;").get().fromDbValue(int) except SqliteError: discard if currentVersion != latestVersion: try: db.exec("BEGIN") for v in currentVersion..