From 1d2bef0a0116eefdd81221ba7502497845f0747b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas.mueller@tmit.eu>
Date: Mon, 12 Jan 2015 13:57:46 +0100
Subject: [PATCH] Use a special filter expression for Oracle to filter the
 prefix - fixes #13220

---
 core/command/db/converttype.php     |  3 ++-
 lib/private/db/connection.php       |  7 +++++++
 lib/private/db/mdb2schemawriter.php |  9 +++++++--
 lib/private/db/migrator.php         | 13 +++++++++----
 lib/private/db/oraclemigrator.php   |  5 +++++
 lib/private/db/pgsqltools.php       |  4 ++--
 6 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/core/command/db/converttype.php b/core/command/db/converttype.php
index 8d1560b051..9d03b705d1 100644
--- a/core/command/db/converttype.php
+++ b/core/command/db/converttype.php
@@ -228,8 +228,9 @@ class ConvertType extends Command {
 	}
 
 	protected function getTables(Connection $db) {
+		$filterExpression = '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
 		$db->getConfiguration()->
-			setFilterSchemaAssetsExpression('/^'.$this->config->getSystemValue('dbtableprefix', 'oc_').'/');
+			setFilterSchemaAssetsExpression($filterExpression);
 		return $db->getSchemaManager()->listTableNames();
 	}
 
diff --git a/lib/private/db/connection.php b/lib/private/db/connection.php
index f2fcd8730a..53935c1e1e 100644
--- a/lib/private/db/connection.php
+++ b/lib/private/db/connection.php
@@ -34,6 +34,13 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
 		}
 	}
 
+	/**
+	 * @return string
+	 */
+	public function getPrefix() {
+		return $this->tablePrefix;
+	}
+
 	/**
 	 * Initializes a new instance of the Connection class.
 	 *
diff --git a/lib/private/db/mdb2schemawriter.php b/lib/private/db/mdb2schemawriter.php
index a42cd86ba5..1fb71ab398 100644
--- a/lib/private/db/mdb2schemawriter.php
+++ b/lib/private/db/mdb2schemawriter.php
@@ -22,8 +22,13 @@ class OC_DB_MDB2SchemaWriter {
 		$xml->addChild('overwrite', 'false');
 		$xml->addChild('charset', 'utf8');
 
-		$conn->getConfiguration()->
-			setFilterSchemaAssetsExpression('/^' . $config->getSystemValue('dbtableprefix', 'oc_') . '/');
+		// FIX ME: bloody work around
+		if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') {
+			$filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/';
+		} else {
+			$filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/';
+		}
+		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
 
 		foreach ($conn->getSchemaManager()->listTables() as $table) {
 			self::saveTable($table, $xml->addChild('table'));
diff --git a/lib/private/db/migrator.php b/lib/private/db/migrator.php
index 8ccc02e36a..fcf5aae025 100644
--- a/lib/private/db/migrator.php
+++ b/lib/private/db/migrator.php
@@ -75,9 +75,9 @@ class Migrator {
 		 * @var \Doctrine\DBAL\Schema\Table[] $tables
 		 */
 		$tables = $targetSchema->getTables();
-
+		$filterExpression = $this->getFilterExpression();
 		$this->connection->getConfiguration()->
-			setFilterSchemaAssetsExpression('/^' . $this->config->getSystemValue('dbtableprefix', 'oc_') . '/');
+			setFilterSchemaAssetsExpression($filterExpression);
 		$existingTables = $this->connection->getSchemaManager()->listTableNames();
 
 		foreach ($tables as $table) {
@@ -161,8 +161,9 @@ class Migrator {
 	}
 
 	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
-		$connection->getConfiguration()->
-			setFilterSchemaAssetsExpression('/^' . $this->config->getSystemValue('dbtableprefix', 'oc_') . '/');
+		$filterExpression = $this->getFilterExpression();
+		$this->connection->getConfiguration()->
+		setFilterSchemaAssetsExpression($filterExpression);
 		$sourceSchema = $connection->getSchemaManager()->createSchema();
 
 		// remove tables we don't know about
@@ -230,4 +231,8 @@ class Migrator {
 		$script .= PHP_EOL;
 		return $script;
 	}
+
+	protected function getFilterExpression() {
+		return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
+	}
 }
diff --git a/lib/private/db/oraclemigrator.php b/lib/private/db/oraclemigrator.php
index b80295cbd6..9ae3502383 100644
--- a/lib/private/db/oraclemigrator.php
+++ b/lib/private/db/oraclemigrator.php
@@ -51,4 +51,9 @@ class OracleMigrator extends NoCheckMigrator {
 		$script .= PHP_EOL;
 		return $script;
 	}
+
+	protected function getFilterExpression() {
+		return '/^"' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
+	}
+
 }
diff --git a/lib/private/db/pgsqltools.php b/lib/private/db/pgsqltools.php
index f3204d4c7b..9336917cc5 100644
--- a/lib/private/db/pgsqltools.php
+++ b/lib/private/db/pgsqltools.php
@@ -32,9 +32,9 @@ class PgSqlTools {
 	* @return null
 	*/
 	public function resynchronizeDatabaseSequences(Connection $conn) {
+		$filterExpression = '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
 		$databaseName = $conn->getDatabase();
-		$conn->getConfiguration()->
-			setFilterSchemaAssetsExpression('/^' . $this->config->getSystemValue('dbtableprefix', 'oc_') . '/');
+		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
 
 		foreach ($conn->getSchemaManager()->listSequences() as $sequence) {
 			$sequenceName = $sequence->getName();
-- 
GitLab