Update lib/Database.php

Update busytimeout to prevent locks, some more pragmas
This commit is contained in:
Martijn de Boer 2024-11-09 16:51:25 +01:00
parent 597e9c8dfb
commit e02a0b4e50

View file

@ -1,121 +1,125 @@
<?php
class Database
{
public static $handle = null;
public function __construct($createDatabase = false)
{
if (self::$handle === null) {
self::$handle = new SQLite3(SQLITE_DB);
self::$handle->enableExceptions(true);
$initialQueries = [
"PRAGMA journal_mode = WAL",
"PRAGMA synchronous = OFF",
"PRAGMA cache_size = 10000",
"PRAGMA temp_store = MEMORY"
];
self::$handle->exec(implode(";", $initialQueries) . ";");
if ($createDatabase === true) {
$this->createDatabase();
}
}
}
public function createDatabase()
{
$schemaFiles = [
LIB_MIGRATIONS_DIR . "/_schema.sql",
MIGRATIONS_DIR . "/_schema.sql"
];
foreach ($schemaFiles as $schemaFile) {
if (file_exists($schemaFile)) {
$schema = file_get_contents($schemaFile);
self::$handle->exec($schema);
}
}
}
public function runMigrations()
{
$currentTableVersions = [];
$result = self::$handle->query("SELECT `table`,`version` FROM `migrations`");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$currentTableVersions[$row["table"]] = $row["version"];
}
$migrations = [];
$migrationPaths = [LIB_MIGRATIONS_DIR, MIGRATIONS_DIR];
foreach ($migrationPaths as $migrationPath) {
if (is_dir($migrationPath)) {
$migrations = array_merge($migrations, scandir($migrationPath));
}
}
$migrationCount = 0;
foreach ($migrations as $migration) {
if ($migration == "." || $migration == ".." || $migration == "_schema.sql") {
continue;
}
$migrationParts = explode("-", str_replace(".sql", "", $migration));
$migrationTable = $migrationParts[0];
$migrationVersion = $migrationParts[1];
$run = false;
if (!isset($currentTableVersions[$migrationTable])) {
$run = true;
} else {
if ($migrationVersion > $currentTableVersions[$migrationTable]) {
$run = true;
}
}
if ($run === true) {
Logger::log("Found migration for table " . $migrationTable . " version " . $migrationVersion, LOGGER::INFO, "Database");
$possiblePaths = [LIB_MIGRATIONS_DIR, MIGRATIONS_DIR];
$migrationFile = null;
foreach ($possiblePaths as $possiblePath) {
if (file_exists($possiblePath . "/" . $migration)) {
$migrationFile = $possiblePath . "/" . $migration;
break;
}
}
if ($migrationFile === null) {
Logger::log("Could not find migration file for table " . $migrationTable . " version " . $migrationVersion, LOGGER::ERROR, "Database");
continue;
}
$migrationContents = file_get_contents($migrationFile);
if (@self::$handle->exec($migrationContents)) {
self::$handle->exec("INSERT INTO `migrations` (`table`,`version`, `schemafile`, `created`) VALUES ('" . $migrationTable . "'," . $migrationVersion . ",'" . $migration . "', strftime('%Y-%m-%d %H:%M:%S','now'))");
$migrationCount++;
} else {
Logger::log("Failed to run migration for table " . $migrationTable . " version " . $migrationVersion . " with error: " . self::$handle->lastErrorMsg(), LOGGER::ERROR, "Database");
}
}
}
if ($migrationCount > 0) {
Logger::log("Ran " . $migrationCount . " migrations", LOGGER::DEBUG, "Database");
self::$handle->exec("PRAGMA optimize;");
Logger::log("Optimized database", LOGGER::DEBUG, "Database");
} else {
Logger::log("No migrations to run", LOGGER::DEBUG, "Database");
}
}
public function close()
{
self::$handle->close();
}
}
<?php
class Database
{
public static $handle = null;
public function __construct($createDatabase = false)
{
if (self::$handle === null) {
self::$handle = new SQLite3(SQLITE_DB);
self::$handle->enableExceptions(true);
self::$handle->busyTimeout(60000);
$initialQueries = [
"PRAGMA journal_mode = WAL",
"PRAGMA synchronous = OFF",
"PRAGMA cache_size = 10000",
"PRAGMA mmap_size = 30000000000",
"PRAGMA temp_store = MEMORY",
"PRAGMA automatic_index = ON",
"PRAGMA optimize"
];
self::$handle->exec(implode(";", $initialQueries) . ";");
if ($createDatabase === true) {
$this->createDatabase();
}
}
}
public function createDatabase()
{
$schemaFiles = [
LIB_MIGRATIONS_DIR . "/_schema.sql",
MIGRATIONS_DIR . "/_schema.sql"
];
foreach ($schemaFiles as $schemaFile) {
if (file_exists($schemaFile)) {
$schema = file_get_contents($schemaFile);
self::$handle->exec($schema);
}
}
}
public function runMigrations()
{
$currentTableVersions = [];
$result = self::$handle->query("SELECT `table`,`version` FROM `migrations`");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$currentTableVersions[$row["table"]] = $row["version"];
}
$migrations = [];
$migrationPaths = [LIB_MIGRATIONS_DIR, MIGRATIONS_DIR];
foreach ($migrationPaths as $migrationPath) {
if (is_dir($migrationPath)) {
$migrations = array_merge($migrations, scandir($migrationPath));
}
}
$migrationCount = 0;
foreach ($migrations as $migration) {
if ($migration == "." || $migration == ".." || $migration == "_schema.sql") {
continue;
}
$migrationParts = explode("-", str_replace(".sql", "", $migration));
$migrationTable = $migrationParts[0];
$migrationVersion = $migrationParts[1];
$run = false;
if (!isset($currentTableVersions[$migrationTable])) {
$run = true;
} else {
if ($migrationVersion > $currentTableVersions[$migrationTable]) {
$run = true;
}
}
if ($run === true) {
Logger::log("Found migration for table " . $migrationTable . " version " . $migrationVersion, LOGGER::INFO, "Database");
$possiblePaths = [LIB_MIGRATIONS_DIR, MIGRATIONS_DIR];
$migrationFile = null;
foreach ($possiblePaths as $possiblePath) {
if (file_exists($possiblePath . "/" . $migration)) {
$migrationFile = $possiblePath . "/" . $migration;
break;
}
}
if ($migrationFile === null) {
Logger::log("Could not find migration file for table " . $migrationTable . " version " . $migrationVersion, LOGGER::ERROR, "Database");
continue;
}
$migrationContents = file_get_contents($migrationFile);
if (@self::$handle->exec($migrationContents)) {
self::$handle->exec("INSERT INTO `migrations` (`table`,`version`, `schemafile`, `created`) VALUES ('" . $migrationTable . "'," . $migrationVersion . ",'" . $migration . "', strftime('%Y-%m-%d %H:%M:%S','now'))");
$migrationCount++;
} else {
Logger::log("Failed to run migration for table " . $migrationTable . " version " . $migrationVersion . " with error: " . self::$handle->lastErrorMsg(), LOGGER::ERROR, "Database");
}
}
}
if ($migrationCount > 0) {
Logger::log("Ran " . $migrationCount . " migrations", LOGGER::DEBUG, "Database");
self::$handle->exec("PRAGMA optimize;");
Logger::log("Optimized database", LOGGER::DEBUG, "Database");
} else {
Logger::log("No migrations to run", LOGGER::DEBUG, "Database");
}
}
public function close()
{
self::$handle->close();
}
}