Blame view

sources/lib/private/db/sqlitemigrator.php 1.98 KB
6d9380f96   Cédric Dupont   Update sources OC...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  <?php
  /**
   * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
   * This file is licensed under the Affero General Public License version 3 or
   * later.
   * See the COPYING-README file.
   */
  
  namespace OC\DB;
  
  use Doctrine\DBAL\DBALException;
  use Doctrine\DBAL\Schema\Schema;
  
  class SQLiteMigrator extends Migrator {
  
  	/**
  	 * @var \OCP\IConfig
  	 */
  	private $config;
  
  	/**
  	 * @param \Doctrine\DBAL\Connection $connection
  	 * @param \OCP\IConfig $config
  	 */
  	public function __construct(\Doctrine\DBAL\Connection $connection, \OCP\IConfig $config) {
  		parent::__construct($connection);
  		$this->config = $config;
  	}
  
  	/**
  	 * @param \Doctrine\DBAL\Schema\Schema $targetSchema
  	 * @throws \OC\DB\MigrationException
  	 *
  	 * For sqlite we simple make a copy of the entire database, and test the migration on that
  	 */
  	public function checkMigrate(\Doctrine\DBAL\Schema\Schema $targetSchema) {
  		$dbFile = $this->connection->getDatabase();
  		$tmpFile = $this->buildTempDatabase();
  		copy($dbFile, $tmpFile);
  
  		$connectionParams = array(
  			'path' => $tmpFile,
  			'driver' => 'pdo_sqlite',
  		);
  		$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams);
  		try {
  			$this->applySchema($targetSchema, $conn);
  			$conn->close();
  			unlink($tmpFile);
  		} catch (DBALException $e) {
  			$conn->close();
  			unlink($tmpFile);
  			throw new MigrationException('', $e->getMessage());
  		}
  	}
  
  	/**
  	 * @return string
  	 */
  	private function buildTempDatabase() {
  		$dataDir = $this->config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data');
  		$tmpFile = uniqid("oc_");
  		return "$dataDir/$tmpFile.db";
  	}
  
  	/**
  	 * @param Schema $targetSchema
  	 * @param \Doctrine\DBAL\Connection $connection
  	 * @return \Doctrine\DBAL\Schema\SchemaDiff
  	 */
  	protected function getDiff(Schema $targetSchema, \Doctrine\DBAL\Connection $connection) {
  		$platform = $connection->getDatabasePlatform();
  		$platform->registerDoctrineTypeMapping('tinyint unsigned', 'integer');
  
  		return parent::getDiff($targetSchema, $connection);
  	}
  }