This commit is contained in:
@ -36,11 +36,37 @@ echo ".env: " . ($envPath && is_readable($envPath) ? "readable" : "MISSING or no
|
||||
$keyEnv = getenv('QDB_MASTER_KEY');
|
||||
if ($keyEnv === false || $keyEnv === '') {
|
||||
echo "QDB_MASTER_KEY: NOT SET (set in .env or Apache/PHP-FPM env)\n";
|
||||
exit(1);
|
||||
if (!qdb_is_mysql()) {
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
echo "QDB_MASTER_KEY: set (" . strlen($keyEnv) . " chars)\n";
|
||||
$b64 = base64_decode($keyEnv, true);
|
||||
echo " parses as base64: " . ($b64 !== false && strlen($b64) > 0 ? 'yes (' . strlen($b64) . ' bytes)' : 'no (uses first 32 ASCII chars)') . "\n";
|
||||
}
|
||||
echo "QDB_MASTER_KEY: set (" . strlen($keyEnv) . " chars)\n";
|
||||
$b64 = base64_decode($keyEnv, true);
|
||||
echo " parses as base64: " . ($b64 !== false && strlen($b64) > 0 ? 'yes (' . strlen($b64) . ' bytes)' : 'no (uses first 32 ASCII chars)') . "\n";
|
||||
|
||||
if (qdb_is_mysql()) {
|
||||
echo "QDB_DRIVER: mysql\n";
|
||||
echo " host: " . (qdb_env_get('QDB_MYSQL_HOST') ?: '127.0.0.1') . "\n";
|
||||
echo " database: " . (qdb_env_get('QDB_MYSQL_DATABASE') ?: 'nat-as-db') . "\n";
|
||||
try {
|
||||
[$pdo] = qdb_mysql_open();
|
||||
qdb_mysql_ensure_ready($pdo);
|
||||
$version = qdb_schema_version($pdo);
|
||||
$users = (int)$pdo->query('SELECT COUNT(*) FROM users')->fetchColumn();
|
||||
$hasSession = qdb_table_exists($pdo, 'session');
|
||||
echo "\nOK: MySQL connection + migrations succeeded.\n";
|
||||
echo " schema_version: $version (expected " . QDB_VERSION . ")\n";
|
||||
echo " users: $users\n";
|
||||
echo " session table: " . ($hasSession ? 'yes' : 'MISSING') . "\n";
|
||||
exit(0);
|
||||
} catch (Throwable $e) {
|
||||
echo "\nMySQL open failed: " . $e->getMessage() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
echo "QDB_DRIVER: sqlite\n";
|
||||
|
||||
$dbPath = $argv[1] ?? QDB_PATH;
|
||||
if ($dbPath !== QDB_PATH && !is_file($dbPath)) {
|
||||
|
||||
82
cli/migrate_sqlite_to_mysql.php
Normal file
82
cli/migrate_sqlite_to_mysql.php
Normal file
@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* One-time migration: encrypted SQLite file -> MySQL database.
|
||||
*
|
||||
* Usage:
|
||||
* php cli/migrate_sqlite_to_mysql.php
|
||||
*
|
||||
* Requires QDB_MASTER_KEY (source SQLite) and QDB_MYSQL_* variables (target).
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../lib/response.php';
|
||||
require_once __DIR__ . '/../common.php';
|
||||
qdb_env_override('QDB_DRIVER', 'sqlite');
|
||||
require_once __DIR__ . '/../db_init.php';
|
||||
|
||||
if (!is_file(QDB_PATH)) {
|
||||
fwrite(STDERR, "SQLite database file not found at " . QDB_PATH . PHP_EOL);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
[$sqlitePdo, $tmpDb, $lockFp] = qdb_open(false);
|
||||
|
||||
$tables = $sqlitePdo->query(
|
||||
"SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name"
|
||||
)->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
$tableData = [];
|
||||
foreach ($tables as $table) {
|
||||
$tableData[$table] = $sqlitePdo->query("SELECT * FROM `{$table}`")->fetchAll(PDO::FETCH_ASSOC);
|
||||
}
|
||||
qdb_discard($tmpDb, $lockFp);
|
||||
|
||||
qdb_reset_driver_cache();
|
||||
qdb_env_override('QDB_DRIVER', 'mysql');
|
||||
|
||||
[$mysqlPdo] = qdb_mysql_open();
|
||||
qdb_mysql_ensure_ready($mysqlPdo);
|
||||
|
||||
qdb_set_foreign_keys($mysqlPdo, false);
|
||||
$mysqlPdo->beginTransaction();
|
||||
|
||||
try {
|
||||
foreach ($tableData as $table => $rows) {
|
||||
if (!qdb_table_exists($mysqlPdo, $table)) {
|
||||
throw new RuntimeException("MySQL schema is missing source table: {$table}");
|
||||
}
|
||||
$mysqlPdo->exec("DELETE FROM `{$table}`");
|
||||
if (!$rows) {
|
||||
echo "{$table}: 0 rows\n";
|
||||
continue;
|
||||
}
|
||||
$columns = array_keys($rows[0]);
|
||||
$colList = implode(', ', array_map(fn($c) => "`{$c}`", $columns));
|
||||
$placeholders = implode(', ', array_map(fn($c) => ':' . $c, $columns));
|
||||
$insert = $mysqlPdo->prepare("INSERT INTO `{$table}` ({$colList}) VALUES ({$placeholders})");
|
||||
foreach ($rows as $row) {
|
||||
$params = [];
|
||||
foreach ($columns as $column) {
|
||||
$params[':' . $column] = $row[$column];
|
||||
}
|
||||
$insert->execute($params);
|
||||
}
|
||||
echo "{$table}: " . count($rows) . " rows\n";
|
||||
}
|
||||
$mysqlPdo->commit();
|
||||
} catch (Throwable $e) {
|
||||
if ($mysqlPdo->inTransaction()) {
|
||||
$mysqlPdo->rollBack();
|
||||
}
|
||||
throw $e;
|
||||
} finally {
|
||||
qdb_set_foreign_keys($mysqlPdo, true);
|
||||
}
|
||||
|
||||
qdb_set_schema_version($mysqlPdo, QDB_VERSION);
|
||||
|
||||
echo "Migration complete. Set QDB_DRIVER=mysql in .env and restart PHP.\n";
|
||||
Reference in New Issue
Block a user