43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.1 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) {
 | 
						|
		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
 |