From e333f45d0ff0c8ca9af20422434f31e423458427 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 May 2020 17:49:07 +0000 Subject: [PATCH] Ensure that the initial values are set --- src/Database/DBA.php | 11 +++++++++++ src/Database/DBStructure.php | 33 +++++++++++++++++++++++++++++++++ src/Database/Database.php | 12 ++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/Database/DBA.php b/src/Database/DBA.php index 9825d06c6..f35428718 100644 --- a/src/Database/DBA.php +++ b/src/Database/DBA.php @@ -741,6 +741,17 @@ class DBA return DI::dba()->processlist(); } + /** + * Test if the given table exists + * + * @param string $table + * @return bool + */ + public static function tableExists(string $table) + { + return DI::dba()->tableExists($table); + } + /** * Fetch a database variable * diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index 7c82b518b..67685de3d 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -294,6 +294,10 @@ class DBStructure DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: Database update', DateTimeFormat::utcNow() . ' ' . date('e'))); } + // ensure that all initial values exist. This test has to be done prior and after the structure check. + // Prior is needed if the specific tables already exists - after is needed when they had been created. + self::checkInitialValues(); + $errors = ''; Logger::log('updating structure', Logger::DEBUG); @@ -640,6 +644,8 @@ class DBStructure View::create(false, $action); + self::checkInitialValues(); + if ($action && !$install) { DI::config()->set('system', 'maintenance', 0); DI::config()->set('system', 'maintenance_reason', ''); @@ -976,4 +982,31 @@ class DBStructure $stmtColumns = DBA::p("SHOW COLUMNS FROM `" . $table . "`"); return DBA::toArray($stmtColumns); } + + private static function checkInitialValues() + { + if (DBA::tableExists('contact') && !DBA::exists('contact', ['id' => 0])) { + DBA::insert('contact', ['nurl' => '']); + $lastid = DBA::lastInsertId(); + if ($lastid != 0) { + DBA::update('contact', ['id' => 0], ['id' => $lastid]); + } + } + + if (DBA::tableExists('permissionset') && !DBA::exists('permissionset', ['id' => 0])) { + DBA::insert('permissionset', ['allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '']); + $lastid = DBA::lastInsertId(); + if ($lastid != 0) { + DBA::update('permissionset', ['id' => 0], ['id' => $lastid]); + } + } + + if (DBA::tableExists('tag') && !DBA::exists('tag', ['id' => 0])) { + DBA::insert('tag', ['name' => '']); + $lastid = DBA::lastInsertId(); + if ($lastid != 0) { + DBA::update('tag', ['id' => 0], ['id' => $lastid]); + } + } + } } diff --git a/src/Database/Database.php b/src/Database/Database.php index 7adb88ffa..97840141a 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -1660,6 +1660,18 @@ class Database return (["list" => $statelist, "amount" => $processes]); } + /** + * Test if the given table exists + * + * @param string $table + * @return bool + */ + public function tableExists(string $table) + { + return $this->exists(['information_schema' => 'tables'], + ['table_name' => $table, 'table_schema' => $this->databaseName()]); + } + /** * Fetch a database variable *