Merge pull request #12695 from owncloud/db-drop-table
Add dropTable to IDBConnection
This commit is contained in:
commit
263e008d7b
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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');
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue