From b89a1b309cfe2cbc3230d8d132ef80fd4754dc07 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 17 Jan 2024 00:12:01 +0100 Subject: [PATCH] Bugfix: dataBaseUpgrade always runs on sqlite and pgsql And split the db schema data into seperate class --- .../0.0.0/app/libraries/RainLoop/Pdo/Base.php | 101 +++-------- .../app/libraries/RainLoop/Pdo/Schema.php | 68 +++++++ .../Providers/AddressBook/PdoAddressBook.php | 159 +--------------- .../Providers/AddressBook/PdoSchema.php | 170 ++++++++++++++++++ 4 files changed, 268 insertions(+), 230 deletions(-) create mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Schema.php create mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoSchema.php diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Base.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Base.php index 08a57f779..2becb01ff 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Base.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Base.php @@ -257,51 +257,7 @@ abstract class Base $oPdo = $this->getPDO(); if ($oPdo) { - $aQ = array(); - switch ($this->sDbType) - { - case 'mysql': - $aQ[] = 'CREATE TABLE IF NOT EXISTS rainloop_system ( -sys_name varchar(64) NOT NULL, -value_int int UNSIGNED NOT NULL DEFAULT 0, -PRIMARY KEY (sys_name) -) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'; - $aQ[] = 'CREATE TABLE IF NOT EXISTS rainloop_users ( -id_user int UNSIGNED NOT NULL AUTO_INCREMENT, -rl_email varchar(254) NOT NULL, -PRIMARY KEY (id_user), -UNIQUE KEY ui_rainloop_users_email (rl_email) -);'; - break; - - case 'pgsql': - $aQ[] = 'CREATE TABLE rainloop_system ( -sys_name varchar(50) NOT NULL, -value_int integer NOT NULL DEFAULT 0 -);'; - $aQ[] = 'CREATE INDEX sys_name_rainloop_system_index ON rainloop_system (sys_name);'; - $aQ[] = 'CREATE SEQUENCE id_user START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;'; - $aQ[] = 'CREATE TABLE rainloop_users ( -id_user integer DEFAULT nextval(\'id_user\'::text) PRIMARY KEY, -rl_email varchar(254) NOT NULL DEFAULT \'\' -);'; - $aQ[] = 'CREATE INDEX rl_email_rainloop_users_index ON rainloop_users (rl_email);'; - break; - - case 'sqlite': - $aQ[] = 'CREATE TABLE rainloop_system ( -sys_name text NOT NULL, -value_int integer NOT NULL DEFAULT 0 -);'; - $aQ[] = 'CREATE UNIQUE INDEX ui_rainloop_system_sys_name ON rainloop_system (sys_name);'; - $aQ[] = 'CREATE TABLE rainloop_users ( -id_user integer NOT NULL PRIMARY KEY, -rl_email text NOT NULL DEFAULT \'\' -);'; - $aQ[] = 'CREATE INDEX rl_email_rainloop_users_index ON rainloop_users (rl_email);'; - break; - } - + $aQ = Schema::getForDbType($this->sDbType); if (\count($aQ)) { try { @@ -352,41 +308,36 @@ rl_email text NOT NULL DEFAULT \'\' $bResult = false; if (\is_int($iFromVersion) && 0 <= $iFromVersion) { $oPdo = false; - foreach ($aData as $iVersion => $aQuery) { - if (0 === \count($aQuery)) { - continue; - } - - if (!$oPdo) { - $oPdo = $this->getPDO(); - $bResult = true; - } - - if ($iFromVersion < $iVersion && $oPdo) { - try - { - foreach ($aQuery as $sQuery) { - $this->writeLog($sQuery); - $bExec = $oPdo->exec($sQuery); - if (false === $bExec) { - $this->writeLog('Result: false'); - - $bResult = false; + if ($iFromVersion < $iVersion) { + if (\count($aQuery)) { + if (!$oPdo) { + $oPdo = $this->getPDO(); + $bResult = true; + } + if ($oPdo) { + try + { + foreach ($aQuery as $sQuery) { + $this->writeLog($sQuery); + $bExec = $oPdo->exec($sQuery); + if (false === $bExec) { + $this->writeLog('Result: false'); + $bResult = false; + break; + } + } + } + catch (\Throwable $oException) + { + $this->writeLog($oException); + throw $oException; + } + if (!$bResult) { break; } } } - catch (\Throwable $oException) - { - $this->writeLog($oException); - throw $oException; - } - - if (!$bResult) { - break; - } - $this->setVersion($sName, $iVersion); } } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Schema.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Schema.php new file mode 100644 index 000000000..1a34d96ef --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Pdo/Schema.php @@ -0,0 +1,68 @@ +settings->driver) { case 'mysql': - $mCache = $this->dataBaseUpgrade($this->settings->driver.'-ab-version', array( - 1 => $this->getInitialTablesArray($this->settings->driver), - 2 => array( -'ALTER TABLE rainloop_ab_properties ADD prop_value_lower MEDIUMTEXT NOT NULL AFTER prop_value_custom;' - ), - 3 => array( -'ALTER TABLE rainloop_ab_properties CHANGE prop_value prop_value MEDIUMTEXT NOT NULL;', -'ALTER TABLE rainloop_ab_properties CHANGE prop_value_custom prop_value_custom MEDIUMTEXT NOT NULL;', -'ALTER TABLE rainloop_ab_properties CHANGE prop_value_lower prop_value_lower MEDIUMTEXT NOT NULL;' - ), - 4 => array( -'ALTER TABLE rainloop_ab_properties CHANGE prop_value prop_value MEDIUMTEXT NOT NULL;', -'ALTER TABLE rainloop_ab_properties CHANGE prop_value_custom prop_value_custom MEDIUMTEXT NOT NULL;', -'ALTER TABLE rainloop_ab_properties CHANGE prop_value_lower prop_value_lower MEDIUMTEXT NOT NULL;' - ) - )); - break; case 'pgsql': - $mCache = $this->dataBaseUpgrade($this->settings->driver.'-ab-version', array( - 1 => $this->getInitialTablesArray($this->settings->driver), - 2 => array( -'ALTER TABLE rainloop_ab_properties ADD prop_value_lower text NOT NULL DEFAULT \'\';' - ), - 3 => array(), - 4 => array() - )); - break; case 'sqlite': - $mCache = $this->dataBaseUpgrade($this->settings->driver.'-ab-version', array( - 1 => $this->getInitialTablesArray($this->settings->driver), - 2 => array( -'ALTER TABLE rainloop_ab_properties ADD prop_value_lower text NOT NULL DEFAULT \'\';' - ), - 3 => array(), - 4 => array() - )); + $mCache = $this->dataBaseUpgrade( + $this->settings->driver.'-ab-version', + PdoSchema::getForDbType($this->settings->driver) + ); break; } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoSchema.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoSchema.php new file mode 100644 index 000000000..8f97f84d2 --- /dev/null +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoSchema.php @@ -0,0 +1,170 @@ + [], + 2 => [ +'ALTER TABLE rainloop_ab_properties ADD prop_value_lower MEDIUMTEXT NOT NULL AFTER prop_value_custom;' + ], + 3 => [ +'ALTER TABLE rainloop_ab_properties CHANGE prop_value prop_value MEDIUMTEXT NOT NULL;', +'ALTER TABLE rainloop_ab_properties CHANGE prop_value_custom prop_value_custom MEDIUMTEXT NOT NULL;', +'ALTER TABLE rainloop_ab_properties CHANGE prop_value_lower prop_value_lower MEDIUMTEXT NOT NULL;' + ], + 4 => [ +'ALTER TABLE rainloop_ab_properties CHANGE prop_value prop_value MEDIUMTEXT NOT NULL;', +'ALTER TABLE rainloop_ab_properties CHANGE prop_value_custom prop_value_custom MEDIUMTEXT NOT NULL;', +'ALTER TABLE rainloop_ab_properties CHANGE prop_value_lower prop_value_lower MEDIUMTEXT NOT NULL;' + ] + ]; + break; + + case 'pgsql': + $aVersions = [ + 1 => [], + 2 => [ +'ALTER TABLE rainloop_ab_properties ADD prop_value_lower text NOT NULL DEFAULT \'\';' + ] + ]; + break; + + case 'sqlite': + $aVersions = [ + 1 => [], + 2 => [ +'ALTER TABLE rainloop_ab_properties ADD prop_value_lower text NOT NULL DEFAULT \'\';' + ] + ]; + $sInitial = static::{$sDbType}(); + break; + } + + if ($aVersions) { + $aList = \explode(';', \trim(static::{$sDbType}())); + foreach ($aList as $sV) { + $sV = \trim($sV); + if (\strlen($sV)) { + $aVersions[1][] = $sV; + } + } + } + + return $aVersions; + } + +}