43 lines
1.2 KiB
JavaScript
43 lines
1.2 KiB
JavaScript
// @ts-check
|
|
|
|
const fs = require("fs")
|
|
const {join} = require("path")
|
|
|
|
async function migrate(db) {
|
|
let files = fs.readdirSync(join(__dirname, "migrations"))
|
|
files = files.sort()
|
|
db.prepare("CREATE TABLE IF NOT EXISTS migration (filename TEXT NOT NULL)").run()
|
|
let progress = db.prepare("SELECT * FROM migration").pluck().get()
|
|
if (!progress) {
|
|
progress = ""
|
|
db.prepare("INSERT INTO migration VALUES ('')").run()
|
|
}
|
|
|
|
let migrationRan = false
|
|
|
|
for (const filename of files) {
|
|
/* c8 ignore next - we can't unit test this, but it's run on every real world bridge startup */
|
|
if (progress >= filename) continue
|
|
console.log(`Applying database migration ${filename}`)
|
|
if (filename.endsWith(".sql")) {
|
|
const sql = fs.readFileSync(join(__dirname, "migrations", filename), "utf8")
|
|
db.exec(sql)
|
|
} else if (filename.endsWith(".js")) {
|
|
await require("./" + join("migrations", filename))(db)
|
|
} else {
|
|
continue
|
|
}
|
|
|
|
migrationRan = true
|
|
db.transaction(() => {
|
|
db.prepare("DELETE FROM migration").run()
|
|
db.prepare("INSERT INTO migration VALUES (?)").run(filename)
|
|
})()
|
|
}
|
|
|
|
if (migrationRan) {
|
|
console.log("Database migrations all done.")
|
|
}
|
|
}
|
|
|
|
module.exports.migrate = migrate
|