mirror of
https://github.com/thelounge/thelounge.git
synced 2024-05-02 06:33:19 +02:00
cli: Implement storage migrate subcommand
This introduces the ability to run the migration offline, while TL is not running as the migrations can take a long time. The migrate command is added as a `thelounge storage` subcommand. Reason being that it is expected that more subcommands will follow, say `thelounge storage clean` to remove partial data from the db.
This commit is contained in:
parent
3e7255ff20
commit
95aaba43fa
|
@ -42,6 +42,7 @@ program.addCommand(require("./install").default);
|
|||
program.addCommand(require("./uninstall").default);
|
||||
program.addCommand(require("./upgrade").default);
|
||||
program.addCommand(require("./outdated").default);
|
||||
program.addCommand(require("./storage").default);
|
||||
|
||||
if (!Config.values.public) {
|
||||
require("./users").default.forEach((command: Command) => {
|
||||
|
|
51
server/command-line/storage.ts
Normal file
51
server/command-line/storage.ts
Normal file
|
@ -0,0 +1,51 @@
|
|||
import log from "../log";
|
||||
import {Command} from "commander";
|
||||
import ClientManager from "../clientManager";
|
||||
import Utils from "./utils";
|
||||
import SqliteMessageStorage from "../plugins/messageStorage/sqlite";
|
||||
|
||||
const program = new Command("storage").description(
|
||||
"various utilities related to the message storage"
|
||||
);
|
||||
|
||||
program
|
||||
.command("migrate")
|
||||
.argument("[user]", "migrate a specific user only, all if not provided")
|
||||
.description("Migrate message storage where needed")
|
||||
.on("--help", Utils.extraHelp)
|
||||
.action(function (user) {
|
||||
runMigrations(user).catch((err) => {
|
||||
log.error(err.toString());
|
||||
process.exit(1);
|
||||
});
|
||||
});
|
||||
|
||||
async function runMigrations(user: string) {
|
||||
const manager = new ClientManager();
|
||||
const users = manager.getUsers();
|
||||
|
||||
if (user) {
|
||||
if (!users.includes(user)) {
|
||||
throw new Error(`invalid user ${user}`);
|
||||
}
|
||||
|
||||
return migrateUser(user);
|
||||
}
|
||||
|
||||
for (const name of users) {
|
||||
await migrateUser(name);
|
||||
// if any migration fails we blow up,
|
||||
// chances are the rest won't complete either
|
||||
}
|
||||
}
|
||||
|
||||
// runs sqlite migrations for a user, which must exist
|
||||
async function migrateUser(user: string) {
|
||||
log.info("handling user", user);
|
||||
const sqlite = new SqliteMessageStorage(user);
|
||||
await sqlite.enable(); // enable runs migrations
|
||||
await sqlite.close();
|
||||
log.info("user", user, "migrated successfully");
|
||||
}
|
||||
|
||||
export default program;
|
Loading…
Reference in a new issue