Blame view
sources/lib/private/db/mdb2schemamanager.php
4.26 KB
|
31b7f2792
|
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
|
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
|
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
|
25 26 27 |
} /** |
|
6d9380f96
|
28 |
* saves database scheme to xml file |
|
31b7f2792
|
29 30 31 32 33 34 |
* @param string $file name of file * @param int|string $mode * @return bool * * TODO: write more documentation */ |
|
6d9380f96
|
35 |
public function getDbStructure($file, $mode = MDB2_SCHEMA_DUMP_STRUCTURE) {
|
|
31b7f2792
|
36 37 38 39 40 41 |
$sm = $this->conn->getSchemaManager(); return \OC_DB_MDB2SchemaWriter::saveSchemaToFile($file, $sm); } /** |
|
6d9380f96
|
42 |
* Creates tables from XML file |
|
31b7f2792
|
43 44 45 46 47 |
* @param string $file file to read structure from * @return bool * * TODO: write more documentation */ |
|
6d9380f96
|
48 |
public function createDbFromStructure($file) {
|
|
31b7f2792
|
49 50 51 52 53 54 |
$schemaReader = new MDB2SchemaReader(\OC_Config::getObject(), $this->conn->getDatabasePlatform()); $toSchema = $schemaReader->loadSchemaFromFile($file); return $this->executeSchemaChange($toSchema); } /** |
|
6d9380f96
|
55 |
* @return \OC\DB\Migrator |
|
31b7f2792
|
56 |
*/ |
|
6d9380f96
|
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
|
70 |
} |
|
6d9380f96
|
71 |
} |
|
31b7f2792
|
72 |
|
|
6d9380f96
|
73 74 75 76 77 78 |
/**
* Reads database schema from file
*
* @param string $file file to read from
*/
private function readSchemaFromFile($file) {
|
|
31b7f2792
|
79 |
$platform = $this->conn->getDatabasePlatform(); |
|
6d9380f96
|
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
|
93 |
if ($generateSql) {
|
|
6d9380f96
|
94 95 96 97 |
return $migrator->generateChangeScript($toSchema);
} else {
$migrator->migrate($toSchema);
return true;
|
|
31b7f2792
|
98 |
} |
|
6d9380f96
|
99 |
} |
|
31b7f2792
|
100 |
|
|
6d9380f96
|
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
|
110 111 112 |
} /** |
|
6d9380f96
|
113 114 |
* @param \Doctrine\DBAL\Schema\Schema $schema * @return string |
|
31b7f2792
|
115 |
*/ |
|
6d9380f96
|
116 117 118 |
public function generateChangeScript($schema) {
$migrator = $this->getMigrator();
return $migrator->generateChangeScript($schema);
|
|
31b7f2792
|
119 120 121 122 |
} /** * remove all tables defined in a database structure xml file |
|
6d9380f96
|
123 |
* |
|
31b7f2792
|
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
|
131 |
foreach ($toSchema->getTables() as $table) {
|
|
31b7f2792
|
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
|
140 141 142 143 144 |
* @param \Doctrine\DBAL\Schema\Schema $schema
* @return bool
*/
private function executeSchemaChange($schema) {
$this->conn->beginTransaction();
|
|
6d9380f96
|
145 |
foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) {
|
|
31b7f2792
|
146 147 148 |
$this->conn->query($sql); } $this->conn->commit(); |
|
31b7f2792
|
149 |
|
|
6d9380f96
|
150 151 |
if ($this->conn->getDatabasePlatform() instanceof SqlitePlatform) {
\OC_DB::reconnect();
|
|
31b7f2792
|
152 |
} |
|
6d9380f96
|
153 |
return true; |
|
31b7f2792
|
154 155 |
} } |