diff options
author | Robin Appelman <icewind@owncloud.com> | 2013-08-02 19:53:04 +0200 |
---|---|---|
committer | Robin Appelman <icewind@owncloud.com> | 2013-08-02 19:53:04 +0200 |
commit | 2af27434a4e4fdfa01cbd0714b63f9c360d4a9d1 (patch) | |
tree | 5899f2c2f69fe7e08b8c09af8a2b378757284c32 /lib/db | |
parent | d7916363e1efbc15a5dba51056fb8af93330e5eb (diff) | |
parent | 43b31f2161775c7db62b46b8e4044f328f774aae (diff) | |
download | nextcloud-server-2af27434a4e4fdfa01cbd0714b63f9c360d4a9d1.tar.gz nextcloud-server-2af27434a4e4fdfa01cbd0714b63f9c360d4a9d1.zip |
merge master into doctrine-object
Diffstat (limited to 'lib/db')
-rw-r--r-- | lib/db/adapter.php | 14 | ||||
-rw-r--r-- | lib/db/connection.php | 30 | ||||
-rw-r--r-- | lib/db/mdb2schemareader.php | 196 | ||||
-rw-r--r-- | lib/db/schema.php | 20 |
4 files changed, 178 insertions, 82 deletions
diff --git a/lib/db/adapter.php b/lib/db/adapter.php index 2e4f230f366..6b31f37dd98 100644 --- a/lib/db/adapter.php +++ b/lib/db/adapter.php @@ -13,6 +13,10 @@ namespace OC\DB; * handled by the database abstraction layer. */ class Adapter { + + /** + * @var \OC\DB\Connection $conn + */ protected $conn; public function __construct($conn) { @@ -28,7 +32,7 @@ class Adapter { } /** - * @param $statement that needs to be changed so the db can handle it + * @param string $statement that needs to be changed so the db can handle it * @return string changed statement */ public function fixupStatement($statement) { @@ -38,8 +42,8 @@ class Adapter { /** * @brief insert the @input values when they do not exist yet * @param string $table name - * @param array key->value pairs - * @return count of inserted rows + * @param array $input key->value pairs + * @return int count of inserted rows */ public function insertIfNotExist($table, $input) { $query = 'INSERT INTO `' .$table . '` (`' @@ -56,7 +60,7 @@ class Adapter { $inserts = array_merge($inserts, $inserts); try { - $result = $this->conn->executeUpdate($query, $inserts); + return $this->conn->executeUpdate($query, $inserts); } catch(\Doctrine\DBAL\DBALException $e) { $entry = 'DB Error: "'.$e->getMessage() . '"<br />'; $entry .= 'Offending command was: ' . $query.'<br />'; @@ -64,7 +68,5 @@ class Adapter { error_log('DB error: ' . $entry); \OC_Template::printErrorPage( $entry ); } - - return $result; } } diff --git a/lib/db/connection.php b/lib/db/connection.php index 1f01fae4f71..920fe144a8a 100644 --- a/lib/db/connection.php +++ b/lib/db/connection.php @@ -13,29 +13,40 @@ use Doctrine\DBAL\Cache\QueryCacheProfile; use Doctrine\Common\EventManager; class Connection extends \Doctrine\DBAL\Connection { + /** + * @var string $table_prefix + */ protected $table_prefix; + /** + * @var \OC\DB\Adapter $adapter + */ protected $adapter; + /** + * @var \Doctrine\DBAL\Driver\Statement[] $preparedQueries + */ protected $preparedQueries = array(); + protected $cachingQueryStatementEnabled = true; /** * Initializes a new instance of the Connection class. * * @param array $params The connection parameters. - * @param Driver $driver - * @param Configuration $config - * @param EventManager $eventManager + * @param \Doctrine\DBAL\Driver $driver + * @param \Doctrine\DBAL\Configuration $config + * @param \Doctrine\Common\EventManager $eventManager + * @throws \Exception */ public function __construct(array $params, Driver $driver, Configuration $config = null, EventManager $eventManager = null) { if (!isset($params['adapter'])) { - throw new Exception('adapter not set'); + throw new \Exception('adapter not set'); } if (!isset($params['table_prefix'])) { - throw new Exception('table_prefix not set'); + throw new \Exception('table_prefix not set'); } parent::__construct($params, $driver, $config, $eventManager); $this->adapter = new $params['adapter']($this); @@ -46,6 +57,8 @@ class Connection extends \Doctrine\DBAL\Connection { * Prepares an SQL statement. * * @param string $statement The SQL statement to prepare. + * @param int $limit + * @param int $offset * @return \Doctrine\DBAL\Driver\Statement The prepared statement. */ public function prepare( $statement, $limit=null, $offset=null ) { @@ -142,7 +155,7 @@ class Connection extends \Doctrine\DBAL\Connection { * @brief Insert a row if a matching row doesn't exists. * @param string $table. The table to insert into in the form '*PREFIX*tableName' * @param array $input. An array of fieldname/value pairs - * @returns bool The return value from execute() + * @return bool The return value from execute() */ public function insertIfNotExist($table, $input) { return $this->adapter->insertIfNotExist($table, $input); @@ -151,7 +164,6 @@ class Connection extends \Doctrine\DBAL\Connection { /** * returns the error code and message as a string for logging * works with DoctrineException - * @param mixed $error * @return string */ public function getError() { @@ -166,6 +178,10 @@ class Connection extends \Doctrine\DBAL\Connection { } // internal use + /** + * @param string $statement + * @return string + */ protected function replaceTablePrefix($statement) { return str_replace( '*PREFIX*', $this->table_prefix, $statement ); } diff --git a/lib/db/mdb2schemareader.php b/lib/db/mdb2schemareader.php index 0ead9528c93..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': @@ -138,8 +176,12 @@ class OC_DB_MDB2SchemaReader { $comment = (string)$child; $options['comment'] = $comment; break; + case 'primary': + $primary = $this->asBool($child); + $options['primary'] = $primary; + break; default: - throw new DomainException('Unknown element: '.$child->getName()); + throw new \DomainException('Unknown element: ' . $child->getName()); } } @@ -153,22 +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'] = $this->asBool($options['default']); + } if (!empty($options['autoincrement']) - && !empty($options['notnull'])) { + && !empty($options['notnull']) + ) { $options['primary'] = true; } $table->addColumn($name, $type, $options); @@ -178,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()); } } @@ -217,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; } } |