%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/Migration.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\components; use humhub\models\Setting; use Yii; /** * Migration is the base class for representing a database migration. * * @see \yii\db\Migration */ class Migration extends \yii\db\Migration { protected function safeCreateTable($table, $columns, $options = null) { if (!$this->db->getTableSchema($table, true)) { $this->createTable($table, $columns, $options); } else { if (!$this->compact) { echo " > skipped create table $table, table does already exist ...\n"; } Yii::warning("Tried to create an already existing existing table '$table' in migration " . get_class($this)); } } protected function safeDropTable($table) { if ($this->db->getTableSchema($table, true)) { $this->dropTable($table); } else { if (!$this->compact) { echo " > skipped drop table $table, table does not exist ...\n"; } Yii::warning("Tried to drop a non existing table '$table' in migration " . get_class($this)); } } /** * Check if the column already exists in the table * * @since 1.9.1 * @param string $index * @param string $table * @return bool */ protected function columnExists($column, $table): bool { $tableSchema = $this->db->getTableSchema($table, true); return $tableSchema && in_array($column, $tableSchema->columnNames, true); } protected function safeDropColumn($table, $column) { if ($this->columnExists($column, $table)) { $this->dropColumn($table, $column); } else { if (!$this->compact) { echo " > skipped drop column $column from table $table, column does not exist ...\n"; } Yii::warning("Tried to drop a non existing column '$column' from table '$table' in migration " . get_class($this)); } } protected function safeAddColumn($table, $column, $type) { if (!$this->columnExists($column, $table)) { $this->addColumn($table, $column, $type); } else { if (!$this->compact) { echo " > skipped add column $column from table $table, column does already exist ...\n"; } Yii::warning("Tried to add an already existing column '$column' on table '$table' in migration " . get_class($this)); } } /** * Check if the index already exists in the table * * @since 1.9.1 * @param string $index * @param string $table * @return bool */ protected function indexExists($index, $table): bool { return (bool) $this->db->createCommand('SHOW KEYS FROM ' . $this->db->quoteTableName($table) . ' WHERE Key_name = ' . $this->db->quoteValue($index)) ->queryOne(); } /** * Check if the foreign index already exists in the table * * @since 1.9.1 * @param string $index * @param string $table * @return bool */ protected function foreignIndexExists(string $index, string $table): bool { return (bool) $this->db->createCommand('SELECT * FROM information_schema.key_column_usage WHERE REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = ' . $this->db->quoteValue($table) . ' AND TABLE_SCHEMA = ' . $this->db->quoteValue($this->getDsnAttribute('dbname')). ' AND CONSTRAINT_NAME = ' . $this->db->quoteValue($index)) ->queryOne(); } /** * Create an index if it doesn't exist yet * * @since 1.9.1 * @param string $index * @param string $table * @param string|array $columns * @param bool $unique */ protected function safeCreateIndex($index, $table, $columns, $unique = false) { if ($this->indexExists($index, $table)) { if (!$this->compact) { echo " > skipped create index $index in the table $table, index already exists ...\n"; } Yii::warning("Tried to create an already existing index '$index' on table '$table' in migration " . get_class($this)); return; } $this->createIndex($index, $table, $columns, $unique); } /** * Drop an index if it exists in the table * * @since 1.9.1 * @param string $index * @param string $table */ protected function safeDropIndex($index, $table) { if (!$this->indexExists($index, $table)) { if (!$this->compact) { echo " > skipped drop index $index from the table $table, index does not exist ...\n"; } Yii::warning("Tried to drop a non existing index '$index' from table '$table' in migration " . get_class($this)); return; } $this->dropIndex($index, $table); } /** * Add a primary index if it doesn't exist yet * * @since 1.9.1 * @param string $index * @param string $table * @param string|array $columns */ protected function safeAddPrimaryKey($index, $table, $columns) { if ($this->indexExists('PRIMARY', $table)) { if (!$this->compact) { echo " > skipped create primary index $index in the table $table, primary index already exists ...\n"; } Yii::warning("Tried to create an already existing primary index '$index' on table '$table' in migration " . get_class($this)); return; } $this->addPrimaryKey($index, $table, $columns); } /** * Drop a primary index if it exists in the table * * @since 1.9.1 * @param string $index * @param string $table */ protected function safeDropPrimaryKey($index, $table) { if (!$this->indexExists('PRIMARY', $table)) { if (!$this->compact) { echo " > skipped drop primary index $index from the table $table, primary index does not exist ...\n"; } Yii::warning("Tried to drop a non existing primary index '$index' from table '$table' in migration " . get_class($this)); return; } $this->dropPrimaryKey($index, $table); } /** * Add a foreign index if it doesn't exist yet * * @since 1.9.1 * @param string $index * @param string $table * @param string|array $columns */ protected function safeAddForeignKey($index, $table, $columns, $refTable, $refColumns, $delete = null, $update = null) { if ($this->foreignIndexExists($index, $table)) { if (!$this->compact) { echo " > skipped create foreign index $index in the table $table, foreign index already exists ...\n"; } Yii::warning("Tried to create an already existing foreign index '$index' on table '$table' in migration " . get_class($this)); return; } $this->addForeignKey($index, $table, $columns, $refTable, $refColumns, $delete, $update); } /** * Drop a foreign if it exists in the table * * @since 1.9.1 * @param string $index * @param string $table */ protected function safeDropForeignKey($index, $table) { if (!$this->foreignIndexExists($index, $table)) { if (!$this->compact) { echo " > skipped drop foreign index $index from the table $table, foreign index does not exist ...\n"; } Yii::warning("Tried to drop a non existing foreign index '$index' from table '$table' in migration " . get_class($this)); return; } $this->dropForeignKey($index, $table); } /** * Renames a class * * This is often required because some classes are also stored in database * e.g. for polymorphic relations. * * This method is also required for 0.20 namespace migration! * * @param string $oldClass * @param string $newClass * @throws \yii\db\Exception */ protected function renameClass($oldClass, $newClass) { $this->updateSilent('activity', ['object_model' => $newClass], ['object_model' => $oldClass]); $this->updateSilent('activity', ['class' => $newClass], ['class' => $oldClass]); $this->updateSilent('comment', ['object_model' => $newClass], ['object_model' => $oldClass]); $this->updateSilent('content', ['object_model' => $newClass], ['object_model' => $oldClass]); $this->updateSilent('file', ['object_model' => $newClass], ['object_model' => $oldClass]); $this->updateSilent('like', ['object_model' => $newClass], ['object_model' => $oldClass]); $this->updateSilent('notification', ['source_class' => $newClass], ['source_class' => $oldClass]); $this->updateSilent('notification', ['class' => $newClass], ['class' => $oldClass]); $this->updateSilent('user_mentioning', ['object_model' => $newClass], ['object_model' => $oldClass]); $this->updateSilent('user_follow', ['object_model' => $newClass], ['object_model' => $oldClass]); //$this->updateSilent('wall', ['object_model' => $newClass], ['object_model' => $oldClass]); /** * Looking up "NewLike" activities with this className * Since 0.20 the className changed to Like (is not longer the target object e.g. post) * * Use raw query for better performace. */ $updateSql = " UPDATE activity LEFT JOIN `like` ON like.object_model=activity.object_model AND like.object_id=activity.object_id SET activity.object_model=:likeModelClass, activity.object_id=like.id WHERE activity.class=:likedActivityClass AND like.id IS NOT NULL and activity.object_model != :likeModelClass "; Yii::$app->db->createCommand($updateSql, [ ':likeModelClass' => \humhub\modules\like\models\Like::className(), ':likedActivityClass' => \humhub\modules\like\activities\Liked::className() ])->execute(); } /** * Creates and executes an UPDATE SQL statement without any output. * The method will properly escape the column names and bind the values to be updated. * * @param string $table the table to be updated. * @param array $columns the column data (name => value) to be updated. * @param array|string $condition the conditions that will be put in the WHERE part. Please * refer to [[Query::where()]] on how to specify conditions. * @param array $params the parameters to be bound to the query. */ public function updateSilent($table, $columns, $condition = '', $params = []) { $this->db->createCommand()->update($table, $columns, $condition, $params)->execute(); } /** * Creates and executes an INSERT SQL statement without any output * The method will properly escape the column names, and bind the values to be inserted. * @param string $table the table that new rows will be inserted into. * @param array $columns the column data (name => value) to be inserted into the table. */ public function insertSilent($table, $columns) { $this->db->createCommand()->insert($table, $columns)->execute(); } /** * Returns whether this is a completely new installation with an empty database (installation process). * * @return bool * @since 1.8 */ protected function isInitialInstallation() { return (!Setting::isInstalled()); } /** * Get data from database dsn config * * @since 1.9.3 * @param string $name 'host', 'port', 'dbname' * @return string|null */ private function getDsnAttribute(string $name): ?string { return preg_match('/' . preg_quote($name) . '=([^;]*)/', $this->db->dsn, $match) ? $match[1] : null; } }