Passed
Push — master ( 07dffb...bd5189 )
by John
11:02 queued 10s
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
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, array(
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, array(
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.
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.
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
@@ -44,272 +44,272 @@
 block discarded – undo
44 44
 
45 45
 class Migrator {
46 46
 
47
-	/** @var \Doctrine\DBAL\Connection */
48
-	protected $connection;
49
-
50
-	/** @var ISecureRandom */
51
-	private $random;
52
-
53
-	/** @var IConfig */
54
-	protected $config;
55
-
56
-	/** @var EventDispatcherInterface  */
57
-	private $dispatcher;
58
-
59
-	/** @var bool */
60
-	private $noEmit = false;
61
-
62
-	/**
63
-	 * @param \Doctrine\DBAL\Connection|Connection $connection
64
-	 * @param ISecureRandom $random
65
-	 * @param IConfig $config
66
-	 * @param EventDispatcherInterface $dispatcher
67
-	 */
68
-	public function __construct(\Doctrine\DBAL\Connection $connection,
69
-								ISecureRandom $random,
70
-								IConfig $config,
71
-								EventDispatcherInterface $dispatcher = null) {
72
-		$this->connection = $connection;
73
-		$this->random = $random;
74
-		$this->config = $config;
75
-		$this->dispatcher = $dispatcher;
76
-	}
77
-
78
-	/**
79
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
80
-	 */
81
-	public function migrate(Schema $targetSchema) {
82
-		$this->noEmit = true;
83
-		$this->applySchema($targetSchema);
84
-	}
85
-
86
-	/**
87
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
88
-	 * @return string
89
-	 */
90
-	public function generateChangeScript(Schema $targetSchema) {
91
-		$schemaDiff = $this->getDiff($targetSchema, $this->connection);
92
-
93
-		$script = '';
94
-		$sqls = $schemaDiff->toSql($this->connection->getDatabasePlatform());
95
-		foreach ($sqls as $sql) {
96
-			$script .= $this->convertStatementToScript($sql);
97
-		}
98
-
99
-		return $script;
100
-	}
101
-
102
-	/**
103
-	 * @param Schema $targetSchema
104
-	 * @throws \OC\DB\MigrationException
105
-	 */
106
-	public function checkMigrate(Schema $targetSchema) {
107
-		$this->noEmit = true;
108
-		/**@var \Doctrine\DBAL\Schema\Table[] $tables */
109
-		$tables = $targetSchema->getTables();
110
-		$filterExpression = $this->getFilterExpression();
111
-		$this->connection->getConfiguration()->
112
-			setFilterSchemaAssetsExpression($filterExpression);
113
-		$existingTables = $this->connection->getSchemaManager()->listTableNames();
114
-
115
-		$step = 0;
116
-		foreach ($tables as $table) {
117
-			if (strpos($table->getName(), '.')) {
118
-				list(, $tableName) = explode('.', $table->getName());
119
-			} else {
120
-				$tableName = $table->getName();
121
-			}
122
-			$this->emitCheckStep($tableName, $step++, count($tables));
123
-			// don't need to check for new tables
124
-			if (array_search($tableName, $existingTables) !== false) {
125
-				$this->checkTableMigrate($table);
126
-			}
127
-		}
128
-	}
129
-
130
-	/**
131
-	 * Create a unique name for the temporary table
132
-	 *
133
-	 * @param string $name
134
-	 * @return string
135
-	 */
136
-	protected function generateTemporaryTableName($name) {
137
-		return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
138
-	}
139
-
140
-	/**
141
-	 * Check the migration of a table on a copy so we can detect errors before messing with the real table
142
-	 *
143
-	 * @param \Doctrine\DBAL\Schema\Table $table
144
-	 * @throws \OC\DB\MigrationException
145
-	 */
146
-	protected function checkTableMigrate(Table $table) {
147
-		$name = $table->getName();
148
-		$tmpName = $this->generateTemporaryTableName($name);
149
-
150
-		$this->copyTable($name, $tmpName);
151
-
152
-		//create the migration schema for the temporary table
153
-		$tmpTable = $this->renameTableSchema($table, $tmpName);
154
-		$schemaConfig = new SchemaConfig();
155
-		$schemaConfig->setName($this->connection->getDatabase());
156
-		$schema = new Schema(array($tmpTable), array(), $schemaConfig);
157
-
158
-		try {
159
-			$this->applySchema($schema);
160
-			$this->dropTable($tmpName);
161
-		} catch (DBALException $e) {
162
-			// pgsql needs to commit it's failed transaction before doing anything else
163
-			if ($this->connection->isTransactionActive()) {
164
-				$this->connection->commit();
165
-			}
166
-			$this->dropTable($tmpName);
167
-			throw new MigrationException($table->getName(), $e->getMessage());
168
-		}
169
-	}
170
-
171
-	/**
172
-	 * @param \Doctrine\DBAL\Schema\Table $table
173
-	 * @param string $newName
174
-	 * @return \Doctrine\DBAL\Schema\Table
175
-	 */
176
-	protected function renameTableSchema(Table $table, $newName) {
177
-		/**
178
-		 * @var \Doctrine\DBAL\Schema\Index[] $indexes
179
-		 */
180
-		$indexes = $table->getIndexes();
181
-		$newIndexes = array();
182
-		foreach ($indexes as $index) {
183
-			if ($index->isPrimary()) {
184
-				// do not rename primary key
185
-				$indexName = $index->getName();
186
-			} else {
187
-				// avoid conflicts in index names
188
-				$indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
189
-			}
190
-			$newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
191
-		}
192
-
193
-		// foreign keys are not supported so we just set it to an empty array
194
-		return new Table($newName, $table->getColumns(), $newIndexes, array(), 0, $table->getOptions());
195
-	}
196
-
197
-	public function createSchema() {
198
-		$filterExpression = $this->getFilterExpression();
199
-		$this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
200
-		return $this->connection->getSchemaManager()->createSchema();
201
-	}
202
-
203
-	/**
204
-	 * @param Schema $targetSchema
205
-	 * @param \Doctrine\DBAL\Connection $connection
206
-	 * @return \Doctrine\DBAL\Schema\SchemaDiff
207
-	 * @throws DBALException
208
-	 */
209
-	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
210
-		// adjust varchar columns with a length higher then getVarcharMaxLength to clob
211
-		foreach ($targetSchema->getTables() as $table) {
212
-			foreach ($table->getColumns() as $column) {
213
-				if ($column->getType() instanceof StringType) {
214
-					if ($column->getLength() > $connection->getDatabasePlatform()->getVarcharMaxLength()) {
215
-						$column->setType(Type::getType('text'));
216
-						$column->setLength(null);
217
-					}
218
-				}
219
-			}
220
-		}
221
-
222
-		$filterExpression = $this->getFilterExpression();
223
-		$this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
224
-		$sourceSchema = $connection->getSchemaManager()->createSchema();
225
-
226
-		// remove tables we don't know about
227
-		/** @var $table \Doctrine\DBAL\Schema\Table */
228
-		foreach ($sourceSchema->getTables() as $table) {
229
-			if (!$targetSchema->hasTable($table->getName())) {
230
-				$sourceSchema->dropTable($table->getName());
231
-			}
232
-		}
233
-		// remove sequences we don't know about
234
-		foreach ($sourceSchema->getSequences() as $table) {
235
-			if (!$targetSchema->hasSequence($table->getName())) {
236
-				$sourceSchema->dropSequence($table->getName());
237
-			}
238
-		}
239
-
240
-		$comparator = new Comparator();
241
-		return $comparator->compare($sourceSchema, $targetSchema);
242
-	}
243
-
244
-	/**
245
-	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
246
-	 * @param \Doctrine\DBAL\Connection $connection
247
-	 */
248
-	protected function applySchema(Schema $targetSchema, \Doctrine\DBAL\Connection $connection = null) {
249
-		if (is_null($connection)) {
250
-			$connection = $this->connection;
251
-		}
252
-
253
-		$schemaDiff = $this->getDiff($targetSchema, $connection);
254
-
255
-		$connection->beginTransaction();
256
-		$sqls = $schemaDiff->toSql($connection->getDatabasePlatform());
257
-		$step = 0;
258
-		foreach ($sqls as $sql) {
259
-			$this->emit($sql, $step++, count($sqls));
260
-			$connection->query($sql);
261
-		}
262
-		$connection->commit();
263
-	}
264
-
265
-	/**
266
-	 * @param string $sourceName
267
-	 * @param string $targetName
268
-	 */
269
-	protected function copyTable($sourceName, $targetName) {
270
-		$quotedSource = $this->connection->quoteIdentifier($sourceName);
271
-		$quotedTarget = $this->connection->quoteIdentifier($targetName);
272
-
273
-		$this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
274
-		$this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
275
-	}
276
-
277
-	/**
278
-	 * @param string $name
279
-	 */
280
-	protected function dropTable($name) {
281
-		$this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
282
-	}
283
-
284
-	/**
285
-	 * @param $statement
286
-	 * @return string
287
-	 */
288
-	protected function convertStatementToScript($statement) {
289
-		$script = $statement . ';';
290
-		$script .= PHP_EOL;
291
-		$script .= PHP_EOL;
292
-		return $script;
293
-	}
294
-
295
-	protected function getFilterExpression() {
296
-		return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
297
-	}
298
-
299
-	protected function emit($sql, $step, $max) {
300
-		if ($this->noEmit) {
301
-			return;
302
-		}
303
-		if(is_null($this->dispatcher)) {
304
-			return;
305
-		}
306
-		$this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
307
-	}
308
-
309
-	private function emitCheckStep($tableName, $step, $max) {
310
-		if(is_null($this->dispatcher)) {
311
-			return;
312
-		}
313
-		$this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
314
-	}
47
+    /** @var \Doctrine\DBAL\Connection */
48
+    protected $connection;
49
+
50
+    /** @var ISecureRandom */
51
+    private $random;
52
+
53
+    /** @var IConfig */
54
+    protected $config;
55
+
56
+    /** @var EventDispatcherInterface  */
57
+    private $dispatcher;
58
+
59
+    /** @var bool */
60
+    private $noEmit = false;
61
+
62
+    /**
63
+     * @param \Doctrine\DBAL\Connection|Connection $connection
64
+     * @param ISecureRandom $random
65
+     * @param IConfig $config
66
+     * @param EventDispatcherInterface $dispatcher
67
+     */
68
+    public function __construct(\Doctrine\DBAL\Connection $connection,
69
+                                ISecureRandom $random,
70
+                                IConfig $config,
71
+                                EventDispatcherInterface $dispatcher = null) {
72
+        $this->connection = $connection;
73
+        $this->random = $random;
74
+        $this->config = $config;
75
+        $this->dispatcher = $dispatcher;
76
+    }
77
+
78
+    /**
79
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
80
+     */
81
+    public function migrate(Schema $targetSchema) {
82
+        $this->noEmit = true;
83
+        $this->applySchema($targetSchema);
84
+    }
85
+
86
+    /**
87
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
88
+     * @return string
89
+     */
90
+    public function generateChangeScript(Schema $targetSchema) {
91
+        $schemaDiff = $this->getDiff($targetSchema, $this->connection);
92
+
93
+        $script = '';
94
+        $sqls = $schemaDiff->toSql($this->connection->getDatabasePlatform());
95
+        foreach ($sqls as $sql) {
96
+            $script .= $this->convertStatementToScript($sql);
97
+        }
98
+
99
+        return $script;
100
+    }
101
+
102
+    /**
103
+     * @param Schema $targetSchema
104
+     * @throws \OC\DB\MigrationException
105
+     */
106
+    public function checkMigrate(Schema $targetSchema) {
107
+        $this->noEmit = true;
108
+        /**@var \Doctrine\DBAL\Schema\Table[] $tables */
109
+        $tables = $targetSchema->getTables();
110
+        $filterExpression = $this->getFilterExpression();
111
+        $this->connection->getConfiguration()->
112
+            setFilterSchemaAssetsExpression($filterExpression);
113
+        $existingTables = $this->connection->getSchemaManager()->listTableNames();
114
+
115
+        $step = 0;
116
+        foreach ($tables as $table) {
117
+            if (strpos($table->getName(), '.')) {
118
+                list(, $tableName) = explode('.', $table->getName());
119
+            } else {
120
+                $tableName = $table->getName();
121
+            }
122
+            $this->emitCheckStep($tableName, $step++, count($tables));
123
+            // don't need to check for new tables
124
+            if (array_search($tableName, $existingTables) !== false) {
125
+                $this->checkTableMigrate($table);
126
+            }
127
+        }
128
+    }
129
+
130
+    /**
131
+     * Create a unique name for the temporary table
132
+     *
133
+     * @param string $name
134
+     * @return string
135
+     */
136
+    protected function generateTemporaryTableName($name) {
137
+        return $this->config->getSystemValue('dbtableprefix', 'oc_') . $name . '_' . $this->random->generate(13, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
138
+    }
139
+
140
+    /**
141
+     * Check the migration of a table on a copy so we can detect errors before messing with the real table
142
+     *
143
+     * @param \Doctrine\DBAL\Schema\Table $table
144
+     * @throws \OC\DB\MigrationException
145
+     */
146
+    protected function checkTableMigrate(Table $table) {
147
+        $name = $table->getName();
148
+        $tmpName = $this->generateTemporaryTableName($name);
149
+
150
+        $this->copyTable($name, $tmpName);
151
+
152
+        //create the migration schema for the temporary table
153
+        $tmpTable = $this->renameTableSchema($table, $tmpName);
154
+        $schemaConfig = new SchemaConfig();
155
+        $schemaConfig->setName($this->connection->getDatabase());
156
+        $schema = new Schema(array($tmpTable), array(), $schemaConfig);
157
+
158
+        try {
159
+            $this->applySchema($schema);
160
+            $this->dropTable($tmpName);
161
+        } catch (DBALException $e) {
162
+            // pgsql needs to commit it's failed transaction before doing anything else
163
+            if ($this->connection->isTransactionActive()) {
164
+                $this->connection->commit();
165
+            }
166
+            $this->dropTable($tmpName);
167
+            throw new MigrationException($table->getName(), $e->getMessage());
168
+        }
169
+    }
170
+
171
+    /**
172
+     * @param \Doctrine\DBAL\Schema\Table $table
173
+     * @param string $newName
174
+     * @return \Doctrine\DBAL\Schema\Table
175
+     */
176
+    protected function renameTableSchema(Table $table, $newName) {
177
+        /**
178
+         * @var \Doctrine\DBAL\Schema\Index[] $indexes
179
+         */
180
+        $indexes = $table->getIndexes();
181
+        $newIndexes = array();
182
+        foreach ($indexes as $index) {
183
+            if ($index->isPrimary()) {
184
+                // do not rename primary key
185
+                $indexName = $index->getName();
186
+            } else {
187
+                // avoid conflicts in index names
188
+                $indexName = $this->config->getSystemValue('dbtableprefix', 'oc_') . $this->random->generate(13, ISecureRandom::CHAR_LOWER);
189
+            }
190
+            $newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary());
191
+        }
192
+
193
+        // foreign keys are not supported so we just set it to an empty array
194
+        return new Table($newName, $table->getColumns(), $newIndexes, array(), 0, $table->getOptions());
195
+    }
196
+
197
+    public function createSchema() {
198
+        $filterExpression = $this->getFilterExpression();
199
+        $this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
200
+        return $this->connection->getSchemaManager()->createSchema();
201
+    }
202
+
203
+    /**
204
+     * @param Schema $targetSchema
205
+     * @param \Doctrine\DBAL\Connection $connection
206
+     * @return \Doctrine\DBAL\Schema\SchemaDiff
207
+     * @throws DBALException
208
+     */
209
+    protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
210
+        // adjust varchar columns with a length higher then getVarcharMaxLength to clob
211
+        foreach ($targetSchema->getTables() as $table) {
212
+            foreach ($table->getColumns() as $column) {
213
+                if ($column->getType() instanceof StringType) {
214
+                    if ($column->getLength() > $connection->getDatabasePlatform()->getVarcharMaxLength()) {
215
+                        $column->setType(Type::getType('text'));
216
+                        $column->setLength(null);
217
+                    }
218
+                }
219
+            }
220
+        }
221
+
222
+        $filterExpression = $this->getFilterExpression();
223
+        $this->connection->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression);
224
+        $sourceSchema = $connection->getSchemaManager()->createSchema();
225
+
226
+        // remove tables we don't know about
227
+        /** @var $table \Doctrine\DBAL\Schema\Table */
228
+        foreach ($sourceSchema->getTables() as $table) {
229
+            if (!$targetSchema->hasTable($table->getName())) {
230
+                $sourceSchema->dropTable($table->getName());
231
+            }
232
+        }
233
+        // remove sequences we don't know about
234
+        foreach ($sourceSchema->getSequences() as $table) {
235
+            if (!$targetSchema->hasSequence($table->getName())) {
236
+                $sourceSchema->dropSequence($table->getName());
237
+            }
238
+        }
239
+
240
+        $comparator = new Comparator();
241
+        return $comparator->compare($sourceSchema, $targetSchema);
242
+    }
243
+
244
+    /**
245
+     * @param \Doctrine\DBAL\Schema\Schema $targetSchema
246
+     * @param \Doctrine\DBAL\Connection $connection
247
+     */
248
+    protected function applySchema(Schema $targetSchema, \Doctrine\DBAL\Connection $connection = null) {
249
+        if (is_null($connection)) {
250
+            $connection = $this->connection;
251
+        }
252
+
253
+        $schemaDiff = $this->getDiff($targetSchema, $connection);
254
+
255
+        $connection->beginTransaction();
256
+        $sqls = $schemaDiff->toSql($connection->getDatabasePlatform());
257
+        $step = 0;
258
+        foreach ($sqls as $sql) {
259
+            $this->emit($sql, $step++, count($sqls));
260
+            $connection->query($sql);
261
+        }
262
+        $connection->commit();
263
+    }
264
+
265
+    /**
266
+     * @param string $sourceName
267
+     * @param string $targetName
268
+     */
269
+    protected function copyTable($sourceName, $targetName) {
270
+        $quotedSource = $this->connection->quoteIdentifier($sourceName);
271
+        $quotedTarget = $this->connection->quoteIdentifier($targetName);
272
+
273
+        $this->connection->exec('CREATE TABLE ' . $quotedTarget . ' (LIKE ' . $quotedSource . ')');
274
+        $this->connection->exec('INSERT INTO ' . $quotedTarget . ' SELECT * FROM ' . $quotedSource);
275
+    }
276
+
277
+    /**
278
+     * @param string $name
279
+     */
280
+    protected function dropTable($name) {
281
+        $this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($name));
282
+    }
283
+
284
+    /**
285
+     * @param $statement
286
+     * @return string
287
+     */
288
+    protected function convertStatementToScript($statement) {
289
+        $script = $statement . ';';
290
+        $script .= PHP_EOL;
291
+        $script .= PHP_EOL;
292
+        return $script;
293
+    }
294
+
295
+    protected function getFilterExpression() {
296
+        return '/^' . preg_quote($this->config->getSystemValue('dbtableprefix', 'oc_')) . '/';
297
+    }
298
+
299
+    protected function emit($sql, $step, $max) {
300
+        if ($this->noEmit) {
301
+            return;
302
+        }
303
+        if(is_null($this->dispatcher)) {
304
+            return;
305
+        }
306
+        $this->dispatcher->dispatch('\OC\DB\Migrator::executeSql', new GenericEvent($sql, [$step+1, $max]));
307
+    }
308
+
309
+    private function emitCheckStep($tableName, $step, $max) {
310
+        if(is_null($this->dispatcher)) {
311
+            return;
312
+        }
313
+        $this->dispatcher->dispatch('\OC\DB\Migrator::checkTable', new GenericEvent($tableName, [$step+1, $max]));
314
+    }
315 315
 }
Please login to merge, or discard this patch.
lib/private/DB/SQLiteMigrator.php 2 patches
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 = array(
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 = array(
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.
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.