ffffng/server/db/database.js

84 lines
2.4 KiB
JavaScript
Raw Normal View History

2016-05-20 22:11:35 +02:00
'use strict';
const util = require('util');
const fs = require('graceful-fs');
const glob = util.promisify(require('glob'));
const path = require('path');
2016-05-20 22:11:35 +02:00
const config = require('../config');
const Logger = require('../logger');
2016-05-20 22:38:13 +02:00
async function applyPatch(db, file) {
2016-05-24 21:08:34 +02:00
Logger.tag('database', 'migration').info('Checking if patch need to be applied: %s', file);
2016-05-24 16:40:57 +02:00
const contents = await util.promisify(fs.readFile)(file);
const version = path.basename(file, '.sql');
2016-05-20 22:11:35 +02:00
const row = await db.get('SELECT * FROM schema_version WHERE version = ?', version);
if (row) {
// patch is already applied. skip!
Logger.tag('database', 'migration').info('Patch already applied, skipping: %s', file);
return
}
2016-05-20 22:11:35 +02:00
const sql = 'BEGIN TRANSACTION;\n' +
contents.toString() + '\n' +
'INSERT INTO schema_version (version) VALUES (\'' + version + '\');\n' +
'END TRANSACTION;';
2016-05-24 16:40:57 +02:00
await db.exec(sql);
2016-05-24 16:40:57 +02:00
Logger.tag('database', 'migration').info('Patch successfully applied: %s', file);
2016-05-20 22:11:35 +02:00
}
async function applyMigrations(db) {
2016-05-24 16:40:57 +02:00
Logger.tag('database', 'migration').info('Migrating database...');
const sql = 'BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS schema_version (\n' +
2017-05-06 17:31:34 +02:00
' version VARCHAR(255) PRIMARY KEY ASC,\n' +
' applied_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL\n' +
'); END TRANSACTION;';
await db.exec(sql);
const files = await glob(__dirname + '/patches/*.sql');
for (const file of files) {
await applyPatch(db, file)
}
}
async function init() {
const SQLite3 = require('sqlite3');
const file = config.server.databaseFile;
Logger.tag('database').info('Setting up database: %s', file);
let db;
try {
db = new SQLite3.Database(file);
}
catch (error) {
Logger.tag('database').error('Error initialzing database:', error);
throw error;
}
db.on('profile', (sql, time) => Logger.tag('database').profile('[%sms]\t%s', time, sql));
try {
await applyMigrations(db);
}
catch (error) {
Logger.tag('database').error('Error migrating database:', error);
throw error;
}
// WARNING: We have to use funtion() syntax here, to satisfy ng-di. m(
return angular.module('ffffng').factory('Database', function () {
return db;
2016-05-20 22:11:35 +02:00
});
}
module.exports = {
init
2016-05-20 22:11:35 +02:00
};