Blame view

sources/lib/private/db/mdb2schemamanager.php 4.26 KB
31b7f2792   Kload   Upgrade to ownclo...
1
2
3
4
5
6
7
8
9
  <?php
  /**
   * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
   * This file is licensed under the Affero General Public License version 3 or
   * later.
   * See the COPYING-README file.
   */
  
  namespace OC\DB;
6d9380f96   Cédric Dupont   Update sources OC...
10
11
12
13
  use Doctrine\DBAL\Platforms\MySqlPlatform;
  use Doctrine\DBAL\Platforms\OraclePlatform;
  use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
  use Doctrine\DBAL\Platforms\SqlitePlatform;
31b7f2792   Kload   Upgrade to ownclo...
14
15
16
17
18
19
20
21
22
23
24
  class MDB2SchemaManager {
  	/**
  	 * @var \OC\DB\Connection $conn
  	 */
  	protected $conn;
  
  	/**
  	 * @param \OC\DB\Connection $conn
  	 */
  	public function __construct($conn) {
  		$this->conn = $conn;
31b7f2792   Kload   Upgrade to ownclo...
25
26
27
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
28
  	 * saves database scheme to xml file
31b7f2792   Kload   Upgrade to ownclo...
29
30
31
32
33
34
  	 * @param string $file name of file
  	 * @param int|string $mode
  	 * @return bool
  	 *
  	 * TODO: write more documentation
  	 */
6d9380f96   Cédric Dupont   Update sources OC...
35
  	public function getDbStructure($file, $mode = MDB2_SCHEMA_DUMP_STRUCTURE) {
31b7f2792   Kload   Upgrade to ownclo...
36
37
38
39
40
41
  		$sm = $this->conn->getSchemaManager();
  
  		return \OC_DB_MDB2SchemaWriter::saveSchemaToFile($file, $sm);
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
42
  	 * Creates tables from XML file
31b7f2792   Kload   Upgrade to ownclo...
43
44
45
46
47
  	 * @param string $file file to read structure from
  	 * @return bool
  	 *
  	 * TODO: write more documentation
  	 */
6d9380f96   Cédric Dupont   Update sources OC...
48
  	public function createDbFromStructure($file) {
31b7f2792   Kload   Upgrade to ownclo...
49
50
51
52
53
54
  		$schemaReader = new MDB2SchemaReader(\OC_Config::getObject(), $this->conn->getDatabasePlatform());
  		$toSchema = $schemaReader->loadSchemaFromFile($file);
  		return $this->executeSchemaChange($toSchema);
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
55
  	 * @return \OC\DB\Migrator
31b7f2792   Kload   Upgrade to ownclo...
56
  	 */
6d9380f96   Cédric Dupont   Update sources OC...
57
58
59
60
61
62
63
64
65
66
67
68
69
  	public function getMigrator() {
  		$platform = $this->conn->getDatabasePlatform();
  		if ($platform instanceof SqlitePlatform) {
  			$config = \OC::$server->getConfig();
  			return new SQLiteMigrator($this->conn, $config);
  		} else if ($platform instanceof OraclePlatform) {
  			return new OracleMigrator($this->conn);
  		} else if ($platform instanceof MySqlPlatform) {
  			return new MySQLMigrator($this->conn);
  		} else if ($platform instanceof PostgreSqlPlatform) {
  			return new Migrator($this->conn);
  		} else {
  			return new NoCheckMigrator($this->conn);
31b7f2792   Kload   Upgrade to ownclo...
70
  		}
6d9380f96   Cédric Dupont   Update sources OC...
71
  	}
31b7f2792   Kload   Upgrade to ownclo...
72

6d9380f96   Cédric Dupont   Update sources OC...
73
74
75
76
77
78
  	/**
  	 * Reads database schema from file
  	 *
  	 * @param string $file file to read from
  	 */
  	private function readSchemaFromFile($file) {
31b7f2792   Kload   Upgrade to ownclo...
79
  		$platform = $this->conn->getDatabasePlatform();
6d9380f96   Cédric Dupont   Update sources OC...
80
81
82
83
84
85
86
87
88
89
90
91
92
  		$schemaReader = new MDB2SchemaReader(\OC_Config::getObject(), $platform);
  		return $schemaReader->loadSchemaFromFile($file);
  	}
  
  	/**
  	 * update the database scheme
  	 * @param string $file file to read structure from
  	 * @param bool $generateSql only return the sql needed for the upgrade
  	 * @return string|boolean
  	 */
  	public function updateDbFromStructure($file, $generateSql = false) {
  		$toSchema = $this->readSchemaFromFile($file);
  		$migrator = $this->getMigrator();
31b7f2792   Kload   Upgrade to ownclo...
93
  		if ($generateSql) {
6d9380f96   Cédric Dupont   Update sources OC...
94
95
96
97
  			return $migrator->generateChangeScript($toSchema);
  		} else {
  			$migrator->migrate($toSchema);
  			return true;
31b7f2792   Kload   Upgrade to ownclo...
98
  		}
6d9380f96   Cédric Dupont   Update sources OC...
99
  	}
31b7f2792   Kload   Upgrade to ownclo...
100

6d9380f96   Cédric Dupont   Update sources OC...
101
102
103
104
105
106
107
108
109
  	/**
  	 * update the database scheme
  	 * @param string $file file to read structure from
  	 * @return string|boolean
  	 */
  	public function simulateUpdateDbFromStructure($file) {
  		$toSchema = $this->readSchemaFromFile($file);
  		$this->getMigrator()->checkMigrate($toSchema);
  		return true;
31b7f2792   Kload   Upgrade to ownclo...
110
111
112
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
113
114
  	 * @param \Doctrine\DBAL\Schema\Schema $schema
  	 * @return string
31b7f2792   Kload   Upgrade to ownclo...
115
  	 */
6d9380f96   Cédric Dupont   Update sources OC...
116
117
118
  	public function generateChangeScript($schema) {
  		$migrator = $this->getMigrator();
  		return $migrator->generateChangeScript($schema);
31b7f2792   Kload   Upgrade to ownclo...
119
120
121
122
  	}
  
  	/**
  	 * remove all tables defined in a database structure xml file
6d9380f96   Cédric Dupont   Update sources OC...
123
  	 *
31b7f2792   Kload   Upgrade to ownclo...
124
125
126
127
128
129
130
  	 * @param string $file the xml file describing the tables
  	 */
  	public function removeDBStructure($file) {
  		$schemaReader = new MDB2SchemaReader(\OC_Config::getObject(), $this->conn->getDatabasePlatform());
  		$fromSchema = $schemaReader->loadSchemaFromFile($file);
  		$toSchema = clone $fromSchema;
  		/** @var $table \Doctrine\DBAL\Schema\Table */
6d9380f96   Cédric Dupont   Update sources OC...
131
  		foreach ($toSchema->getTables() as $table) {
31b7f2792   Kload   Upgrade to ownclo...
132
133
134
135
136
137
138
139
  			$toSchema->dropTable($table->getName());
  		}
  		$comparator = new \Doctrine\DBAL\Schema\Comparator();
  		$schemaDiff = $comparator->compare($fromSchema, $toSchema);
  		$this->executeSchemaChange($schemaDiff);
  	}
  
  	/**
31b7f2792   Kload   Upgrade to ownclo...
140
141
142
143
144
  	 * @param \Doctrine\DBAL\Schema\Schema $schema
  	 * @return bool
  	 */
  	private function executeSchemaChange($schema) {
  		$this->conn->beginTransaction();
6d9380f96   Cédric Dupont   Update sources OC...
145
  		foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) {
31b7f2792   Kload   Upgrade to ownclo...
146
147
148
  			$this->conn->query($sql);
  		}
  		$this->conn->commit();
31b7f2792   Kload   Upgrade to ownclo...
149

6d9380f96   Cédric Dupont   Update sources OC...
150
151
  		if ($this->conn->getDatabasePlatform() instanceof SqlitePlatform) {
  			\OC_DB::reconnect();
31b7f2792   Kload   Upgrade to ownclo...
152
  		}
6d9380f96   Cédric Dupont   Update sources OC...
153
  		return true;
31b7f2792   Kload   Upgrade to ownclo...
154
155
  	}
  }