diff --git a/README.md b/README.md index cddcc6a..2018270 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,13 @@ Follow the instructions after setup runs. ### Run the server ```bash -npm start +npm run start +``` +You can also run this to skip checking the database version on startup. +```bash +npm run start -- --skip-migrate +# don't forget to migrate manually when you update +npm run migrate ``` ## Contributing diff --git a/package.json b/package.json index f77afd1..840082b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "scripts": { "start": "ts-node src/index.ts", "user": "ts-node src/cli.ts", - "setup": "sh install/setup.sh" + "setup": "sh install/setup.sh", + "migrate": "ts-node src/migrate.ts" }, "repository": { "type": "git", diff --git a/src/cleanup.ts b/src/cleanup.ts index 00e55ae..56c9dc9 100644 --- a/src/cleanup.ts +++ b/src/cleanup.ts @@ -1,10 +1,42 @@ import * as db from "./database"; +import {readdirSync} from "fs"; -async function init() { +async function init(m?: boolean) { + if(!m){ + console.log('Checking database version.'); + var tmp: string[] = await db.query('show tables like \"db_meta\"'); + if(tmp.length === 0){ + console.log('No database version info, running initial migration.'); + await require('./db/0').run(); + await bringUpToDate(); + } + else { + await bringUpToDate(); + } + } + else { + console.log('Skipping database version check.'); + } //If satyr is restarted in the middle of a stream //it causes problems //Live flags in the database stay live await db.query('update user_meta set live=false'); } +async function bringUpToDate(): Promise<void>{ + var versions: Object[] = await db.query('select * from db_meta'); + var scripts: Buffer[] | string[] = readdirSync('./src/db/', {withFileTypes: false}); + var diff: number = scripts.length - versions.length + if(diff === 0){ + console.log('No migration needed.'); + } else { + console.log('Versions differ, migrating now.'); + for(let i=0;i<diff;i++){ + console.log('Migration to version '+Math.floor(scripts.length-(diff-i))); + await require('./db/'+scripts[Math.floor(scripts.length-(diff-i))]).run(); + } + console.log('Done migrating database.'); + } +} + export { init }; diff --git a/src/config.ts b/src/config.ts index 91db07f..3f74000 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,6 +2,7 @@ import {parseAsYaml as parse} from "parse-yaml"; import {readFileSync as read} from "fs"; try { var localconfig: Object = parse(read('config/config.yml')); + console.log('Config file found.'); } catch (e) { console.log('No config file found. Exiting.'); process.exit(); diff --git a/src/database.ts b/src/database.ts index 1d9a9c7..2cbc440 100644 --- a/src/database.ts +++ b/src/database.ts @@ -9,6 +9,7 @@ var cryptoconfig: Object; function init (){ raw = mysql.createPool(config['database']); cryptoconfig = config['crypto']; + console.log('Connected to database.'); } async function addUser(name: string, password: string){ diff --git a/src/db/0.ts b/src/db/0.ts new file mode 100644 index 0000000..d9de386 --- /dev/null +++ b/src/db/0.ts @@ -0,0 +1,8 @@ +import * as db from "../database"; + +async function run () { + await db.query('CREATE TABLE IF NOT EXISTS db_meta(version SMALLINT)'); + await db.query('INSERT INTO db_meta (version) VALUES (0)'); +} + +export { run } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 2573948..889c20f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ import { config } from "./config"; async function run() { await initDB(); - await clean(); + await clean(process.argv.indexOf('--skip-migrate') !== -1); await initHTTP(); await initRTMP(); await initChat(); diff --git a/src/migrate.ts b/src/migrate.ts new file mode 100644 index 0000000..06284c4 --- /dev/null +++ b/src/migrate.ts @@ -0,0 +1,9 @@ +import {init as initDB} from "./database"; +import {init as clean} from "./cleanup"; +import { config } from "./config"; + +async function run() { + await initDB(); + await clean(false); +} +run().then(() => {process.exit()}); \ No newline at end of file