From c239ca0d25d645069bf5f25c9ccf5bc124b69909 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 23 Jul 2013 19:57:04 +0200 Subject: [PATCH] Oracle compat: enable appconfig.configvalue to store empty strings (now working) --- db_structure.xml | 2 +- lib/db.php | 70 +++++++++++++++++++++++++++++++++++++++--------- lib/util.php | 4 +-- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index a292f69ce04..6f4e3288907 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -32,7 +32,7 @@ configvalue clob - true + false diff --git a/lib/db.php b/lib/db.php index 2dc20001d1f..0a827d032a5 100644 --- a/lib/db.php +++ b/lib/db.php @@ -185,7 +185,7 @@ class OC_DB { } else { $dsn='sqlsrv:Server='.$host.';Database='.$name; } - break; + break; default: return false; } @@ -365,12 +365,12 @@ class OC_DB { $query = self::processQuery( $query ); self::connect(); - + if ($isManipulation === null) { //try to guess, so we return the number of rows on manipulations $isManipulation = self::isManipulation($query); } - + // return the result if(self::$backend==self::BACKEND_MDB2) { // differentiate between query and manipulation @@ -401,11 +401,11 @@ class OC_DB { } return $result; } - + /** * tries to guess the type of statement based on the first 10 characters * the current check allows some whitespace but does not work with IF EXISTS or other more complex statements - * + * * @param string $sql */ static public function isManipulation( $sql ) { @@ -427,7 +427,7 @@ class OC_DB { } return false; } - + /** * @brief gets last value of autoincrement * @param string $table The optional table name (will replace *PREFIX*) and add sequence suffix @@ -583,10 +583,35 @@ class OC_DB { $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); self::connectScheme(); - + if(OC_Config::getValue('dbtype', 'sqlite')==='oci') { //set dbname, it is unset because oci uses 'service' to connect self::$schema->db->database_name=self::$schema->db->dsn['username']; + + $installedVersion = \OC_Config::getValue('version', '0.0.0'); + if (version_compare('5.0.15', $installedVersion, '<=')) { + //configvalue in oc_appconfig must be allowed to contain NULL + //because it is a CLOB, we need to move heaven and earth a bit + //i.e. rename it and copy values + $ociHandleAppconfig = true; + + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*appconfig`'); + $result = $query->execute(); + if(\OCP\DB::isError($result)) { + unset($ociHandleAppconfig); + throw new Exception('Cannot read from table appconfig:'. + $result->getMessage()); + } + $ociAppconfigContent = $result->fetchAll(); + + $query = \OCP\DB::prepare('ALTER TABLE `*PREFIX*appconfig` + RENAME COLUMN `configvalue` TO `configvalue_tmp`'); + $result = $query->execute(); + if(\OCP\DB::isError($result)) { + OC_Log::write('core', 'Could not alter appconfig.'. + ', DB upgrade may fail.', OC_Log::WARN); + } + } } // read file @@ -636,6 +661,25 @@ class OC_DB { OC_Log::write('core', $message, OC_Log::FATAL); throw new Exception($message); } + + if(isset($ociHandleAppconfig) && isset($ociAppconfigContent)) { + $query = \OCP\DB::prepare(' + UPDATE `*PREFIX*appconfig` + SET `configvalue` = ? + WHERE + `appid` = ? + AND `configkey` = ? + '); + foreach($ociAppconfigContent as $row) { + $r = $query->execute(array( + $row['configvalue'], $row['appid'], $row['configkey'] + )); + if(\OCP\DB::isError($r)) { + throw new Exception($r->getMessage()); + } + } + } + return true; } @@ -799,11 +843,11 @@ class OC_DB { private static function fixLimitClauseForMSSQL($query) { $limitLocation = stripos ($query, "LIMIT"); - + if ( $limitLocation === false ) { return $query; - } - + } + // total == 0 means all results - not zero results // // First number is either total or offset, locate it by first space @@ -850,7 +894,7 @@ class OC_DB { } return $query; } - + /** * @brief drop a table * @param string $tableName the table to drop @@ -1032,7 +1076,7 @@ class PDOStatementWrapper{ } else { $result = $this->statement->execute(); } - + if ($result === false) { return false; } @@ -1132,7 +1176,7 @@ class PDOStatementWrapper{ die ($entry); } } - + /** * provide numRows */ diff --git a/lib/util.php b/lib/util.php index 86f3a7cac01..3920d0f900f 100755 --- a/lib/util.php +++ b/lib/util.php @@ -76,7 +76,7 @@ class OC_Util { public static function getVersion() { // hint: We only can count up. Reset minor/patchlevel when // updating major/minor version number. - return array(5, 00, 15); + return array(5, 00, 15, 1); } /** @@ -824,7 +824,7 @@ class OC_Util { $theme = OC_Config::getValue("theme", ''); if($theme === '') { - + if(is_dir(OC::$SERVERROOT . '/themes/default')) { $theme = 'default'; } -- 2.39.5