Merge pull request #12695 from owncloud/db-drop-table

Add dropTable to IDBConnection
This commit is contained in:
Morris Jobke 2014-12-09 18:40:56 +01:00
commit 263e008d7b
5 changed files with 139 additions and 47 deletions

View File

@ -263,16 +263,7 @@ class OC_DB {
*/ */
public static function dropTable($tableName) { public static function dropTable($tableName) {
$connection = \OC::$server->getDatabaseConnection(); $connection = \OC::$server->getDatabaseConnection();
$tableName = OC_Config::getValue('dbtableprefix', 'oc_' ) . trim($tableName); $connection->dropTable($tableName);
$connection->beginTransaction();
$platform = $connection->getDatabasePlatform();
$sql = $platform->getDropTableSQL($platform->quoteIdentifier($tableName));
$connection->executeQuery($sql);
$connection->commit();
} }
/** /**
@ -334,42 +325,7 @@ class OC_DB {
* @throws \OC\DatabaseException * @throws \OC\DatabaseException
*/ */
public static function tableExists($table) { public static function tableExists($table) {
$connection = \OC::$server->getDatabaseConnection();
$table = OC_Config::getValue('dbtableprefix', 'oc_' ) . trim($table); return $connection->tableExists($table);
$dbType = OC_Config::getValue( 'dbtype', 'sqlite' );
switch ($dbType) {
case 'sqlite':
case 'sqlite3':
$sql = "SELECT name FROM sqlite_master "
. "WHERE type = 'table' AND name = ? "
. "UNION ALL SELECT name FROM sqlite_temp_master "
. "WHERE type = 'table' AND name = ?";
$result = \OC_DB::executeAudited($sql, array($table, $table));
break;
case 'mysql':
$sql = 'SHOW TABLES LIKE ?';
$result = \OC_DB::executeAudited($sql, array($table));
break;
case 'pgsql':
$sql = 'SELECT tablename AS table_name, schemaname AS schema_name '
. 'FROM pg_tables WHERE schemaname NOT LIKE \'pg_%\' '
. 'AND schemaname != \'information_schema\' '
. 'AND tablename = ?';
$result = \OC_DB::executeAudited($sql, array($table));
break;
case 'oci':
$sql = 'SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = ?';
$result = \OC_DB::executeAudited($sql, array($table));
break;
case 'mssql':
$sql = 'SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ?';
$result = \OC_DB::executeAudited($sql, array($table));
break;
default:
throw new \OC\DatabaseException("Unknown database type: $dbType");
}
return $result->fetchOne() === $table;
} }
} }

View File

@ -164,6 +164,31 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
return $msg; return $msg;
} }
/**
* Drop a table from the database if it exists
*
* @param string $table table name without the prefix
*/
public function dropTable($table) {
$table = $this->tablePrefix . trim($table);
$schema = $this->getSchemaManager();
if($schema->tablesExist(array($table))) {
$schema->dropTable($table);
}
}
/**
* Check if a table exists
*
* @param string $table table name without the prefix
* @return bool
*/
public function tableExists($table){
$table = $this->tablePrefix . trim($table);
$schema = $this->getSchemaManager();
return $schema->tablesExist(array($table));
}
// internal use // internal use
/** /**
* @param string $statement * @param string $statement

View File

@ -47,4 +47,31 @@ class OracleConnection extends Connection {
$identifier = $this->quoteKeys($identifier); $identifier = $this->quoteKeys($identifier);
return parent::delete($tableName, $identifier); return parent::delete($tableName, $identifier);
} }
/**
* Drop a table from the database if it exists
*
* @param string $table table name without the prefix
*/
public function dropTable($table) {
$table = $this->tablePrefix . trim($table);
$table = $this->quoteIdentifier($table);
$schema = $this->getSchemaManager();
if($schema->tablesExist(array($table))) {
$schema->dropTable($table);
}
}
/**
* Check if a table exists
*
* @param string $table table name without the prefix
* @return bool
*/
public function tableExists($table){
$table = $this->tablePrefix . trim($table);
$table = $this->quoteIdentifier($table);
$schema = $this->getSchemaManager();
return $schema->tablesExist(array($table));
}
} }

View File

@ -158,4 +158,19 @@ interface IDBConnection {
* @return \Doctrine\DBAL\Platforms\AbstractPlatform The database platform. * @return \Doctrine\DBAL\Platforms\AbstractPlatform The database platform.
*/ */
public function getDatabasePlatform(); public function getDatabasePlatform();
/**
* Drop a table from the database if it exists
*
* @param string $table table name without the prefix
*/
public function dropTable($table);
/**
* Check if a table exists
*
* @param string $table table name without the prefix
* @return bool
*/
public function tableExists($table);
} }

View File

@ -0,0 +1,69 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace Test\DB;
use Doctrine\DBAL\Platforms\SqlitePlatform;
use OC\DB\MDB2SchemaManager;
class Connection extends \Test\TestCase {
/**
* @var \OCP\IDBConnection
*/
private $connection;
public function setUp() {
parent::setUp();
$this->connection = \OC::$server->getDatabaseConnection();
}
/**
* @param string $table
*/
public function assertTableExist($table) {
if ($this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
// sqlite removes the tables after closing the DB
$this->assertTrue(true);
} else {
$this->assertTrue($this->connection->tableExists($table), 'Table ' . $table . ' exists.');
}
}
/**
* @param string $table
*/
public function assertTableNotExist($table) {
if ($this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
// sqlite removes the tables after closing the DB
$this->assertTrue(true);
} else {
$this->assertFalse($this->connection->tableExists($table), 'Table ' . $table . ' doesnt exists.');
}
}
private function makeTestTable() {
$schemaManager = new MDB2SchemaManager($this->connection);
$schemaManager->createDbFromStructure(__DIR__ . '/testschema.xml');
}
public function testTableExists() {
$this->assertTableNotExist('table');
$this->makeTestTable();
$this->assertTableExist('table');
}
/**
* @depends testTableExists
*/
public function testDropTable() {
$this->assertTableExist('table');
$this->connection->dropTable('table');
$this->assertTableNotExist('table');
}
}