Passed
Push — master ( 4e9cd2...bc8d14 )
by Roeland
19:16 queued 09:49
created
lib/private/DB/QueryBuilder/Parameter.php 1 patch
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -25,17 +25,17 @@
 block discarded – undo
25 25
 use OCP\DB\QueryBuilder\IParameter;
26 26
 
27 27
 class Parameter implements IParameter {
28
-	/** @var mixed */
29
-	protected $name;
28
+    /** @var mixed */
29
+    protected $name;
30 30
 
31
-	public function __construct($name) {
32
-		$this->name = $name;
33
-	}
31
+    public function __construct($name) {
32
+        $this->name = $name;
33
+    }
34 34
 
35
-	/**
36
-	 * @return string
37
-	 */
38
-	public function __toString() {
39
-		return (string) $this->name;
40
-	}
35
+    /**
36
+     * @return string
37
+     */
38
+    public function __toString() {
39
+        return (string) $this->name;
40
+    }
41 41
 }
Please login to merge, or discard this patch.
lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -48,7 +48,7 @@
 block discarded – undo
48 48
 	public function iLike($x, $y, $type = null) {
49 49
 		$x = $this->helper->quoteColumnName($x);
50 50
 		$y = $this->helper->quoteColumnName($y);
51
-		return $this->expressionBuilder->comparison($x, ' COLLATE ' . $this->charset . '_general_ci LIKE', $y);
51
+		return $this->expressionBuilder->comparison($x, ' COLLATE '.$this->charset.'_general_ci LIKE', $y);
52 52
 	}
53 53
 
54 54
 }
Please login to merge, or discard this patch.
Indentation   +22 added lines, -22 removed lines patch added patch discarded remove patch
@@ -30,27 +30,27 @@
 block discarded – undo
30 30
 
31 31
 class MySqlExpressionBuilder extends ExpressionBuilder {
32 32
 
33
-	/** @var string */
34
-	protected $charset;
35
-
36
-	/**
37
-	 * @param \OCP\IDBConnection|Connection $connection
38
-	 * @param IQueryBuilder $queryBuilder
39
-	 */
40
-	public function __construct(IDBConnection $connection, IQueryBuilder $queryBuilder) {
41
-		parent::__construct($connection, $queryBuilder);
42
-
43
-		$params = $connection->getParams();
44
-		$this->charset = isset($params['charset']) ? $params['charset'] : 'utf8';
45
-	}
46
-
47
-	/**
48
-	 * @inheritdoc
49
-	 */
50
-	public function iLike($x, $y, $type = null) {
51
-		$x = $this->helper->quoteColumnName($x);
52
-		$y = $this->helper->quoteColumnName($y);
53
-		return $this->expressionBuilder->comparison($x, ' COLLATE ' . $this->charset . '_general_ci LIKE', $y);
54
-	}
33
+    /** @var string */
34
+    protected $charset;
35
+
36
+    /**
37
+     * @param \OCP\IDBConnection|Connection $connection
38
+     * @param IQueryBuilder $queryBuilder
39
+     */
40
+    public function __construct(IDBConnection $connection, IQueryBuilder $queryBuilder) {
41
+        parent::__construct($connection, $queryBuilder);
42
+
43
+        $params = $connection->getParams();
44
+        $this->charset = isset($params['charset']) ? $params['charset'] : 'utf8';
45
+    }
46
+
47
+    /**
48
+     * @inheritdoc
49
+     */
50
+    public function iLike($x, $y, $type = null) {
51
+        $x = $this->helper->quoteColumnName($x);
52
+        $y = $this->helper->quoteColumnName($y);
53
+        return $this->expressionBuilder->comparison($x, ' COLLATE ' . $this->charset . '_general_ci LIKE', $y);
54
+    }
55 55
 
56 56
 }
Please login to merge, or discard this patch.
lib/private/DB/PgSqlTools.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -48,7 +48,7 @@
 block discarded – undo
48 48
 	* @return null
49 49
 	*/
50 50
 	public function resynchronizeDatabaseSequences(Connection $conn) {
51
-		$filterExpression = '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
51
+		$filterExpression = '/^'.preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')).'/';
52 52
 		$databaseName = $conn->getDatabase();
53 53
 		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
54 54
 
Please login to merge, or discard this patch.
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -31,41 +31,41 @@
 block discarded – undo
31 31
 */
32 32
 class PgSqlTools {
33 33
 
34
-	/** @var \OCP\IConfig */
35
-	private $config;
34
+    /** @var \OCP\IConfig */
35
+    private $config;
36 36
 
37
-	/**
38
-	 * @param \OCP\IConfig $config
39
-	 */
40
-	public function __construct(IConfig $config) {
41
-		$this->config = $config;
42
-	}
37
+    /**
38
+     * @param \OCP\IConfig $config
39
+     */
40
+    public function __construct(IConfig $config) {
41
+        $this->config = $config;
42
+    }
43 43
 
44
-	/**
45
-	* @brief Resynchronizes all sequences of a database after using INSERTs
46
-	*        without leaving out the auto-incremented column.
47
-	* @param \OC\DB\Connection $conn
48
-	* @return null
49
-	*/
50
-	public function resynchronizeDatabaseSequences(Connection $conn) {
51
-		$filterExpression = '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
52
-		$databaseName = $conn->getDatabase();
53
-		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
44
+    /**
45
+     * @brief Resynchronizes all sequences of a database after using INSERTs
46
+     *        without leaving out the auto-incremented column.
47
+     * @param \OC\DB\Connection $conn
48
+     * @return null
49
+     */
50
+    public function resynchronizeDatabaseSequences(Connection $conn) {
51
+        $filterExpression = '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
52
+        $databaseName = $conn->getDatabase();
53
+        $conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
54 54
 
55
-		foreach ($conn->getSchemaManager()->listSequences() as $sequence) {
56
-			$sequenceName = $sequence->getName();
57
-			$sqlInfo = 'SELECT table_schema, table_name, column_name
55
+        foreach ($conn->getSchemaManager()->listSequences() as $sequence) {
56
+            $sequenceName = $sequence->getName();
57
+            $sqlInfo = 'SELECT table_schema, table_name, column_name
58 58
 				FROM information_schema.columns
59 59
 				WHERE column_default = ? AND table_catalog = ?';
60
-			$sequenceInfo = $conn->fetchAssoc($sqlInfo, [
61
-				"nextval('$sequenceName'::regclass)",
62
-				$databaseName
63
-			]);
64
-			$tableName = $sequenceInfo['table_name'];
65
-			$columnName = $sequenceInfo['column_name'];
66
-			$sqlMaxId = "SELECT MAX($columnName) FROM $tableName";
67
-			$sqlSetval = "SELECT setval('$sequenceName', ($sqlMaxId))";
68
-			$conn->executeQuery($sqlSetval);
69
-		}
70
-	}
60
+            $sequenceInfo = $conn->fetchAssoc($sqlInfo, [
61
+                "nextval('$sequenceName'::regclass)",
62
+                $databaseName
63
+            ]);
64
+            $tableName = $sequenceInfo['table_name'];
65
+            $columnName = $sequenceInfo['column_name'];
66
+            $sqlMaxId = "SELECT MAX($columnName) FROM $tableName";
67
+            $sqlSetval = "SELECT setval('$sequenceName', ($sqlMaxId))";
68
+            $conn->executeQuery($sqlSetval);
69
+        }
70
+    }
71 71
 }
Please login to merge, or discard this patch.
lib/private/DB/PostgreSqlMigrator.php 2 patches
Indentation   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -25,32 +25,32 @@
 block discarded – undo
25 25
 use Doctrine\DBAL\Schema\Schema;
26 26
 
27 27
 class PostgreSqlMigrator extends Migrator {
28
-	/**
29
-	 * @param Schema $targetSchema
30
-	 * @param \Doctrine\DBAL\Connection $connection
31
-	 * @return \Doctrine\DBAL\Schema\SchemaDiff
32
-	 */
33
-	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
34
-		$schemaDiff = parent::getDiff($targetSchema, $connection);
28
+    /**
29
+     * @param Schema $targetSchema
30
+     * @param \Doctrine\DBAL\Connection $connection
31
+     * @return \Doctrine\DBAL\Schema\SchemaDiff
32
+     */
33
+    protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
34
+        $schemaDiff = parent::getDiff($targetSchema, $connection);
35 35
 
36
-		foreach ($schemaDiff->changedTables as $tableDiff) {
37
-			// fix default value in brackets - pg 9.4 is returning a negative default value in ()
38
-			// see https://github.com/doctrine/dbal/issues/2427
39
-			foreach ($tableDiff->changedColumns as $column) {
40
-				$column->changedProperties = array_filter($column->changedProperties, function ($changedProperties) use ($column) {
41
-					if ($changedProperties !== 'default') {
42
-						return true;
43
-					}
44
-					$fromDefault = $column->fromColumn->getDefault();
45
-					$toDefault = $column->column->getDefault();
46
-					$fromDefault = trim($fromDefault, "()");
36
+        foreach ($schemaDiff->changedTables as $tableDiff) {
37
+            // fix default value in brackets - pg 9.4 is returning a negative default value in ()
38
+            // see https://github.com/doctrine/dbal/issues/2427
39
+            foreach ($tableDiff->changedColumns as $column) {
40
+                $column->changedProperties = array_filter($column->changedProperties, function ($changedProperties) use ($column) {
41
+                    if ($changedProperties !== 'default') {
42
+                        return true;
43
+                    }
44
+                    $fromDefault = $column->fromColumn->getDefault();
45
+                    $toDefault = $column->column->getDefault();
46
+                    $fromDefault = trim($fromDefault, "()");
47 47
 
48
-					// by intention usage of !=
49
-					return $fromDefault != $toDefault;
50
-				});
51
-			}
52
-		}
48
+                    // by intention usage of !=
49
+                    return $fromDefault != $toDefault;
50
+                });
51
+            }
52
+        }
53 53
 
54
-		return $schemaDiff;
55
-	}
54
+        return $schemaDiff;
55
+    }
56 56
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -37,7 +37,7 @@
 block discarded – undo
