schema.inc.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 1,058 行 · 第 1/3 页
SVN-BASE
1,058 行
$definition->type = $type; $definition->extra = $extra; $this->indexes[] = $definition; } public function createPrimaryKeys() { foreach($this->primaryKeys as $primaryKey) { $this->createPrimaryKey($primaryKey->table, $primaryKey->primaryKey); } } /** * Add a primary key to a table. * * @param string $tablename * @param string $primaryKey */ private function createPrimaryKey($tablename, $primaryKey) { if (!array_key_exists($tablename, $this->schema)) { // if we don't know about the table, possibly it is in the commercial version. // exit gracefully. return; } if (is_array($primaryKey)) { $primaryKey = implode(',', $primaryKey); } $sql="ALTER TABLE $tablename ADD PRIMARY KEY ($primaryKey)"; $this->_exec($sql, false); if (strpos($primaryKey,',') === false) { // for some reason, there seems to be a problem periodically when adding foreign key constraints // unless there is a unique key. just a primary key isn't good enough for some reason. so for now, // we add the unique key, doubling up the effort of the primary key. we can drop these indexes again // later after the constraints have been added. $this->primary[$tablename] = $primaryKey; $sql="ALTER TABLE $tablename ADD UNIQUE KEY ($primaryKey)"; $this->_exec($sql); } } public function createForeignKeys() { foreach($this->foreignKeys as $foreignKey) { $this->createForeignKey($foreignKey->table,$foreignKey->field,$foreignKey->otherTable,$foreignKey->otherField,$foreignKey->onDelete, $foreignKey->onUpdate); } } /** * Add a foreign key constraint for a table. * * @param string $table * @param string $field * @param string $othertable * @param string $otherfield * @param string $ondelete * @param string $onupdate */ private function createForeignKey($table, $field, $otherTable, $otherField, $onDelete='cascade', $onUpdate='cascade') { if (!array_key_exists($table, $this->schema) || !array_key_exists($otherTable, $this->schema)) { // if we don't know about the tables, possibly it is in the commercial version. // exit gracefully. return; } $this->fixForeignKey($table, $field, $otherTable, $otherField); $sql = "ALTER TABLE $table ADD FOREIGN KEY ($field) REFERENCES $otherTable ($otherField) "; if ($onDelete != '') { $sql .= " ON DELETE $onDelete"; } if ($onUpdate != '') { $sql .= " ON UPDATE $onUpdate"; } $this->_exec($sql); } public function createIndexes() { foreach($this->indexes as $index) { $this->createIndex($index->table, $index->fields, $index->type, $index->extra); } $this->removeDuplicateIndexes(); } private function fixForeignKey($table, $field, $otherTable, $otherField) { if ($table == $otherTable) { $this->_exec("create temporary table tmp_{$table}(id int);"); $this->_exec("insert into tmp_{$table} select distinct id FROM {$table};"); $this->_exec("insert into tmp_{$table} select distinct id FROM {$table};"); $otherTable = "tmp_{$table}"; } if ($otherTable == 'users' && $otherField == 'id') { $this->createFixUser(); $sql = "UPDATE $table SET $field = -10 WHERE $field is not null and $field not in (select distinct id from users)"; $this->_exec($sql); return; } $sql = "DELETE FROM $table WHERE $field is not null and $field not in (select distinct $otherField FROM $otherTable)"; $this->_exec($sql); if ($table == $otherTable) { $this->_exec("drop table tmp_{$table};"); } } /** * Add an index to a table. * * @param string $table * @param array $fields * @param string $type * @param string $extra */ private function createIndex($table, $fields, $type='', $extra='') { if (!array_key_exists($table, $this->schema)) { // if we don't know about the tables, possibly it is in the commercial version. // exit gracefully. return; } if (!is_array($fields)) { $fields = array($fields); } $index = implode('_', $fields); $fields = implode(',',$fields); $sql = "ALTER TABLE $table ADD $type INDEX $index ($fields$extra) "; $this->_exec($sql); } /** * Drop all indexes and foreign key constraints from the system. * * @return int The number of elements cleared. */ private function getDBSchema() { $this->schema = array(); $result = DBUtil::getResultArray('SHOW TABLES'); $tables=array(); foreach($result as $table) { $keys = array_keys($table); $tablename = $table[$keys[0]]; if (substr($tablename,0,5) == 'zseq_') { continue; } $stmt = DBUtil::getResultArray("SHOW CREATE TABLE $tablename;"); $keys = array_keys($stmt[0]); $sql = $stmt[0][$keys[1]]; $this->schema[$tablename] = $sql; } } private function dropForeignKey($tablename, $foreignKey) { $sql = "ALTER TABLE $tablename DROP FOREIGN KEY $foreignKey;"; return $this->_exec($sql); } /** * Drops foreign keys based on the current schema * * @return int */ public function dropForeignKeys() { $dropped = 0; foreach($this->schema as $tablename=>$schema) { $lines = explode("\n", $schema); foreach($lines as $line) { if (strpos($line, 'CONSTRAINT') === false) { continue; } preg_match_all('(\`([^\`])*\`)',$line, $params); $constraint=substr($params[0][0],1,-1); $table= substr($params[0][2],1,-1); ($this->dropForeignKey($tablename, $constraint)); $dropped++; } } return $dropped; } /** * Drops primary keys based on the current schema * * @return int */ public function dropPrimaryKeys() { $dropped = 0; foreach($this->schema as $tablename=>$schema) { $lines = explode("\n", $schema); foreach($lines as $line) { if (strpos($line, 'PRIMARY KEY') === false) { continue; } ($this->dropPrimaryKey($tablename)); $dropped++; } } return $dropped; } /** * Drops the primary key from a table * * @param string $tablename */ private function dropPrimaryKey($tablename) { $sql = "ALTER TABLE $tablename DROP primary key;"; return $this->_exec($sql,false); } /** * Drops indexes based on the current schema * * @return int */ public function dropIndexes() { $dropped = 0; foreach($this->schema as $tablename=>$schema) { $lines = explode("\n", $schema); foreach($lines as $line) { if (strpos($line, 'KEY') === false) { continue; } if (strpos($line, 'PRIMARY KEY') !== false) { continue; } if (strpos($line, 'FOREIGN KEY') !== false) { continue; } preg_match_all('(\`([^\`])*\`)',$line, $params); $key = substr($params[0][0],1,-1); ($this->dropIndex($tablename, $key)); $dropped++; } } return $dropped; } /** * Drop an index from the database. * * @param string $table * @param string $field */ function dropIndex($table, $field) { if (!is_array($fields)) $field = array($field); $field = implode('_', $field); $sql = "ALTER TABLE $table DROP INDEX $field"; $result = $this->_exec($sql); if (!$result) { print "..."; } return $result; } /** * Execute a db sql statement on the database. * * @param string $sql * @return boolean */ private function _exec($sql ) { global $default; if (!$this->persist) { print "$sql\n"; return; } $this->log("Action: $sql"); $rs = DBUtil::runQuery($sql, $default->_admindb ); if (PEAR::isError($rs)) { $this->log("* " . $rs->getMessage()); return false; } return true; } /** * Logs a message to the log file * * @param string $msg */ private function log($msg, $level='info') { global $default; $default->log->$level('KTSchemaUtil: ' .$msg); }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?