ensureDatabase static method
Ensure the database defined in server/.env exists.
Implementation
static Future<void> ensureDatabase(String serverDir) async {
final File envFile = File('$serverDir${PlatformInfo.separator}.env');
if (!envFile.existsSync()) {
Logger.info(_tag, '.env file not found, skipping database check.');
return;
}
final String? dbUrl = _parseDatabaseUrl(envFile);
if (dbUrl == null) {
Logger.info(_tag, 'DATABASE_URL not found in .env, skipping.');
return;
}
final _DbConfig? config = _DbConfig.parse(dbUrl);
if (config == null) return;
final String? mysqlCmd = _findMysqlClient();
if (mysqlCmd == null) {
Logger.info(_tag, 'mysql client not found, skipping database check.');
return;
}
final ProcessResult checkResult = await Shell.run(mysqlCmd, [
'-u${config.user}',
'-p${config.password}',
'-h',
config.host,
'-e',
"SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '${config.dbName}';",
]);
final String output = checkResult.stdout as String? ?? '';
if (output.contains(config.dbName)) {
Logger.info(_tag, "Database '${config.dbName}' exists.");
} else {
Logger.info(_tag, "Database '${config.dbName}' not found, creating...");
final ProcessResult createResult = await Shell.run(mysqlCmd, [
'-u${config.user}',
'-p${config.password}',
'-h',
config.host,
'-e',
'CREATE DATABASE `${config.dbName}` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;',
]);
if (createResult.exitCode == 0) {
Logger.info(_tag, "Database '${config.dbName}' created.");
} else {
final String err = (createResult.stderr as String? ?? '').trim();
Logger.error("Failed to create database: $err");
}
}
}