37 37
 			// fix default value in brackets - pg 9.4 is returning a negative default value in ()
38 38
 			// see https://github.com/doctrine/dbal/issues/2427
39 39
 			foreach ($tableDiff->changedColumns as $column) {
40
-				$column->changedProperties = array_filter($column->changedProperties, function ($changedProperties) use ($column) {
40
+				$column->changedProperties = array_filter($column->changedProperties, function($changedProperties) use ($column) {
41 41
 					if ($changedProperties !== 'default') {
42 42
 						return true;
43 43
 					}
Please login to merge, or discard this patch.
lib/private/DB/AdapterMySQL.php 2 patches
Indentation   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -27,31 +27,31 @@
 block discarded – undo
27 27
 
28 28
 class AdapterMySQL extends Adapter {
29 29
 
30
-	/** @var string */
31
-	protected $charset;
32
-
33
-	/**
34
-	 * @param string $tableName
35
-	 */
36
-	public function lockTable($tableName) {
37
-		$this->conn->executeUpdate('LOCK TABLES `' .$tableName . '` WRITE');
38
-	}
39
-
40
-	public function unlockTable() {
41
-		$this->conn->executeUpdate('UNLOCK TABLES');
42
-	}
43
-
44
-	public function fixupStatement($statement) {
45
-		$statement = str_replace(' ILIKE ', ' COLLATE ' . $this->getCharset() . '_general_ci LIKE ', $statement);
46
-		return $statement;
47
-	}
48
-
49
-	protected function getCharset() {
50
-		if (!$this->charset) {
51
-			$params = $this->conn->getParams();
52
-			$this->charset = isset($params['charset']) ? $params['charset'] : 'utf8';
53
-		}
54
-
55
-		return $this->charset;
56
-	}
30
+    /** @var string */
31
+    protected $charset;
32
+
33
+    /**
34
+     * @param string $tableName
35
+     */
36
+    public function lockTable($tableName) {
37
+        $this->conn->executeUpdate('LOCK TABLES `' .$tableName . '` WRITE');
38
+    }
39
+
40
+    public function unlockTable() {
41
+        $this->conn->executeUpdate('UNLOCK TABLES');
42
+    }
43
+
44
+    public function fixupStatement($statement) {
45
+        $statement = str_replace(' ILIKE ', ' COLLATE ' . $this->getCharset() . '_general_ci LIKE ', $statement);
46
+        return $statement;
47
+    }
48
+
49
+    protected function getCharset() {
50
+        if (!$this->charset) {
51
+            $params = $this->conn->getParams();
52
+            $this->charset = isset($params['charset']) ? $params['charset'] : 'utf8';
53
+        }
54
+
55
+        return $this->charset;
56
+    }
57 57
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -34,7 +34,7 @@  discard block
 block discarded – undo
34 34
 	 * @param string $tableName
35 35
 	 */
36 36
 	public function lockTable($tableName) {
37
-		$this->conn->executeUpdate('LOCK TABLES `' .$tableName . '` WRITE');
37
+		$this->conn->executeUpdate('LOCK TABLES `'.$tableName.'` WRITE');
38 38
 	}
39 39
 
40 40
 	public function unlockTable() {
@@ -42,7 +42,7 @@  discard block
 block discarded – undo
42 42
 	}
43 43
 
44 44
 	public function fixupStatement($statement) {
45
-		$statement = str_replace(' ILIKE ', ' COLLATE ' . $this->getCharset() . '_general_ci LIKE ', $statement);
45
+		$statement = str_replace(' ILIKE ', ' COLLATE '.$this->getCharset().'_general_ci LIKE ', $statement);
46 46
 		return $statement;
47 47
 	}
48 48
 
Please login to merge, or discard this patch.
lib/private/DB/MigrationException.php 1 patch
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -25,17 +25,17 @@
 block discarded – undo
25 25
 
26 26
 
27 27
 class MigrationException extends \Exception {
28
-	private $table;
28
+    private $table;
29 29
 
30
-	public function __construct($table, $message) {
31
-		$this->table = $table;
32
-		parent::__construct($message);
33
-	}
30
+    public function __construct($table, $message) {
31
+        $this->table = $table;
32
+        parent::__construct($message);
33
+    }
34 34
 
35
-	/**
36
-	 * @return string
37
-	 */
38
-	public function getTable() {
39
-		return $this->table;
40
-	}
35
+    /**
36
+     * @return string
37
+     */
38
+    public function getTable() {
39
+        return $this->table;
40
+    }
41 41
 }
Please login to merge, or discard this patch.
lib/private/DB/MDB2SchemaWriter.php 3 patches
Indentation   +140 added lines, -140 removed lines patch added patch discarded remove patch
@@ -31,153 +31,153 @@
 block discarded – undo
31 31
 
32 32
 class MDB2SchemaWriter {
33 33
 
34
-	/**
35
-	 * @param string $file
36
-	 * @param \OC\DB\Connection $conn
37
-	 * @return bool
38
-	 */
39
-	static public function saveSchemaToFile($file, \OC\DB\Connection $conn) {
40
-		$config = \OC::$server->getConfig();
34
+    /**
35
+     * @param string $file
36
+     * @param \OC\DB\Connection $conn
37
+     * @return bool
38
+     */
39
+    static public function saveSchemaToFile($file, \OC\DB\Connection $conn) {
40
+        $config = \OC::$server->getConfig();
41 41
 
42
-		$xml = new \SimpleXMLElement('<database/>');
43
-		$xml->addChild('name', $config->getSystemValue('dbname', 'owncloud'));
44
-		$xml->addChild('create', 'true');
45
-		$xml->addChild('overwrite', 'false');
46
-		if($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
47
-			$xml->addChild('charset', 'utf8mb4');
48
-		} else {
49
-			$xml->addChild('charset', 'utf8');
50
-		}
42
+        $xml = new \SimpleXMLElement('<database/>');
43
+        $xml->addChild('name', $config->getSystemValue('dbname', 'owncloud'));
44
+        $xml->addChild('create', 'true');
45
+        $xml->addChild('overwrite', 'false');
46
+        if($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
47
+            $xml->addChild('charset', 'utf8mb4');
48
+        } else {
49
+            $xml->addChild('charset', 'utf8');
50
+        }
51 51
 
52
-		// FIX ME: bloody work around
53
-		if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') {
54
-			$filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/';
55
-		} else {
56
-			$filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/';
57
-		}
58
-		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
52
+        // FIX ME: bloody work around
53
+        if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') {
54
+            $filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/';
55
+        } else {
56
+            $filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/';
57
+        }
58
+        $conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
59 59
 
60
-		foreach ($conn->getSchemaManager()->listTables() as $table) {
61
-			self::saveTable($table, $xml->addChild('table'));
62
-		}
63
-		file_put_contents($file, $xml->asXML());
64
-		return true;
65
-	}
60
+        foreach ($conn->getSchemaManager()->listTables() as $table) {
61
+            self::saveTable($table, $xml->addChild('table'));
62
+        }
63
+        file_put_contents($file, $xml->asXML());
64
+        return true;
65
+    }
66 66
 
67
-	/**
68
-	 * @param \Doctrine\DBAL\Schema\Table $table
69
-	 * @param \SimpleXMLElement $xml
70
-	 */
71
-	private static function saveTable($table, $xml) {
72
-		$xml->addChild('name', $table->getName());
73
-		$declaration = $xml->addChild('declaration');
74
-		foreach($table->getColumns() as $column) {
75
-			self::saveColumn($column, $declaration->addChild('field'));
76
-		}
77
-		foreach($table->getIndexes() as $index) {
78
-			if ($index->getName() == 'PRIMARY') {
79
-				$autoincrement = false;
80
-				foreach($index->getColumns() as $column) {
81
-					if ($table->getColumn($column)->getAutoincrement()) {
82
-						$autoincrement = true;
83
-					}
84
-				}
85
-				if ($autoincrement) {
86
-					continue;
87
-				}
88
-			}
89
-			self::saveIndex($index, $declaration->addChild('index'));
90
-		}
91
-	}
67
+    /**
68
+     * @param \Doctrine\DBAL\Schema\Table $table
69
+     * @param \SimpleXMLElement $xml
70
+     */
71
+    private static function saveTable($table, $xml) {
72
+        $xml->addChild('name', $table->getName());
73
+        $declaration = $xml->addChild('declaration');
74
+        foreach($table->getColumns() as $column) {
75
+            self::saveColumn($column, $declaration->addChild('field'));
76
+        }
77
+        foreach($table->getIndexes() as $index) {
78
+            if ($index->getName() == 'PRIMARY') {
79
+                $autoincrement = false;
80
+                foreach($index->getColumns() as $column) {
81
+                    if ($table->getColumn($column)->getAutoincrement()) {
82
+                        $autoincrement = true;
83
+                    }
84
+                }
85
+                if ($autoincrement) {
86
+                    continue;
87
+                }
88
+            }
89
+            self::saveIndex($index, $declaration->addChild('index'));
90
+        }
91
+    }
92 92
 
93
-	/**
94
-	 * @param Column $column
95
-	 * @param \SimpleXMLElement $xml
96
-	 */
97
-	private static function saveColumn($column, $xml) {
98
-		$xml->addChild('name', $column->getName());
99
-		switch($column->getType()) {
100
-			case 'SmallInt':
101
-			case 'Integer':
102
-			case 'BigInt':
103
-				$xml->addChild('type', 'integer');
104
-				$default = $column->getDefault();
105
-				if (is_null($default) && $column->getAutoincrement()) {
106
-					$default = '0';
107
-				}
108
-				$xml->addChild('default', $default);
109
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
110
-				if ($column->getAutoincrement()) {
111
-					$xml->addChild('autoincrement', '1');
112
-				}
113
-				if ($column->getUnsigned()) {
114
-					$xml->addChild('unsigned', 'true');
115
-				}
116
-				$length = '4';
117
-				if ($column->getType() == 'SmallInt') {
118
-					$length = '2';
119
-				}
120
-				elseif ($column->getType() == 'BigInt') {
121
-					$length = '8';
122
-				}
123
-				$xml->addChild('length', $length);
124
-				break;
125
-			case 'String':
126
-				$xml->addChild('type', 'text');
127
-				$default = trim($column->getDefault());
128
-				if ($default === '') {
129
-					$default = false;
130
-				}
131
-				$xml->addChild('default', $default);
132
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
133
-				$xml->addChild('length', $column->getLength());
134
-				break;
135
-			case 'Text':
136
-				$xml->addChild('type', 'clob');
137
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
138
-				break;
139
-			case 'Decimal':
140
-				$xml->addChild('type', 'decimal');
141
-				$xml->addChild('default', $column->getDefault());
142
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
143
-				$xml->addChild('length', '15');
144
-				break;
145
-			case 'Boolean':
146
-				$xml->addChild('type', 'integer');
147
-				$xml->addChild('default', $column->getDefault());
148
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
149
-				$xml->addChild('length', '1');
150
-				break;
151
-			case 'DateTime':
152
-				$xml->addChild('type', 'timestamp');
153
-				$xml->addChild('default', $column->getDefault());
154
-				$xml->addChild('notnull', self::toBool($column->getNotnull()));
155
-				break;
93
+    /**
94
+     * @param Column $column
95
+     * @param \SimpleXMLElement $xml
96
+     */
97
+    private static function saveColumn($column, $xml) {
98
+        $xml->addChild('name', $column->getName());
99
+        switch($column->getType()) {
100
+            case 'SmallInt':
101
+            case 'Integer':
102
+            case 'BigInt':
103
+                $xml->addChild('type', 'integer');
104
+                $default = $column->getDefault();
105
+                if (is_null($default) && $column->getAutoincrement()) {
106
+                    $default = '0';
107
+                }
108
+                $xml->addChild('default', $default);
109
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
110
+                if ($column->getAutoincrement()) {
111
+                    $xml->addChild('autoincrement', '1');
112
+                }
113
+                if ($column->getUnsigned()) {
114
+                    $xml->addChild('unsigned', 'true');
115
+                }
116
+                $length = '4';
117
+                if ($column->getType() == 'SmallInt') {
118
+                    $length = '2';
119
+                }
120
+                elseif ($column->getType() == 'BigInt') {
121
+                    $length = '8';
122
+                }
123
+                $xml->addChild('length', $length);
124
+                break;
125
+            case 'String':
126
+                $xml->addChild('type', 'text');
127
+                $default = trim($column->getDefault());
128
+                if ($default === '') {
129
+                    $default = false;
130
+                }
131
+                $xml->addChild('default', $default);
132
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
133
+                $xml->addChild('length', $column->getLength());
134
+                break;
135
+            case 'Text':
136
+                $xml->addChild('type', 'clob');
137
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
138
+                break;
139
+            case 'Decimal':
140
+                $xml->addChild('type', 'decimal');
141
+                $xml->addChild('default', $column->getDefault());
142
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
143
+                $xml->addChild('length', '15');
144
+                break;
145
+            case 'Boolean':
146
+                $xml->addChild('type', 'integer');
147
+                $xml->addChild('default', $column->getDefault());
148
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
149
+                $xml->addChild('length', '1');
150
+                break;
151
+            case 'DateTime':
152
+                $xml->addChild('type', 'timestamp');
153
+                $xml->addChild('default', $column->getDefault());
154
+                $xml->addChild('notnull', self::toBool($column->getNotnull()));
155
+                break;
156 156
 
157
-		}
158
-	}
157
+        }
158
+    }
159 159
 
160
-	/**
161
-	 * @param Index $index
162
-	 * @param \SimpleXMLElement $xml
163
-	 */
164
-	private static function saveIndex($index, $xml) {
165
-		$xml->addChild('name', $index->getName());
166
-		if ($index->isPrimary()) {
167
-			$xml->addChild('primary', 'true');
168
-		}
169
-		elseif ($index->isUnique()) {
170
-			$xml->addChild('unique', 'true');
171
-		}
172
-		foreach($index->getColumns() as $column) {
173
-			$field = $xml->addChild('field');
174
-			$field->addChild('name', $column);
175
-			$field->addChild('sorting', 'ascending');
160
+    /**
161
+     * @param Index $index
162
+     * @param \SimpleXMLElement $xml
163
+     */
164
+    private static function saveIndex($index, $xml) {
165
+        $xml->addChild('name', $index->getName());
166
+        if ($index->isPrimary()) {
167
+            $xml->addChild('primary', 'true');
168
+        }
169
+        elseif ($index->isUnique()) {
170
+            $xml->addChild('unique', 'true');
171
+        }
172
+        foreach($index->getColumns() as $column) {
173
+            $field = $xml->addChild('field');
174
+            $field->addChild('name', $column);
175
+            $field->addChild('sorting', 'ascending');
176 176
 			
177
-		}
178
-	}
177
+        }
178
+    }
179 179
 
180
-	private static function toBool($bool) {
181
-		return $bool ? 'true' : 'false';
182
-	}
180
+    private static function toBool($bool) {
181
+        return $bool ? 'true' : 'false';
182
+    }
183 183
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 		$xml->addChild('name', $config->getSystemValue('dbname', 'owncloud'));
44 44
 		$xml->addChild('create', 'true');
45 45
 		$xml->addChild('overwrite', 'false');
46
-		if($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
46
+		if ($config->getSystemValue('dbtype', 'sqlite') === 'mysql' && $config->getSystemValue('mysql.utf8mb4', false)) {
47 47
 			$xml->addChild('charset', 'utf8mb4');
48 48
 		} else {
49 49
 			$xml->addChild('charset', 'utf8');
@@ -51,9 +51,9 @@  discard block
 block discarded – undo
51 51
 
52 52
 		// FIX ME: bloody work around
53 53
 		if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') {
54
-			$filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/';
54
+			$filterExpression = '/^"'.preg_quote($conn->getPrefix()).'/';
55 55
 		} else {
56
-			$filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/';
56
+			$filterExpression = '/^'.preg_quote($conn->getPrefix()).'/';
57 57
 		}
58 58
 		$conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
59 59
 
@@ -71,13 +71,13 @@  discard block
 block discarded – undo
71 71
 	private static function saveTable($table, $xml) {
72 72
 		$xml->addChild('name', $table->getName());
73 73
 		$declaration = $xml->addChild('declaration');
74
-		foreach($table->getColumns() as $column) {
74
+		foreach ($table->getColumns() as $column) {
75 75
 			self::saveColumn($column, $declaration->addChild('field'));
76 76
 		}
77
-		foreach($table->getIndexes() as $index) {
77
+		foreach ($table->getIndexes() as $index) {
78 78
 			if ($index->getName() == 'PRIMARY') {
79 79
 				$autoincrement = false;
80
-				foreach($index->getColumns() as $column) {
80
+				foreach ($index->getColumns() as $column) {
81 81
 					if ($table->getColumn($column)->getAutoincrement()) {
82 82
 						$autoincrement = true;
83 83
 					}
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
 	 */
97 97
 	private static function saveColumn($column, $xml) {
98 98
 		$xml->addChild('name', $column->getName());
99
-		switch($column->getType()) {
99
+		switch ($column->getType()) {
100 100
 			case 'SmallInt':
101 101
 			case 'Integer':
102 102
 			case 'BigInt':
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 		elseif ($index->isUnique()) {
170 170
 			$xml->addChild('unique', 'true');
171 171
 		}
172
-		foreach($index->getColumns() as $column) {
172
+		foreach ($index->getColumns() as $column) {
173 173
 			$field = $xml->addChild('field');
174 174
 			$field->addChild('name', $column);
175 175
 			$field->addChild('sorting', 'ascending');
Please login to merge, or discard this patch.
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -116,8 +116,7 @@  discard block
 block discarded – undo
116 116
 				$length = '4';
117 117
 				if ($column->getType() == 'SmallInt') {
118 118
 					$length = '2';
119
-				}
120
-				elseif ($column->getType() == 'BigInt') {
119
+				} elseif ($column->getType() == 'BigInt') {
121 120
 					$length = '8';
122 121
 				}
123 122
 				$xml->addChild('length', $length);
@@ -165,8 +164,7 @@  discard block
 block discarded – undo
165 164
 		$xml->addChild('name', $index->getName());
166 165
 		if ($index->isPrimary()) {
167 166
 			$xml->addChild('primary', 'true');
168
-		}
169
-		elseif ($index->isUnique()) {
167
+		} elseif ($index->isUnique()) {
170 168
 			$xml->addChild('unique', 'true');
171 169
 		}
172 170
 		foreach($index->getColumns() as $column) {
Please login to merge, or discard this patch.
lib/private/DB/Migrator.php 2 patches
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -137,7 +137,7 @@  discard block
 block discarded – undo
137 137
 	 * @return string
138 138
 	 */
139 139
 	protected function generateTemporaryTableName($name) {
140
-		return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
140
+		return $this->config->getSystemValue('dbtableprefix', 'oc_').$name.'_'.$this->random->generate(13, ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_DIGITS);
141 141
 	}
142 142
 
143 143
 	/**
@@ -188,7 +188,7 @@  discard block
 block discarded – undo
188 188
 				$indexName = $index->getName();
189 189
 			} else {
190 190
 				// avoid conflicts in index names
191
-				$indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
191
+				$indexName = $this->config->getSystemValue('dbtableprefix', 'oc_').$this->random->generate(13, ISecureRandom::CHAR_LOWER);
192 192
 			}
193 193
 			$newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
194 194
 		}
@@ -268,15 +268,15 @@  discard block
 block discarded – undo
268 268
 		$quotedSource = $this->connection->quoteIdentifier($sourceName);
269 269
 		$quotedTarget = $this->connection->quoteIdentifier($targetName);
270 270
 
271
-		$this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
272
-		$this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
271
+		$this->connection->exec('CREATE TABLE '.$quotedTarget.' (LIKE '.$quotedSource.')');
272
+		$this->connection->exec('INSERT INTO '.$quotedTarget.' SELECT * FROM '.$quotedSource);
273 273
 	}
274 274
 
275 275
 	/**
276 276
 	 * @param string $name
277 277
 	 */
278 278
 	protected function dropTable($name) {
279
-		$this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
279
+		$this->connection->exec('DROP TABLE '.$this->connection->quoteIdentifier($name));
280 280
 	}
281 281
 
282 282
 	/**
@@ -284,30 +284,30 @@  discard block
 block discarded – undo
284 284
 	 * @return string
285 285
 	 */
286 286
 	protected function convertStatementToScript($statement) {
287
-		$script = $statement . ';';
287
+		$script = $statement.';';
288 288
 		$script .= PHP_EOL;
289 289
 		$script .= PHP_EOL;
290 290
 		return $script;
291 291
 	}
292 292
 
293 293
 	protected function getFilterExpression() {
294
-		return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
294
+		return '/^'.preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')).'/';
295 295
 	}
296 296
 
297 297
 	protected function emit($sql, $step, $max) {
298 298
 		if ($this->noEmit) {
299 299
 			return;
300 300
 		}
301
-		if(is_null($this->dispatcher)) {
301
+		if (is_null($this->dispatcher)) {
302 302
 			return;
303 303
 		}
304
-		$this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
304
+		$this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step + 1, $max]));
305 305
 	}
306 306
 
307 307
 	private function emitCheckStep($tableName, $step, $max) {
308
-		if(is_null($this->dispatcher)) {
308
+		if (is_null($this->dispatcher)) {
309 309
 			return;
310 310
 		}
311
-		$this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
311
+		$this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step + 1, $max]));
312 312
 	}
313 313
 }
Please login to merge, or discard this patch.
Indentation   +268 added lines, -268 removed lines patch added patch discarded remove patch
@@ -46,272 +46,272 @@
 block discarded – undo
46 46
 
47 47
 class Migrator {
48 48
 
49
-	/** @var \Doctrine\DBAL\Connection */
50
-	protected $connection;
51
-
52
-	/** @var ISecureRandom */
53
-	private $random;
54
-
55
-	/** @var IConfig */
56
-	protected $config;
57
-
58
-	/** @var EventDispatcherInterface  */
59
-	private $dispatcher;
60
-
61
-	/** @var bool */
62
-	private $noEmit = false;
63
-
64
-	/**
65
-	 * @param \Doctrine\DBAL\Connection $connection
66
-	 * @param ISecureRandom $random
67
-	 * @param IConfig $config
68
-	 * @param EventDispatcherInterface $dispatcher
69
-	 */
70
-	public function __construct(\Doctrine\DBAL\Connection $connection,
71
-								ISecureRandom $random,
72
-								IConfig $config,
73
-								EventDispatcherInterface $dispatcher = null) {
74
-		$this->connection = $connection;
75
-		$this->random = $random;
76
-		$this->config = $config;
77
-		$this->dispatcher = $dispatcher;
78
-	}
79
-
80
-	/**
81
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
82
-	 */
83
-	public function migrate(Schema $targetSchema) {
84
-		$this->noEmit = true;
85
-		$this->applySchema($targetSchema);
86
-	}
87
-
88
-	/**
89
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
90
-	 * @return string
91
-	 */
92
-	public function generateChangeScript(Schema $targetSchema) {
93
-		$schemaDiff = $this->getDiff($targetSchema, $this->connection);
94
-
95
-		$script = '';
96
-		$sqls = $schemaDiff->toSql($this->connection->getDatabasePlatform());
97
-		foreach ($sqls as $sql) {
98
-			$script .= $this->convertStatementToScript($sql);
99
-		}
100
-
101
-		return $script;
102
-	}
103
-
104
-	/**
105
-	 * @param Schema $targetSchema
106
-	 * @throws \OC\DB\MigrationException
107
-	 */
108
-	public function checkMigrate(Schema $targetSchema) {
109
-		$this->noEmit = true;
110
-		/**@var \Doctrine\DBAL\Schema\Table[] $tables */
111
-		$tables = $targetSchema->getTables();
112
-		$filterExpression = $this->getFilterExpression();
113
-		$this->connection->getConfiguration()->
114
-			setFilterSchemaAssetsExpression($filterExpression);
115
-		$existingTables = $this->connection->getSchemaManager()->listTableNames();
116
-
117
-		$step = 0;
118
-		foreach ($tables as $table) {
119
-			if (strpos($table->getName(), '.')) {
120
-				list(, $tableName) = explode('.', $table->getName());
121
-			} else {
122
-				$tableName = $table->getName();
123
-			}
124
-			$this->emitCheckStep($tableName, $step++, count($tables));
125
-			// don't need to check for new tables
126
-			if (array_search($tableName, $existingTables) !== false) {
127
-				$this->checkTableMigrate($table);
128
-			}
129
-		}
130
-	}
131
-
132
-	/**
133
-	 * Create a unique name for the temporary table
134
-	 *
135
-	 * @param string $name
136
-	 * @return string
137
-	 */
138
-	protected function generateTemporaryTableName($name) {
139
-		return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
140
-	}
141
-
142
-	/**
143
-	 * Check the migration of a table on a copy so we can detect errors before messing with the real table
144
-	 *
145
-	 * @param \Doctrine\DBAL\Schema\Table $table
146
-	 * @throws \OC\DB\MigrationException
147
-	 */
148
-	protected function checkTableMigrate(Table $table) {
149
-		$name = $table->getName();
150
-		$tmpName = $this->generateTemporaryTableName($name);
151
-
152
-		$this->copyTable($name, $tmpName);
153
-
154
-		//create the migration schema for the temporary table
155
-		$tmpTable = $this->renameTableSchema($table, $tmpName);
156
-		$schemaConfig = new SchemaConfig();
157
-		$schemaConfig->setName($this->connection->getDatabase());
158
-		$schema = new Schema([$tmpTable], [], $schemaConfig);
159
-
160
-		try {
161
-			$this->applySchema($schema);
162
-			$this->dropTable($tmpName);
163
-		} catch (DBALException $e) {
164
-			// pgsql needs to commit it's failed transaction before doing anything else
165
-			if ($this->connection->isTransactionActive()) {
166
-				$this->connection->commit();
167
-			}
168
-			$this->dropTable($tmpName);
169
-			throw new MigrationException($table->getName(), $e->getMessage());
170
-		}
171
-	}
172
-
173
-	/**
174
-	 * @param \Doctrine\DBAL\Schema\Table $table
175
-	 * @param string $newName
176
-	 * @return \Doctrine\DBAL\Schema\Table
177
-	 */
178
-	protected function renameTableSchema(Table $table, $newName) {
179
-		/**
180
-		 * @var \Doctrine\DBAL\Schema\Index[] $indexes
181
-		 */
182
-		$indexes = $table->getIndexes();
183
-		$newIndexes = [];
184
-		foreach ($indexes as $index) {
185
-			if ($index->isPrimary()) {
186
-				// do not rename primary key
187
-				$indexName = $index->getName();
188
-			} else {
189
-				// avoid conflicts in index names
190
-				$indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
191
-			}
192
-			$newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
193
-		}
194
-
195
-		// foreign keys are not supported so we just set it to an empty array
196
-		return new Table($newName, $table->getColumns(), $newIndexes, [], 0, $table->getOptions());
197
-	}
198
-
199
-	public function createSchema() {
200
-		$filterExpression = $this->getFilterExpression();
201
-		$this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
202
-		return $this->connection->getSchemaManager()->createSchema();
203
-	}
204
-
205
-	/**
206
-	 * @param Schema $targetSchema
207
-	 * @param \Doctrine\DBAL\Connection $connection
208
-	 * @return \Doctrine\DBAL\Schema\SchemaDiff
209
-	 * @throws DBALException
210
-	 */
211
-	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
212
-		// adjust varchar columns with a length higher then getVarcharMaxLength to clob
213
-		foreach ($targetSchema->getTables() as $table) {
214
-			foreach ($table->getColumns() as $column) {
215
-				if ($column->getType() instanceof StringType) {
216
-					if ($column->getLength() > $connection->getDatabasePlatform()->getVarcharMaxLength()) {
217
-						$column->setType(Type::getType('text'));
218
-						$column->setLength(null);
219
-					}
220
-				}
221
-			}
222
-		}
223
-
224
-		$filterExpression = $this->getFilterExpression();
225
-		$this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
226
-		$sourceSchema = $connection->getSchemaManager()->createSchema();
227
-
228
-		// remove tables we don't know about
229
-		/** @var $table \Doctrine\DBAL\Schema\Table */
230
-		foreach ($sourceSchema->getTables() as $table) {
231
-			if (!$targetSchema->hasTable($table->getName())) {
232
-				$sourceSchema->dropTable($table->getName());
233
-			}
234
-		}
235
-		// remove sequences we don't know about
236
-		foreach ($sourceSchema->getSequences() as $table) {
237
-			if (!$targetSchema->hasSequence($table->getName())) {
238
-				$sourceSchema->dropSequence($table->getName());
239
-			}
240
-		}
241
-
242
-		$comparator = new Comparator();
243
-		return $comparator->compare($sourceSchema, $targetSchema);
244
-	}
245
-
246
-	/**
247
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
248
-	 * @param \Doctrine\DBAL\Connection $connection
249
-	 */
250
-	protected function applySchema(Schema $targetSchema, \Doctrine\DBAL\Connection $connection = null) {
251
-		if (is_null($connection)) {
252
-			$connection = $this->connection;
253
-		}
254
-
255
-		$schemaDiff = $this->getDiff($targetSchema, $connection);
256
-
257
-		$connection->beginTransaction();
258
-		$sqls = $schemaDiff->toSql($connection->getDatabasePlatform());
259
-		$step = 0;
260
-		foreach ($sqls as $sql) {
261
-			$this->emit($sql, $step++, count($sqls));
262
-			$connection->query($sql);
263
-		}
264
-		$connection->commit();
265
-	}
266
-
267
-	/**
268
-	 * @param string $sourceName
269
-	 * @param string $targetName
270
-	 */
271
-	protected function copyTable($sourceName, $targetName) {
272
-		$quotedSource = $this->connection->quoteIdentifier($sourceName);
273
-		$quotedTarget = $this->connection->quoteIdentifier($targetName);
274
-
275
-		$this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
276
-		$this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
277
-	}
278
-
279
-	/**
280
-	 * @param string $name
281
-	 */
282
-	protected function dropTable($name) {
283
-		$this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
284
-	}
285
-
286
-	/**
287
-	 * @param $statement
288
-	 * @return string
289
-	 */
290
-	protected function convertStatementToScript($statement) {
291
-		$script = $statement . ';';
292
-		$script .= PHP_EOL;
293
-		$script .= PHP_EOL;
294
-		return $script;
295
-	}
296
-
297
-	protected function getFilterExpression() {
298
-		return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
299
-	}
300
-
301
-	protected function emit($sql, $step, $max) {
302
-		if ($this->noEmit) {
303
-			return;
304
-		}
305
-		if(is_null($this->dispatcher)) {
306
-			return;
307
-		}
308
-		$this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
309
-	}
310
-
311
-	private function emitCheckStep($tableName, $step, $max) {
312
-		if(is_null($this->dispatcher)) {
313
-			return;
314
-		}
315
-		$this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
316
-	}
49
+    /** @var \Doctrine\DBAL\Connection */
50
+    protected $connection;
51
+
52
+    /** @var ISecureRandom */
53
+    private $random;
54
+
55
+    /** @var IConfig */
56
+    protected $config;
57
+
58
+    /** @var EventDispatcherInterface  */
59
+    private $dispatcher;
60
+
61
+    /** @var bool */
62
+    private $noEmit = false;
63
+
64
+    /**
65
+     * @param \Doctrine\DBAL\Connection $connection
66
+     * @param ISecureRandom $random
67
+     * @param IConfig $config
68
+     * @param EventDispatcherInterface $dispatcher
69
+     */
70
+    public function __construct(\Doctrine\DBAL\Connection $connection,
71
+                                ISecureRandom $random,
72
+                                IConfig $config,
73
+                                EventDispatcherInterface $dispatcher = null) {
74
+        $this->connection = $connection;
75
+        $this->random = $random;
76
+        $this->config = $config;
77
+        $this->dispatcher = $dispatcher;
78
+    }
79
+
80
+    /**
81
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
82
+     */
83
+    public function migrate(Schema $targetSchema) {
84
+        $this->noEmit = true;
85
+        $this->applySchema($targetSchema);
86
+    }
87
+
88
+    /**
89
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
90
+     * @return string
91
+     */
92
+    public function generateChangeScript(Schema $targetSchema) {
93
+        $schemaDiff = $this->getDiff($targetSchema, $this->connection);
94
+
95
+        $script = '';
96
+        $sqls = $schemaDiff->toSql($this->connection->getDatabasePlatform());
97
+        foreach ($sqls as $sql) {
98
+            $script .= $this->convertStatementToScript($sql);
99
+        }
100
+
101
+        return $script;
102
+    }
103
+
104
+    /**
105
+     * @param Schema $targetSchema
106
+     * @throws \OC\DB\MigrationException
107
+     */
108
+    public function checkMigrate(Schema $targetSchema) {
109
+        $this->noEmit = true;
110
+        /**@var \Doctrine\DBAL\Schema\Table[] $tables */
111
+        $tables = $targetSchema->getTables();
112
+        $filterExpression = $this->getFilterExpression();
113
+        $this->connection->getConfiguration()->
114
+            setFilterSchemaAssetsExpression($filterExpression);
115
+        $existingTables = $this->connection->getSchemaManager()->listTableNames();
116
+
117
+        $step = 0;
118
+        foreach ($tables as $table) {
119
+            if (strpos($table->getName(), '.')) {
120
+                list(, $tableName) = explode('.', $table->getName());
121
+            } else {
122
+                $tableName = $table->getName();
123
+            }
124
+            $this->emitCheckStep($tableName, $step++, count($tables));
125
+            // don't need to check for new tables
126
+            if (array_search($tableName, $existingTables) !== false) {
127
+                $this->checkTableMigrate($table);
128
+            }
129
+        }
130
+    }
131
+
132
+    /**
133
+     * Create a unique name for the temporary table
134
+     *
135
+     * @param string $name
136
+     * @return string
137
+     */
138
+    protected function generateTemporaryTableName($name) {
139
+        return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
140
+    }
141
+
142
+    /**
143
+     * Check the migration of a table on a copy so we can detect errors before messing with the real table
144
+     *
145
+     * @param \Doctrine\DBAL\Schema\Table $table
146
+     * @throws \OC\DB\MigrationException
147
+     */
148
+    protected function checkTableMigrate(Table $table) {
149
+        $name = $table->getName();
150
+        $tmpName = $this->generateTemporaryTableName($name);
151
+
152
+        $this->copyTable($name, $tmpName);
153
+
154
+        //create the migration schema for the temporary table
155
+        $tmpTable = $this->renameTableSchema($table, $tmpName);
156
+        $schemaConfig = new SchemaConfig();
157
+        $schemaConfig->setName($this->connection->getDatabase());
158
+        $schema = new Schema([$tmpTable], [], $schemaConfig);
159
+
160
+        try {
161
+            $this->applySchema($schema);
162
+            $this->dropTable($tmpName);
163
+        } catch (DBALException $e) {
164
+            // pgsql needs to commit it's failed transaction before doing anything else
165
+            if ($this->connection->isTransactionActive()) {
166
+                $this->connection->commit();
167
+            }
168
+            $this->dropTable($tmpName);
169
+            throw new MigrationException($table->getName(), $e->getMessage());
170
+        }
171
+    }
172
+
173
+    /**
174
+     * @param \Doctrine\DBAL\Schema\Table $table
175
+     * @param string $newName
176
+     * @return \Doctrine\DBAL\Schema\Table
177
+     */
178
+    protected function renameTableSchema(Table $table, $newName) {
179
+        /**
180
+         * @var \Doctrine\DBAL\Schema\Index[] $indexes
181
+         */
182
+        $indexes = $table->getIndexes();
183
+        $newIndexes = [];
184
+        foreach ($indexes as $index) {
185
+            if ($index->isPrimary()) {
186
+                // do not rename primary key
187
+                $indexName = $index->getName();
188
+            } else {
189
+                // avoid conflicts in index names
190
+                $indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
191
+            }
192
+            $newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
193
+        }
194
+
195
+        // foreign keys are not supported so we just set it to an empty array
196
+        return new Table($newName, $table->getColumns(), $newIndexes, [], 0, $table->getOptions());
197
+    }
198
+
199
+    public function createSchema() {
200
+        $filterExpression = $this->getFilterExpression();
201
+        $this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
202
+        return $this->connection->getSchemaManager()->createSchema();
203
+    }
204
+
205
+    /**
206
+     * @param Schema $targetSchema
207
+     * @param \Doctrine\DBAL\Connection $connection
208
+     * @return \Doctrine\DBAL\Schema\SchemaDiff
209
+     * @throws DBALException
210
+     */
211
+    protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
212
+        // adjust varchar columns with a length higher then getVarcharMaxLength to clob
213
+        foreach ($targetSchema->getTables() as $table) {
214
+            foreach ($table->getColumns() as $column) {
215
+                if ($column->getType() instanceof StringType) {
216
+                    if ($column->getLength() > $connection->getDatabasePlatform()->getVarcharMaxLength()) {
217
+                        $column->setType(Type::getType('text'));
218
+                        $column->setLength(null);
219
+                    }
220
+                }
221
+            }
222
+        }
223
+
224
+        $filterExpression = $this->getFilterExpression();
225
+        $this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
226
+        $sourceSchema = $connection->getSchemaManager()->createSchema();
227
+
228
+        // remove tables we don't know about
229
+        /** @var $table \Doctrine\DBAL\Schema\Table */
230
+        foreach ($sourceSchema->getTables() as $table) {
231
+            if (!$targetSchema->hasTable($table->getName())) {
232
+                $sourceSchema->dropTable($table->getName());
233
+            }
234
+        }
235
+        // remove sequences we don't know about
236
+        foreach ($sourceSchema->getSequences() as $table) {
237
+            if (!$targetSchema->hasSequence($table->getName())) {
238
+                $sourceSchema->dropSequence($table->getName());
239
+            }
240
+        }
241
+
242
+        $comparator = new Comparator();
243
+        return $comparator->compare($sourceSchema, $targetSchema);
244
+    }
245
+
246
+    /**
247
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
248
+     * @param \Doctrine\DBAL\Connection $connection
249
+     */
250
+    protected function applySchema(Schema $targetSchema, \Doctrine\DBAL\Connection $connection = null) {
251
+        if (is_null($connection)) {
252
+            $connection = $this->connection;
253
+        }
254
+
255
+        $schemaDiff = $this->getDiff($targetSchema, $connection);
256
+
257
+        $connection->beginTransaction();
258
+        $sqls = $schemaDiff->toSql($connection->getDatabasePlatform());
259
+        $step = 0;
260
+        foreach ($sqls as $sql) {
261
+            $this->emit($sql, $step++, count($sqls));
262
+            $connection->query($sql);
263
+        }
264
+        $connection->commit();
265
+    }
266
+
267
+    /**
268
+     * @param string $sourceName
269
+     * @param string $targetName
270
+     */
271
+    protected function copyTable($sourceName, $targetName) {
272
+        $quotedSource = $this->connection->quoteIdentifier($sourceName);
273
+        $quotedTarget = $this->connection->quoteIdentifier($targetName);
274
+
275
+        $this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
276
+        $this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
277
+    }
278
+
279
+    /**
280
+     * @param string $name
281
+     */
282
+    protected function dropTable($name) {
283
+        $this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
284
+    }
285
+
286
+    /**
287
+     * @param $statement
288
+     * @return string
289
+     */
290
+    protected function convertStatementToScript($statement) {
291
+        $script = $statement . ';';
292
+        $script .= PHP_EOL;
293
+        $script .= PHP_EOL;
294
+        return $script;
295
+    }
296
+
297
+    protected function getFilterExpression() {
298
+        return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
299
+    }
300
+
301
+    protected function emit($sql, $step, $max) {
302
+        if ($this->noEmit) {
303
+            return;
304
+        }
305
+        if(is_null($this->dispatcher)) {
306
+            return;
307
+        }
308
+        $this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
309
+    }
310
+
311
+    private function emitCheckStep($tableName, $step, $max) {
312
+        if(is_null($this->dispatcher)) {
313
+            return;
314
+        }
315
+        $this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
316
+    }
317 317
 }
Please login to merge, or discard this patch.
lib/private/DB/SQLiteMigrator.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -63,7 +63,7 @@
 block discarded – undo
63 63
 	 * @return string
64 64
 	 */
65 65
 	private function buildTempDatabase() {
66
-		$dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data');
66
+		$dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT.'/data');
67 67
 		$tmpFile = uniqid("oc_");
68 68
 		return "$dataDir/$tmpFile.db";
69 69
 	}
Please login to merge, or discard this patch.
Indentation   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -32,62 +32,62 @@
 block discarded – undo
32 32
 
33 33
 class SQLiteMigrator extends Migrator {
34 34
 
35
-	/**
36
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
37
-	 * @throws \OC\DB\MigrationException
38
-	 *
39
-	 * For sqlite we simple make a copy of the entire database, and test the migration on that
40
-	 */
41
-	public function checkMigrate(\Doctrine\DBAL\Schema\Schema $targetSchema) {
42
-		$dbFile = $this->connection->getDatabase();
43
-		$tmpFile = $this->buildTempDatabase();
44
-		copy($dbFile, $tmpFile);
35
+    /**
36
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
37
+     * @throws \OC\DB\MigrationException
38
+     *
39
+     * For sqlite we simple make a copy of the entire database, and test the migration on that
40
+     */
41
+    public function checkMigrate(\Doctrine\DBAL\Schema\Schema $targetSchema) {
42
+        $dbFile = $this->connection->getDatabase();
43
+        $tmpFile = $this->buildTempDatabase();
44
+        copy($dbFile, $tmpFile);
45 45
 
46
-		$connectionParams = [
47
-			'path' => $tmpFile,
48
-			'driver' => 'pdo_sqlite',
49
-		];
50
-		$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams);
51
-		try {
52
-			$this->applySchema($targetSchema, $conn);
53
-			$conn->close();
54
-			unlink($tmpFile);
55
-		} catch (DBALException $e) {
56
-			$conn->close();
57
-			unlink($tmpFile);
58
-			throw new MigrationException('', $e->getMessage());
59
-		}
60
-	}
46
+        $connectionParams = [
47
+            'path' => $tmpFile,
48
+            'driver' => 'pdo_sqlite',
49
+        ];
50
+        $conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams);
51
+        try {
52
+            $this->applySchema($targetSchema, $conn);
53
+            $conn->close();
54
+            unlink($tmpFile);
55
+        } catch (DBALException $e) {
56
+            $conn->close();
57
+            unlink($tmpFile);
58
+            throw new MigrationException('', $e->getMessage());
59
+        }
60
+    }
61 61
 
62
-	/**
63
-	 * @return string
64
-	 */
65
-	private function buildTempDatabase() {
66
-		$dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data');
67
-		$tmpFile = uniqid("oc_");
68
-		return "$dataDir/$tmpFile.db";
69
-	}
62
+    /**
63
+     * @return string
64
+     */
65
+    private function buildTempDatabase() {
66
+        $dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data');
67
+        $tmpFile = uniqid("oc_");
68
+        return "$dataDir/$tmpFile.db";
69
+    }
70 70
 
71
-	/**
72
-	 * @param Schema $targetSchema
73
-	 * @param \Doctrine\DBAL\Connection $connection
74
-	 * @return \Doctrine\DBAL\Schema\SchemaDiff
75
-	 */
76
-	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
77
-		$platform = $connection->getDatabasePlatform();
78
-		$platform->registerDoctrineTypeMapping('tinyint unsigned', 'integer');
79
-		$platform->registerDoctrineTypeMapping('smallint unsigned', 'integer');
80
-		$platform->registerDoctrineTypeMapping('varchar ', 'string');
71
+    /**
72
+     * @param Schema $targetSchema
73
+     * @param \Doctrine\DBAL\Connection $connection
74
+     * @return \Doctrine\DBAL\Schema\SchemaDiff
75
+     */
76
+    protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
77
+        $platform = $connection->getDatabasePlatform();
78
+        $platform->registerDoctrineTypeMapping('tinyint unsigned', 'integer');
79
+        $platform->registerDoctrineTypeMapping('smallint unsigned', 'integer');
80
+        $platform->registerDoctrineTypeMapping('varchar ', 'string');
81 81
 
82
-		// with sqlite autoincrement columns is of type integer
83
-		foreach ($targetSchema->getTables() as $table) {
84
-			foreach ($table->getColumns() as $column) {
85
-				if ($column->getType() instanceof BigIntType && $column->getAutoincrement()) {
86
-					$column->setType(Type::getType('integer'));
87
-				}
88
-			}
89
-		}
82
+        // with sqlite autoincrement columns is of type integer
83
+        foreach ($targetSchema->getTables() as $table) {
84
+            foreach ($table->getColumns() as $column) {
85
+                if ($column->getType() instanceof BigIntType && $column->getAutoincrement()) {
86
+                    $column->setType(Type::getType('integer'));
87
+                }
88
+            }
89
+        }
90 90
 
91
-		return parent::getDiff($targetSchema, $connection);
92
-	}
91
+        return parent::getDiff($targetSchema, $connection);
92
+    }
93 93
 }
Please login to merge, or discard this patch.