From d6c56b584ac4fdb9169ed2747072d8f90cc00612 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 29 Jul 2013 16:33:00 +0200 Subject: [PATCH] make MDB2Schema reader non static --- lib/db/mdb2schemareader.php | 195 +++++++++++++++++++++++------------- lib/db/schema.php | 20 +++- 2 files changed, 143 insertions(+), 72 deletions(-) diff --git a/lib/db/mdb2schemareader.php b/lib/db/mdb2schemareader.php index ad4b2fe0e03..b7128a2f176 100644 --- a/lib/db/mdb2schemareader.php +++ b/lib/db/mdb2schemareader.php @@ -6,35 +6,57 @@ * See the COPYING-README file. */ -class OC_DB_MDB2SchemaReader { - static protected $DBNAME; - static protected $DBTABLEPREFIX; - static protected $platform; +namespace OC\DB; +class MDB2SchemaReader { /** - * @param $file - * @param $platform + * @var string $DBNAME + */ + protected $DBNAME; + + /** + * @var string $DBTABLEPREFIX + */ + protected $DBTABLEPREFIX; + + /** + * @var \Doctrine\DBAL\Platforms\AbstractPlatform $platform + */ + protected $platform; + + /** + * @param \OC\Config $config + * @param \Doctrine\DBAL\Platforms\AbstractPlatform $platform + */ + public function __construct($config, $platform) { + $this->platform = $platform; + $this->DBNAME = $config->getValue('dbname', 'owncloud'); + $this->DBTABLEPREFIX = $config->getValue('dbtableprefix', 'oc_'); + } + + /** + * @param string $file * @return \Doctrine\DBAL\Schema\Schema - * @throws DomainException + * @throws \DomainException */ - public static function loadSchemaFromFile($file, $platform) { - self::$DBNAME = OC_Config::getValue( "dbname", "owncloud" ); - self::$DBTABLEPREFIX = OC_Config::getValue( "dbtableprefix", "oc_" ); - self::$platform = $platform; + public function loadSchemaFromFile($file) { $schema = new \Doctrine\DBAL\Schema\Schema(); $xml = simplexml_load_file($file); - foreach($xml->children() as $child) { - switch($child->getName()) { + foreach ($xml->children() as $child) { + /** + * @var \SimpleXMLElement $child + */ + switch ($child->getName()) { case 'name': case 'create': case 'overwrite': case 'charset': break; case 'table': - self::loadTable($schema, $child); + $this->loadTable($schema, $child); break; default: - throw new DomainException('Unknown element: '.$child->getName()); + throw new \DomainException('Unknown element: ' . $child->getName()); } } @@ -43,16 +65,20 @@ class OC_DB_MDB2SchemaReader { /** * @param\Doctrine\DBAL\Schema\Schema $schema - * @param $xml - * @throws DomainException + * @param \SimpleXMLElement $xml + * @throws \DomainException */ - private static function loadTable($schema, $xml) { - foreach($xml->children() as $child) { - switch($child->getName()) { + private function loadTable($schema, $xml) { + $table = null; + foreach ($xml->children() as $child) { + /** + * @var \SimpleXMLElement $child + */ + switch ($child->getName()) { case 'name': $name = (string)$child; - $name = str_replace( '*dbprefix*', self::$DBTABLEPREFIX, $name ); - $name = self::$platform->quoteIdentifier($name); + $name = str_replace('*dbprefix*', $this->DBTABLEPREFIX, $name); + $name = $this->platform->quoteIdentifier($name); $table = $schema->createTable($name); break; case 'create': @@ -60,10 +86,13 @@ class OC_DB_MDB2SchemaReader { case 'charset': break; case 'declaration': - self::loadDeclaration($table, $child); + if (is_null($table)) { + throw new \DomainException('Table declaration before table name'); + } + $this->loadDeclaration($table, $child); break; default: - throw new DomainException('Unknown element: '.$child->getName()); + throw new \DomainException('Unknown element: ' . $child->getName()); } } @@ -71,36 +100,47 @@ class OC_DB_MDB2SchemaReader { /** * @param \Doctrine\DBAL\Schema\Table $table - * @param $xml - * @throws DomainException + * @param \SimpleXMLElement $xml + * @throws \DomainException */ - private static function loadDeclaration($table, $xml) { - foreach($xml->children() as $child) { - switch($child->getName()) { + private function loadDeclaration($table, $xml) { + foreach ($xml->children() as $child) { + /** + * @var \SimpleXMLElement $child + */ + switch ($child->getName()) { case 'field': - self::loadField($table, $child); + $this->loadField($table, $child); break; case 'index': - self::loadIndex($table, $child); + $this->loadIndex($table, $child); break; default: - throw new DomainException('Unknown element: '.$child->getName()); + throw new \DomainException('Unknown element: ' . $child->getName()); } } } - private static function loadField($table, $xml) { + /** + * @param \Doctrine\DBAL\Schema\Table $table + * @param \SimpleXMLElement $xml + * @throws \DomainException + */ + private function loadField($table, $xml) { $options = array(); - foreach($xml->children() as $child) { - switch($child->getName()) { + foreach ($xml->children() as $child) { + /** + * @var \SimpleXMLElement $child + */ + switch ($child->getName()) { case 'name': $name = (string)$child; - $name = self::$platform->quoteIdentifier($name); + $name = $this->platform->quoteIdentifier($name); break; case 'type': $type = (string)$child; - switch($type) { + switch ($type) { case 'text': $type = 'string'; break; @@ -110,8 +150,6 @@ class OC_DB_MDB2SchemaReader { case 'timestamp': $type = 'datetime'; break; - // TODO - return; } break; case 'length': @@ -119,15 +157,15 @@ class OC_DB_MDB2SchemaReader { $options['length'] = $length; break; case 'unsigned': - $unsigned = self::asBool($child); + $unsigned = $this->asBool($child); $options['unsigned'] = $unsigned; break; case 'notnull': - $notnull = self::asBool($child); + $notnull = $this->asBool($child); $options['notnull'] = $notnull; break; case 'autoincrement': - $autoincrement = self::asBool($child); + $autoincrement = $this->asBool($child); $options['autoincrement'] = $autoincrement; break; case 'default': @@ -139,11 +177,11 @@ class OC_DB_MDB2SchemaReader { $options['comment'] = $comment; break; case 'primary': - $primary = self::asBool($child); + $primary = $this->asBool($child); $options['primary'] = $primary; break; default: - throw new DomainException('Unknown element: '.$child->getName()); + throw new \DomainException('Unknown element: ' . $child->getName()); } } @@ -157,25 +195,30 @@ class OC_DB_MDB2SchemaReader { } if ($type == 'integer') { $options['default'] = 0; + } elseif ($type == 'boolean') { + $options['default'] = false; } if (!empty($options['autoincrement']) && $options['autoincrement']) { unset($options['default']); } } - if ($type == 'integer' && isset($options['length'])) { + if ($type === 'integer' && isset($options['default'])) { + $options['default'] = (int)$options['default']; + } + if ($type === 'integer' && isset($options['length'])) { $length = $options['length']; if ($length < 4) { $type = 'smallint'; - } - else if ($length > 4) { + } else if ($length > 4) { $type = 'bigint'; } } - if ($type === 'boolean' && isset($options['default'])){ - $options['default'] = self::asBool($options['default']); + if ($type === 'boolean' && isset($options['default'])) { + $options['default'] = $this->asBool($options['default']); } if (!empty($options['autoincrement']) - && !empty($options['notnull'])) { + && !empty($options['notnull']) + ) { $options['primary'] = true; } $table->addColumn($name, $type, $options); @@ -185,38 +228,49 @@ class OC_DB_MDB2SchemaReader { } } - private static function loadIndex($table, $xml) { + /** + * @param \Doctrine\DBAL\Schema\Table $table + * @param \SimpleXMLElement $xml + * @throws \DomainException + */ + private function loadIndex($table, $xml) { $name = null; $fields = array(); - foreach($xml->children() as $child) { - switch($child->getName()) { + foreach ($xml->children() as $child) { + /** + * @var \SimpleXMLElement $child + */ + switch ($child->getName()) { case 'name': $name = (string)$child; break; case 'primary': - $primary = self::asBool($child); + $primary = $this->asBool($child); break; case 'unique': - $unique = self::asBool($child); + $unique = $this->asBool($child); break; case 'field': - foreach($child->children() as $field) { - switch($field->getName()) { + foreach ($child->children() as $field) { + /** + * @var \SimpleXMLElement $field + */ + switch ($field->getName()) { case 'name': $field_name = (string)$field; - $field_name = self::$platform->quoteIdentifier($field_name); + $field_name = $this->platform->quoteIdentifier($field_name); $fields[] = $field_name; break; case 'sorting': break; default: - throw new DomainException('Unknown element: '.$field->getName()); + throw new \DomainException('Unknown element: ' . $field->getName()); } } break; default: - throw new DomainException('Unknown element: '.$child->getName()); + throw new \DomainException('Unknown element: ' . $child->getName()); } } @@ -224,22 +278,25 @@ class OC_DB_MDB2SchemaReader { if (isset($primary) && $primary) { $table->setPrimaryKey($fields, $name); } else - if (isset($unique) && $unique) { - $table->addUniqueIndex($fields, $name); - } else { - $table->addIndex($fields, $name); - } + if (isset($unique) && $unique) { + $table->addUniqueIndex($fields, $name); + } else { + $table->addIndex($fields, $name); + } } else { - throw new DomainException('Empty index definition: '.$name.' options:'. print_r($fields, true)); + throw new \DomainException('Empty index definition: ' . $name . ' options:' . print_r($fields, true)); } } - private static function asBool($xml) { + /** + * @param \SimpleXMLElement | string $xml + * @return bool + */ + private function asBool($xml) { $result = (string)$xml; if ($result == 'true') { $result = true; - } else - if ($result == 'false') { + } elseif ($result == 'false') { $result = false; } return (bool)$result; diff --git a/lib/db/schema.php b/lib/db/schema.php index fa053c64ef0..bc82249609d 100644 --- a/lib/db/schema.php +++ b/lib/db/schema.php @@ -24,18 +24,21 @@ class OC_DB_Schema { /** * @brief Creates tables from XML file + * @param \Doctrine\DBAL\Connection $conn * @param string $file file to read structure from * @return bool * * TODO: write more documentation */ public static function createDbFromStructure( $conn, $file ) { - $toSchema = OC_DB_MDB2SchemaReader::loadSchemaFromFile($file, $conn->getDatabasePlatform()); + $schemaReader = new \OC\DB\MDB2SchemaReader(\OC_Config::getObject(), $conn->getDatabasePlatform()); + $toSchema = $schemaReader->loadSchemaFromFile($file); return self::executeSchemaChange($conn, $toSchema); } /** * @brief update the database scheme + * @param \Doctrine\DBAL\Connection $conn * @param string $file file to read structure from * @return bool */ @@ -43,7 +46,8 @@ class OC_DB_Schema { $sm = $conn->getSchemaManager(); $fromSchema = $sm->createSchema(); - $toSchema = OC_DB_MDB2SchemaReader::loadSchemaFromFile($file, $conn->getDatabasePlatform()); + $schemaReader = new \OC\DB\MDB2SchemaReader(\OC_Config::getObject(), $conn->getDatabasePlatform()); + $toSchema = $schemaReader->loadSchemaFromFile($file); // remove tables we don't know about foreach($fromSchema->getTables() as $table) { @@ -79,6 +83,7 @@ class OC_DB_Schema { /** * @brief drop a table + * @param \Doctrine\DBAL\Connection $conn * @param string $tableName the table to drop */ public static function dropTable($conn, $tableName) { @@ -92,10 +97,12 @@ class OC_DB_Schema { /** * remove all tables defined in a database structure xml file + * @param \Doctrine\DBAL\Connection $conn * @param string $file the xml file describing the tables */ public static function removeDBStructure($conn, $file) { - $fromSchema = OC_DB_MDB2SchemaReader::loadSchemaFromFile($file, $conn->getDatabasePlatform()); + $schemaReader = new \OC\DB\MDB2SchemaReader(\OC_Config::getObject(), $conn->getDatabasePlatform()); + $fromSchema = $schemaReader->loadSchemaFromFile($file); $toSchema = clone $fromSchema; foreach($toSchema->getTables() as $table) { $toSchema->dropTable($table->getName()); @@ -107,6 +114,7 @@ class OC_DB_Schema { /** * @brief replaces the ownCloud tables with a new set + * @param \Doctrine\DBAL\Connection $conn * @param $file string path to the MDB2 xml db export file */ public static function replaceDB( $conn, $file ) { @@ -126,11 +134,17 @@ class OC_DB_Schema { self::commit(); } + /** + * @param \Doctrine\DBAL\Connection $conn + * @param \Doctrine\DBAL\Schema\Schema $schema + * @return bool + */ private static function executeSchemaChange($conn, $schema) { $conn->beginTransaction(); foreach($schema->toSql($conn->getDatabasePlatform()) as $sql) { $conn->query($sql); } $conn->commit(); + return true; } } -- 2.39.5