summaryrefslogtreecommitdiffstats
path: root/lib/repair
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2015-03-03 11:14:45 +0100
committerVincent Petry <pvince81@owncloud.com>2015-03-26 19:43:02 +0100
commitb896be821fce0b998d5b11f5a8a99430b42ca357 (patch)
tree0de96346a74bb20bdd77bc64f62ab5cda50ab727 /lib/repair
parente90ead2a8dadab6a77e827bec382ebb41f1c4c97 (diff)
downloadnextcloud-server-b896be821fce0b998d5b11f5a8a99430b42ca357.tar.gz
nextcloud-server-b896be821fce0b998d5b11f5a8a99430b42ca357.zip
SQLite autoincrement fix backport
Add custom sqlite platform to set auto increment Add repair step to fix SQLite autoincrement Force Doctrine to generate alter table SQL statements for SQLite to make sure the code from OCSqlitePlatform is triggered.
Diffstat (limited to 'lib/repair')
-rw-r--r--lib/repair/sqliteautoincrement.php85
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/repair/sqliteautoincrement.php b/lib/repair/sqliteautoincrement.php
new file mode 100644
index 00000000000..79b1fe7870e
--- /dev/null
+++ b/lib/repair/sqliteautoincrement.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Repair;
+
+use Doctrine\DBAL\Platforms\SqlitePlatform;
+use Doctrine\DBAL\Schema\SchemaException;
+use Doctrine\DBAL\Schema\SchemaDiff;
+use Doctrine\DBAL\Schema\TableDiff;
+use Doctrine\DBAL\Schema\ColumnDiff;
+use OC\Hooks\BasicEmitter;
+
+/**
+ * Fixes Sqlite autoincrement by forcing the SQLite table schemas to be
+ * altered in order to retrigger SQL schema generation through OCSqlitePlatform.
+ */
+class SqliteAutoincrement extends BasicEmitter implements \OC\RepairStep {
+ /**
+ * @var \OC\DB\Connection
+ */
+ protected $connection;
+
+ /**
+ * @param \OC\DB\Connection $connection
+ */
+ public function __construct($connection) {
+ $this->connection = $connection;
+ }
+
+ public function getName() {
+ return 'Repair SQLite autoincrement';
+ }
+
+ /**
+ * Fix mime types
+ */
+ public function run() {
+ if (!$this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
+ return;
+ }
+
+ $sourceSchema = $this->connection->getSchemaManager()->createSchema();
+
+ $schemaDiff = new SchemaDiff();
+
+ foreach ($sourceSchema->getTables() as $tableSchema) {
+ $primaryKey = $tableSchema->getPrimaryKey();
+ if (!$primaryKey) {
+ continue;
+ }
+
+ $columnNames = $primaryKey->getColumns();
+
+ // add a column diff for every primary key column,
+ // but do not actually change anything, this will
+ // force the generation of SQL statements to alter
+ // those tables, which will then trigger the
+ // specific SQL code from OCSqlitePlatform
+ try {
+ $tableDiff = new TableDiff($tableSchema->getName());
+ $tableDiff->fromTable = $tableSchema;
+ foreach ($columnNames as $columnName) {
+ $columnSchema = $tableSchema->getColumn($columnName);
+ $columnDiff = new ColumnDiff($columnSchema->getName(), $columnSchema);
+ $tableDiff->changedColumns[] = $columnDiff;
+ $schemaDiff->changedTables[] = $tableDiff;
+ }
+ } catch (SchemaException $e) {
+ // ignore
+ }
+ }
+
+ $this->connection->beginTransaction();
+ foreach ($schemaDiff->toSql($this->connection->getDatabasePlatform()) as $sql) {
+ $this->connection->query($sql);
+ }
+ $this->connection->commit();
+ }
+}
+