📄 sqlite.php
字号:
} elseif ('SET NULL' == $fkdef['ondelete']) {
$sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setnull_action. '; END;';
} elseif ('SET DEFAULT' == $fkdef['ondelete']) {
$sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action. '; END;';
} elseif ('NO ACTION' == $fkdef['ondelete']) {
$sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete') . '; END;';
} else {
//'RESTRICT'
$sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . '; END;';
}
if (PEAR::isError($result)) {
return $result;
}
$result = $db->exec($sql_delete);
if (PEAR::isError($result)) {
return $result;
}
$result = $db->exec($sql_update);
if (PEAR::isError($result)) {
return $result;
}
}
}
if (PEAR::isError($result)) {
return $result;
}
return MDB2_OK;
}
// }}}
// {{{ dropTable()
/**
* drop an existing table
*
* @param string $name name of the table that should be dropped
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public
*/
function dropTable($name)
{
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
//delete the triggers associated to existing FK constraints
$constraints = $this->listTableConstraints($name);
if (!PEAR::isError($constraints) && !empty($constraints)) {
$db->loadModule('Reverse', null, true);
foreach ($constraints as $constraint) {
$definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
$result = $this->_dropFKTriggers($name, $constraint, $definition['references']['table']);
if (PEAR::isError($result)) {
return $result;
}
}
}
}
$name = $db->quoteIdentifier($name, true);
return $db->exec("DROP TABLE $name");
}
// }}}
// {{{ vacuum()
/**
* Optimize (vacuum) all the tables in the db (or only the specified table)
* and optionally run ANALYZE.
*
* @param string $table table name (all the tables if empty)
* @param array $options an array with driver-specific options:
* - timeout [int] (in seconds) [mssql-only]
* - analyze [boolean] [pgsql and mysql]
* - full [boolean] [pgsql-only]
* - freeze [boolean] [pgsql-only]
*
* @return mixed MDB2_OK success, a MDB2 error on failure
* @access public
*/
function vacuum($table = null, $options = array())
{
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$query = 'VACUUM';
if (!empty($table)) {
$query .= ' '.$db->quoteIdentifier($table, true);
}
return $db->exec($query);
}
// }}}
// {{{ alterTable()
/**
* alter an existing table
*
* @param string $name name of the table that is intended to be changed.
* @param array $changes associative array that contains the details of each type
* of change that is intended to be performed. The types of
* changes that are currently supported are defined as follows:
*
* name
*
* New name for the table.
*
* add
*
* Associative array with the names of fields to be added as
* indexes of the array. The value of each entry of the array
* should be set to another associative array with the properties
* of the fields to be added. The properties of the fields should
* be the same as defined by the MDB2 parser.
*
*
* remove
*
* Associative array with the names of fields to be removed as indexes
* of the array. Currently the values assigned to each entry are ignored.
* An empty array should be used for future compatibility.
*
* rename
*
* Associative array with the names of fields to be renamed as indexes
* of the array. The value of each entry of the array should be set to
* another associative array with the entry named name with the new
* field name and the entry named Declaration that is expected to contain
* the portion of the field declaration already in DBMS specific SQL code
* as it is used in the CREATE TABLE statement.
*
* change
*
* Associative array with the names of the fields to be changed as indexes
* of the array. Keep in mind that if it is intended to change either the
* name of a field and any other properties, the change array entries
* should have the new names of the fields as array indexes.
*
* The value of each entry of the array should be set to another associative
* array with the properties of the fields to that are meant to be changed as
* array entries. These entries should be assigned to the new values of the
* respective properties. The properties of the fields should be the same
* as defined by the MDB2 parser.
*
* Example
* array(
* 'name' => 'userlist',
* 'add' => array(
* 'quota' => array(
* 'type' => 'integer',
* 'unsigned' => 1
* )
* ),
* 'remove' => array(
* 'file_limit' => array(),
* 'time_limit' => array()
* ),
* 'change' => array(
* 'name' => array(
* 'length' => '20',
* 'definition' => array(
* 'type' => 'text',
* 'length' => 20,
* ),
* )
* ),
* 'rename' => array(
* 'sex' => array(
* 'name' => 'gender',
* 'definition' => array(
* 'type' => 'text',
* 'length' => 1,
* 'default' => 'M',
* ),
* )
* )
* )
*
* @param boolean $check indicates whether the function should just check if the DBMS driver
* can perform the requested table alterations if the value is true or
* actually perform them otherwise.
* @access public
*
* @return mixed MDB2_OK on success, a MDB2 error on failure
*/
function alterTable($name, $changes, $check, $options = array())
{
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
foreach ($changes as $change_name => $change) {
switch ($change_name) {
case 'add':
case 'remove':
case 'change':
case 'name':
case 'rename':
break;
default:
return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
'change type "'.$change_name.'" not yet supported', __FUNCTION__);
}
}
if ($check) {
return MDB2_OK;
}
$db->loadModule('Reverse', null, true);
// actually sqlite 2.x supports no ALTER TABLE at all .. so we emulate it
$fields = $db->manager->listTableFields($name);
if (PEAR::isError($fields)) {
return $fields;
}
$fields = array_flip($fields);
foreach ($fields as $field => $value) {
$definition = $db->reverse->getTableFieldDefinition($name, $field);
if (PEAR::isError($definition)) {
return $definition;
}
$fields[$field] = $definition[0];
}
$indexes = $db->manager->listTableIndexes($name);
if (PEAR::isError($indexes)) {
return $indexes;
}
$indexes = array_flip($indexes);
foreach ($indexes as $index => $value) {
$definition = $db->reverse->getTableIndexDefinition($name, $index);
if (PEAR::isError($definition)) {
return $definition;
}
$indexes[$index] = $definition;
}
$constraints = $db->manager->listTableConstraints($name);
if (PEAR::isError($constraints)) {
return $constraints;
}
if (!array_key_exists('foreign_keys', $options)) {
$options['foreign_keys'] = array();
}
$constraints = array_flip($constraints);
foreach ($constraints as $constraint => $value) {
if (!empty($definition['primary'])) {
if (!array_key_exists('primary', $options)) {
$options['primary'] = $definition['fields'];
//remove from the $constraint array, it's already handled by createTable()
unset($constraints[$constraint]);
}
} else {
$c_definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
if (PEAR::isError($c_definition)) {
return $c_definition;
}
if (!empty($c_definition['foreign'])) {
if (!array_key_exists($constraint, $options['foreign_keys'])) {
$options['foreign_keys'][$constraint] = $c_definition;
}
//remove from the $constraint array, it's already handled by createTable()
unset($constraints[$constraint]);
} else {
$constraints[$constraint] = $c_definition;
}
}
}
$name_new = $name;
$create_order = $select_fields = array_keys($fields);
foreach ($changes as $change_name => $change) {
switch ($change_name) {
case 'add':
foreach ($change as $field_name => $field) {
$fields[$field_name] = $field;
$create_order[] = $field_name;
}
break;
case 'remove':
foreach ($change as $field_name => $field) {
unset($fields[$field_name]);
$select_fields = array_diff($select_fields, array($field_name));
$create_order = array_diff($create_order, array($field_name));
}
break;
case 'change':
foreach ($change as $field_name => $field) {
$fields[$field_name] = $field['definition'];
}
break;
case 'name':
$name_new = $change;
break;
case 'rename':
foreach ($change as $field_name => $field) {
unset($fields[$field_name]);
$fields[$field['name']] = $field['definition'];
$create_order[array_search($field_name, $create_order)] = $field['name'];
}
break;
default:
return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
'change type "'.$change_name.'" not yet supported', __FUNCTION__);
}
}
$data = null;
if (!empty($select_fields)) {
$query = 'SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier($name, true);
$data = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED);
}
$result = $this->dropTable($name);
if (PEAR::isError($result)) {
return $result;
}
$result = $this->createTable($name_new, $fields, $options);
if (PEAR::isError($result)) {
return $result;
}
foreach ($indexes as $index => $definition) {
$this->createIndex($name_new, $index, $definition);
}
foreach ($constraints as $constraint => $definition) {
$this->createConstraint($name_new, $constraint, $definition);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -