/** * @brief drop a table * @param string $tableName the table to drop */ public function dropTable($tableName) { $sm = $this->conn->getSchemaManager(); $fromSchema = $sm->createSchema(); $toSchema = clone $fromSchema; $toSchema->dropTable($tableName); $sql = $fromSchema->getMigrateToSql($toSchema, $this->conn->getDatabasePlatform()); $this->conn->executeQuery($sql); }
/** * Fix mime types */ public function run(IOutput $out) { if (!$this->connection->getDatabasePlatform() instanceof SqlitePlatform) { return; } $sourceSchema = $this->connection->getSchemaManager()->createSchema(); $schemaDiff = new SchemaDiff(); foreach ($sourceSchema->getTables() as $tableSchema) { $primaryKey = $tableSchema->getPrimaryKey(); if (!$primaryKey) { continue; } $columnNames = $primaryKey->getColumns(); // add a column diff for every primary key column, // but do not actually change anything, this will // force the generation of SQL statements to alter // those tables, which will then trigger the // specific SQL code from OCSqlitePlatform try { $tableDiff = new TableDiff($tableSchema->getName()); $tableDiff->fromTable = $tableSchema; foreach ($columnNames as $columnName) { $columnSchema = $tableSchema->getColumn($columnName); $columnDiff = new ColumnDiff($columnSchema->getName(), $columnSchema); $tableDiff->changedColumns[] = $columnDiff; $schemaDiff->changedTables[] = $tableDiff; } } catch (SchemaException $e) { // ignore } } $this->connection->beginTransaction(); foreach ($schemaDiff->toSql($this->connection->getDatabasePlatform()) as $sql) { $this->connection->query($sql); } $this->connection->commit(); }
/** * @param string $file * @param \OC\DB\Connection $conn * @return bool */ public static function saveSchemaToFile($file, \OC\DB\Connection $conn) { $config = \OC::$server->getConfig(); $xml = new SimpleXMLElement('<database/>'); $xml->addChild('name', $config->getSystemValue('dbname', 'owncloud')); $xml->addChild('create', 'true'); $xml->addChild('overwrite', 'false'); $xml->addChild('charset', 'utf8'); $conn->getConfiguration()->setFilterSchemaAssetsExpression('/^' . $config->getSystemValue('dbtableprefix', 'oc_') . '/'); foreach ($conn->getSchemaManager()->listTables() as $table) { self::saveTable($table, $xml->addChild('table')); } file_put_contents($file, $xml->asXML()); return true; }
/** * @brief Resynchronizes all sequences of a database after using INSERTs * without leaving out the auto-incremented column. * @param \OC\DB\Connection $conn * @return null */ public function resynchronizeDatabaseSequences(Connection $conn) { $databaseName = $conn->getDatabase(); $conn->getConfiguration()->setFilterSchemaAssetsExpression('/^' . $this->config->getSystemValue('dbtableprefix', 'oc_') . '/'); foreach ($conn->getSchemaManager()->listSequences() as $sequence) { $sequenceName = $sequence->getName(); $sqlInfo = 'SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE column_default = ? AND table_catalog = ?'; $sequenceInfo = $conn->fetchAssoc($sqlInfo, array("nextval('{$sequenceName}'::regclass)", $databaseName)); $tableName = $sequenceInfo['table_name']; $columnName = $sequenceInfo['column_name']; $sqlMaxId = "SELECT MAX({$columnName}) FROM {$tableName}"; $sqlSetval = "SELECT setval('{$sequenceName}', ({$sqlMaxId}))"; $conn->executeQuery($sqlSetval); } }
/** * @param string $file * @param \OC\DB\Connection $conn * @return bool */ public static function saveSchemaToFile($file, \OC\DB\Connection $conn) { $config = \OC::$server->getConfig(); $xml = new SimpleXMLElement('<database/>'); $xml->addChild('name', $config->getSystemValue('dbname', 'owncloud')); $xml->addChild('create', 'true'); $xml->addChild('overwrite', 'false'); $xml->addChild('charset', 'utf8'); // FIX ME: bloody work around if ($config->getSystemValue('dbtype', 'sqlite') === 'oci') { $filterExpression = '/^"' . preg_quote($conn->getPrefix()) . '/'; } else { $filterExpression = '/^' . preg_quote($conn->getPrefix()) . '/'; } $conn->getConfiguration()->setFilterSchemaAssetsExpression($filterExpression); foreach ($conn->getSchemaManager()->listTables() as $table) { self::saveTable($table, $xml->addChild('table')); } file_put_contents($file, $xml->asXML()); return true; }
/** * saves database scheme to xml file * @param string $file name of file * @param int|string $mode * @return bool * * TODO: write more documentation */ public function getDbStructure($file, $mode = MDB2_SCHEMA_DUMP_STRUCTURE) { $sm = $this->conn->getSchemaManager(); return \OC_DB_MDB2SchemaWriter::saveSchemaToFile($file, $sm); }
protected function getTables(Connection $db) { return $db->getSchemaManager()->listTableNames(); }
protected function getTables(Connection $db) { $db->getConfiguration()->setFilterSchemaAssetsExpression('/^' . $this->config->getSystemValue('dbtableprefix', 'oc_') . '/'); return $db->getSchemaManager()->listTableNames(); }