nextcloud/lib/db/schema.php

151 lines
4.5 KiB
PHP
Raw Normal View History

2012-10-10 22:49:47 +04:00
<?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.
*/
class OC_DB_Schema {
/**
* @brief saves database scheme to xml file
2013-06-28 01:34:36 +04:00
* @param \Doctrine\DBAL\Connection $conn
2012-10-10 22:49:47 +04:00
* @param string $file name of file
2013-06-28 01:34:36 +04:00
* @param int|string $mode
2012-10-10 22:49:47 +04:00
* @return bool
*
* TODO: write more documentation
*/
public static function getDbStructure( $conn, $file, $mode=MDB2_SCHEMA_DUMP_STRUCTURE) {
2012-10-10 22:49:47 +04:00
$sm = $conn->getSchemaManager();
return OC_DB_MDB2SchemaWriter::saveSchemaToFile($file, $sm);
2012-10-10 22:49:47 +04:00
}
/**
* @brief Creates tables from XML file
2013-07-29 18:33:00 +04:00
* @param \Doctrine\DBAL\Connection $conn
2012-10-10 22:49:47 +04:00
* @param string $file file to read structure from
* @return bool
*
* TODO: write more documentation
*/
public static function createDbFromStructure( $conn, $file ) {
2013-07-29 18:33:00 +04:00
$schemaReader = new \OC\DB\MDB2SchemaReader(\OC_Config::getObject(), $conn->getDatabasePlatform());
$toSchema = $schemaReader->loadSchemaFromFile($file);
2012-10-10 22:49:47 +04:00
return self::executeSchemaChange($conn, $toSchema);
}
/**
* @brief update the database scheme
2013-07-29 18:33:00 +04:00
* @param \Doctrine\DBAL\Connection $conn
2012-10-10 22:49:47 +04:00
* @param string $file file to read structure from
* @return bool
*/
public static function updateDbFromStructure($conn, $file) {
$sm = $conn->getSchemaManager();
$fromSchema = $sm->createSchema();
2013-07-29 18:33:00 +04:00
$schemaReader = new \OC\DB\MDB2SchemaReader(\OC_Config::getObject(), $conn->getDatabasePlatform());
$toSchema = $schemaReader->loadSchemaFromFile($file);
2012-10-10 22:49:47 +04:00
// remove tables we don't know about
foreach($fromSchema->getTables() as $table) {
if (!$toSchema->hasTable($table->getName())) {
$fromSchema->dropTable($table->getName());
}
}
2013-03-17 20:28:36 +04:00
// remove sequences we don't know about
foreach($fromSchema->getSequences() as $table) {
if (!$toSchema->hasSequence($table->getName())) {
$fromSchema->dropSequence($table->getName());
}
}
2012-10-10 22:49:47 +04:00
$comparator = new \Doctrine\DBAL\Schema\Comparator();
$schemaDiff = $comparator->compare($fromSchema, $toSchema);
2013-05-25 00:00:42 +04:00
$platform = $conn->getDatabasePlatform();
$tables = $schemaDiff->newTables + $schemaDiff->changedTables + $schemaDiff->removedTables;
foreach($tables as $tableDiff) {
$tableDiff->name = $platform->quoteIdentifier($tableDiff->name);
}
2012-10-10 22:49:47 +04:00
//$from = $fromSchema->toSql($conn->getDatabasePlatform());
//$to = $toSchema->toSql($conn->getDatabasePlatform());
//echo($from[9]);
//echo '<br>';
//echo($to[9]);
//var_dump($from, $to);
return self::executeSchemaChange($conn, $schemaDiff);
}
/**
* @brief drop a table
2013-07-29 18:33:00 +04:00
* @param \Doctrine\DBAL\Connection $conn
2012-10-10 22:49:47 +04:00
* @param string $tableName the table to drop
*/
public static function dropTable($conn, $tableName) {
$sm = $conn->getSchemaManager();
$fromSchema = $sm->createSchema();
$toSchema = clone $fromSchema;
2013-05-03 18:02:53 +04:00
$toSchema->dropTable($tableName);
2012-10-10 22:49:47 +04:00
$sql = $fromSchema->getMigrateToSql($toSchema, $conn->getDatabasePlatform());
$conn->execute($sql);
}
/**
* remove all tables defined in a database structure xml file
2013-07-29 18:33:00 +04:00
* @param \Doctrine\DBAL\Connection $conn
2012-10-10 22:49:47 +04:00
* @param string $file the xml file describing the tables
*/
public static function removeDBStructure($conn, $file) {
2013-07-29 18:33:00 +04:00
$schemaReader = new \OC\DB\MDB2SchemaReader(\OC_Config::getObject(), $conn->getDatabasePlatform());
$fromSchema = $schemaReader->loadSchemaFromFile($file);
2012-10-10 22:49:47 +04:00
$toSchema = clone $fromSchema;
foreach($toSchema->getTables() as $table) {
$toSchema->dropTable($table->getName());
}
$comparator = new \Doctrine\DBAL\Schema\Comparator();
$schemaDiff = $comparator->compare($fromSchema, $toSchema);
self::executeSchemaChange($conn, $schemaDiff);
}
/**
* @brief replaces the ownCloud tables with a new set
2013-07-29 18:33:00 +04:00
* @param \Doctrine\DBAL\Connection $conn
2012-10-10 22:49:47 +04:00
* @param $file string path to the MDB2 xml db export file
*/
public static function replaceDB( $conn, $file ) {
$apps = OC_App::getAllApps();
self::beginTransaction();
// Delete the old tables
self::removeDBStructure( $conn, OC::$SERVERROOT . '/db_structure.xml' );
2012-10-10 22:49:47 +04:00
foreach($apps as $app) {
$path = OC_App::getAppPath($app).'/appinfo/database.xml';
if(file_exists($path)) {
self::removeDBStructure( $conn, $path );
2012-10-10 22:49:47 +04:00
}
}
// Create new tables
self::commit();
}
2013-07-29 18:33:00 +04:00
/**
* @param \Doctrine\DBAL\Connection $conn
* @param \Doctrine\DBAL\Schema\Schema $schema
* @return bool
*/
2012-10-10 22:49:47 +04:00
private static function executeSchemaChange($conn, $schema) {
$conn->beginTransaction();
foreach($schema->toSql($conn->getDatabasePlatform()) as $sql) {
$conn->query($sql);
}
$conn->commit();
2013-07-29 18:33:00 +04:00
return true;
2012-10-10 22:49:47 +04:00
}
}