diff --git a/boot.php b/boot.php index 99af7d3778..b689b73eec 100644 --- a/boot.php +++ b/boot.php @@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_CODENAME', 'Asparagus'); define ( 'FRIENDICA_VERSION', '3.5.2-dev' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); -define ( 'DB_UPDATE_VERSION', 1221 ); +define ( 'DB_UPDATE_VERSION', 1222 ); /** * @brief Constant with a HTML line break. diff --git a/include/dba.php b/include/dba.php index f695902afe..1ee2662150 100644 --- a/include/dba.php +++ b/include/dba.php @@ -23,6 +23,7 @@ class dba { public $error = false; private $_server_info = ''; private static $dbo; + private static $relation = array(); function __construct($server, $user, $pass, $db, $install = false) { $a = get_app(); @@ -519,7 +520,7 @@ class dba { } if (!$stmt->execute()) { - $errorInfo = self::$dbo->db->errorInfo(); + $errorInfo = $stmt->errorInfo(); self::$dbo->error = $errorInfo[2]; self::$dbo->errorno = $errorInfo[1]; $retval = false; @@ -531,8 +532,8 @@ class dba { $stmt = self::$dbo->db->stmt_init(); if (!$stmt->prepare($sql)) { - self::$dbo->error = self::$dbo->db->error; - self::$dbo->errorno = self::$dbo->db->errno; + self::$dbo->error = $stmt->error; + self::$dbo->errorno = $stmt->errno; $retval = false; break; } @@ -753,6 +754,158 @@ class dba { return self::e($sql, $param); } + /** + * @brief Build the array with the table relations + * + * The array is build from the database definitions in dbstructure.php + * + * This process must only be started once, since the value is cached. + */ + static private function build_relation_data() { + $definition = db_definition(); + + foreach ($definition AS $table => $structure) { + foreach ($structure['fields'] AS $field => $field_struct) { + if (isset($field_struct['relation'])) { + foreach ($field_struct['relation'] AS $rel_table => $rel_field) { + self::$relation[$rel_table][$rel_field][$table][] = $field; + } + } + } + } + } + + /** + * @brief Insert a row into a table + * + * @param string $table Table name + * @param array $param parameter array + * @param boolean $in_commit Internal use: Only do a commit after the last delete + * @param array $callstack Internal use: prevent endless loops + * + * @return boolean|array was the delete successfull? When $in_commit is set: deletion data + */ + static public function delete($table, $param, $in_commit = false, &$callstack = array()) { + + $commands = array(); + + // Create a key for the loop prevention + $key = $table.':'.implode(':', array_keys($param)).':'.implode(':', $param); + + // We quit when this key already exists in the callstack. + if (isset($callstack[$key])) { + return $commands; + } + + $callstack[$key] = true; + + $table = self::$dbo->escape($table); + + $commands[$key] = array('table' => $table, 'param' => $param); + + // To speed up the whole process we cache the table relations + if (count(self::$relation) == 0) { + self::build_relation_data(); + } + + // Is there a relation entry for the table? + if (isset(self::$relation[$table])) { + // We only allow a simple "one field" relation. + $field = array_keys(self::$relation[$table])[0]; + $rel_def = array_values(self::$relation[$table])[0]; + + // When the search field is the relation field, we don't need to fetch the rows + // This is useful when the leading record is already deleted in the frontend but the rest is done in the backend + if ((count($param) == 1) AND ($field == array_keys($param)[0])) { + foreach ($rel_def AS $rel_table => $rel_fields) { + foreach ($rel_fields AS $rel_field) { + $retval = self::delete($rel_table, array($rel_field => array_values($param)[0]), true, $callstack); + $commands = array_merge($commands, $retval); + } + } + } else { + // Create a key for preventing double queries + $qkey = $field.'-'.$table.':'.implode(':', array_keys($param)).':'.implode(':', $param); + + // We quit when this key already exists in the callstack. + if (isset($callstack[$qkey])) { + continue; + } + + $callstack[$qkey] = true; + + // Fetch all rows that are to be deleted + $sql = "SELECT ".self::$dbo->escape($field)." FROM `".$table."` WHERE `". + implode("` = ? AND `", array_keys($param))."` = ?"; + + $data = self::p($sql, $param); + while ($row = self::fetch($data)) { + // Now we accumulate the delete commands + $retval = self::delete($table, array($field => $row[$field]), true, $callstack); + $commands = array_merge($commands, $retval); + } + + // Since we had split the delete command we don't need the original command anymore + unset($commands[$key]); + } + } + + if (!$in_commit) { + // Now we finalize the process + self::p("COMMIT"); + self::p("START TRANSACTION"); + + $compacted = array(); + $counter = array(); + foreach ($commands AS $command) { + if (count($command['param']) > 1) { + $sql = "DELETE FROM `".$command['table']."` WHERE `". + implode("` = ? AND `", array_keys($command['param']))."` = ?"; + + logger(dba::replace_parameters($sql, $command['param']), LOGGER_DATA); + + if (!self::e($sql, $param)) { + self::p("ROLLBACK"); + return false; + } + } else { + $key_table = $command['table']; + $key_param = array_keys($command['param'])[0]; + $value = array_values($command['param'])[0]; + + // Split the SQL queries in chunks of 100 values + // We do the $i stuff here to make the code better readable + $i = $counter[$key_table][$key_param]; + if (count($compacted[$key_table][$key_param][$i]) > 100) { + ++$i; + } + + $compacted[$key_table][$key_param][$i][$value] = $value; + $counter[$key_table][$key_param] = $i; + } + } + foreach ($compacted AS $table => $values) { + foreach ($values AS $field => $field_value_list) { + foreach ($field_value_list AS $field_values) { + $sql = "DELETE FROM `".$table."` WHERE `".$field."` IN (". + substr(str_repeat("?, ", count($field_values)), 0, -2).");"; + + logger(dba::replace_parameters($sql, $field_values), LOGGER_DATA); + + if (!self::e($sql, $param)) { + self::p("ROLLBACK"); + return false; + } + } + } + } + self::p("COMMIT"); + return true; + } + + return $commands; + } + /** * @brief Updates rows * diff --git a/include/dbstructure.php b/include/dbstructure.php index 98a4a9c307..06e81e4958 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -300,6 +300,9 @@ function update_structure($verbose, $action, $tables=null, $definition=null) { // Compare the field definition $field_definition = $database[$name]["fields"][$fieldname]; + // Remove the relation data that is used for the referential integrity + unset($parameters['relation']); + // We change the collation after the indexes had been changed. // This is done to avoid index length problems. // So here we always ensure that there is no need to change it. @@ -627,7 +630,7 @@ function db_definition() { $database["attach"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "hash" => array("type" => "varchar(64)", "not null" => "1", "default" => ""), "filename" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "filetype" => array("type" => "varchar(64)", "not null" => "1", "default" => ""), @@ -647,7 +650,7 @@ function db_definition() { $database["auth_codes"] = array( "fields" => array( "id" => array("type" => "varchar(40)", "not null" => "1", "primary" => "1"), - "client_id" => array("type" => "varchar(20)", "not null" => "1", "default" => ""), + "client_id" => array("type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => array("clients" => "client_id")), "redirect_uri" => array("type" => "varchar(200)", "not null" => "1", "default" => ""), "expires" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "scope" => array("type" => "varchar(250)", "not null" => "1", "default" => ""), @@ -688,7 +691,7 @@ function db_definition() { "redirect_uri" => array("type" => "varchar(200)", "not null" => "1", "default" => ""), "name" => array("type" => "text"), "icon" => array("type" => "text"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), ), "indexes" => array( "PRIMARY" => array("client_id"), @@ -709,7 +712,7 @@ function db_definition() { $database["contact"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "self" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "remote_self" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), @@ -798,7 +801,7 @@ function db_definition() { "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "guid" => array("type" => "varchar(64)", "not null" => "1", "default" => ""), "recips" => array("type" => "text"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "creator" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "updated" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), @@ -828,8 +831,8 @@ function db_definition() { "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "guid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "edited" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), @@ -881,9 +884,9 @@ function db_definition() { $database["ffinder"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "cid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "fid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "cid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), + "fid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("fcontact" => "id")), ), "indexes" => array( "PRIMARY" => array("id"), @@ -904,8 +907,8 @@ function db_definition() { $database["fsuggest"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "request" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -920,8 +923,8 @@ function db_definition() { $database["gcign"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "gcid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "gcid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("gcontact" => "id")), ), "indexes" => array( "PRIMARY" => array("id"), @@ -971,10 +974,10 @@ function db_definition() { $database["glink"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "gcid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "zcid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "gcid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("gcontact" => "id")), + "zcid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("gcontact" => "id")), "updated" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), ), "indexes" => array( @@ -986,7 +989,7 @@ function db_definition() { $database["group"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "visible" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "deleted" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -999,9 +1002,9 @@ function db_definition() { $database["group_member"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "gid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "contact-id" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "gid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("group" => "id")), + "contact-id" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), ), "indexes" => array( "PRIMARY" => array("id"), @@ -1049,9 +1052,9 @@ function db_definition() { $database["intro"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "fid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "contact-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "fid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("fcontact" => "id")), + "contact-id" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "knowyou" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "duplex" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "note" => array("type" => "text"), @@ -1066,16 +1069,16 @@ function db_definition() { ); $database["item"] = array( "fields" => array( - "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), + "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => array("thread" => "iid")), "guid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "contact-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "contact-id" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), + "gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0", "relation" => array("gcontact" => "id")), "type" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "wall" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "gravity" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), - "parent" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "parent" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("item" => "id")), "parent-uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "extid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "thr-parent" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -1084,11 +1087,11 @@ function db_definition() { "commented" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "received" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "changed" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), - "owner-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "owner-id" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "owner-name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "owner-link" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "owner-avatar" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), - "author-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "author-id" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "author-name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "author-link" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "author-avatar" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -1103,7 +1106,7 @@ function db_definition() { "postopts" => array("type" => "text"), "plink" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "resource-id" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), - "event-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "event-id" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("event" => "id")), "tag" => array("type" => "mediumtext"), "attach" => array("type" => "mediumtext"), "inform" => array("type" => "mediumtext"), @@ -1149,6 +1152,7 @@ function db_definition() { "uid_parenturi" => array("uid","parent-uri(190)"), "uid_contactid_created" => array("uid","contact-id","created"), "authorid_created" => array("author-id","created"), + "ownerid" => array("owner-id"), "uid_uri" => array("uid", "uri(190)"), "resource-id" => array("resource-id"), "contactid_allowcid_allowpid_denycid_denygid" => array("contact-id","allow_cid(10)","allow_gid(10)","deny_cid(10)","deny_gid(10)"), // @@ -1164,8 +1168,8 @@ function db_definition() { $database["item_id"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "iid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "iid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("item" => "id")), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "sid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "service" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), ), @@ -1191,13 +1195,13 @@ function db_definition() { $database["mail"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "guid" => array("type" => "varchar(64)", "not null" => "1", "default" => ""), "from-name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "from-photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "from-url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), - "contact-id" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), - "convid" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), + "contact-id" => array("type" => "varchar(255)", "not null" => "1", "default" => "", "relation" => array("contact" => "id")), + "convid" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0", "relation" => array("conv" => "id")), "title" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "body" => array("type" => "mediumtext"), "seen" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), @@ -1219,7 +1223,7 @@ function db_definition() { $database["mailacct"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "server" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "port" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "ssltype" => array("type" => "varchar(16)", "not null" => "1", "default" => ""), @@ -1239,8 +1243,8 @@ function db_definition() { $database["manage"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "mid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "mid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), ), "indexes" => array( "PRIMARY" => array("id"), @@ -1257,10 +1261,10 @@ function db_definition() { "photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "msg" => array("type" => "mediumtext"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "link" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), - "iid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "parent" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "iid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("item" => "id")), + "parent" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("item" => "id")), "seen" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "verb" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "otype" => array("type" => "varchar(16)", "not null" => "1", "default" => ""), @@ -1278,10 +1282,10 @@ function db_definition() { $database["notify-threads"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "notify-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), - "master-parent-item" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "notify-id" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("notify" => "id")), + "master-parent-item" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("item" => "id")), "parent-item" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "receiver-uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "receiver-uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), ), "indexes" => array( "PRIMARY" => array("id"), @@ -1314,7 +1318,7 @@ function db_definition() { $database["pconfig"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "cat" => array("type" => "varbinary(255)", "not null" => "1", "default" => ""), "k" => array("type" => "varbinary(255)", "not null" => "1", "default" => ""), "v" => array("type" => "mediumtext"), @@ -1327,8 +1331,8 @@ function db_definition() { $database["photo"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "contact-id" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "contact-id" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "guid" => array("type" => "varchar(64)", "not null" => "1", "default" => ""), "resource-id" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), @@ -1361,7 +1365,7 @@ function db_definition() { $database["poll"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "q0" => array("type" => "text"), "q1" => array("type" => "text"), "q2" => array("type" => "text"), @@ -1381,7 +1385,7 @@ function db_definition() { $database["poll_result"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "poll_id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "poll_id" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("poll" => "id")), "choice" => array("type" => "int(11)", "not null" => "1", "default" => "0"), ), "indexes" => array( @@ -1404,7 +1408,7 @@ function db_definition() { $database["profile"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "profile-name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "is-default" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "hide-friends" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), @@ -1454,8 +1458,8 @@ function db_definition() { $database["profile_check"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "cid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "cid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "dfrn_id" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "sec" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "expire" => array("type" => "int(11)", "not null" => "1", "default" => "0"), @@ -1467,7 +1471,7 @@ function db_definition() { $database["push_subscriber"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "callback_url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "topic" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "nickname" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -1482,7 +1486,7 @@ function db_definition() { $database["queue"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "network" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "last" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), @@ -1503,7 +1507,7 @@ function db_definition() { "id" => array("type" => "int(11) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "hash" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), - "uid" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "password" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "language" => array("type" => "varchar(16)", "not null" => "1", "default" => ""), "note" => array("type" => "text"), @@ -1515,7 +1519,7 @@ function db_definition() { $database["search"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "term" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), ), "indexes" => array( @@ -1539,7 +1543,7 @@ function db_definition() { $database["sign"] = array( "fields" => array( "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "iid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "iid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("item" => "id")), "signed_text" => array("type" => "mediumtext"), "signature" => array("type" => "text"), "signer" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -1552,7 +1556,7 @@ function db_definition() { $database["spam"] = array( "fields" => array( "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), "spam" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "ham" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "term" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -1569,7 +1573,7 @@ function db_definition() { $database["term"] = array( "fields" => array( "tid" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), - "oid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "oid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("item" => "id")), "otype" => array("type" => "tinyint(3) unsigned", "not null" => "1", "default" => "0"), "type" => array("type" => "tinyint(3) unsigned", "not null" => "1", "default" => "0"), "term" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), @@ -1579,7 +1583,7 @@ function db_definition() { "received" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "global" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "aid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), ), "indexes" => array( "PRIMARY" => array("tid"), @@ -1591,12 +1595,12 @@ function db_definition() { ); $database["thread"] = array( "fields" => array( - "iid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "primary" => "1"), - "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), - "contact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), - "gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), - "owner-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), - "author-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), + "iid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => array("item" => "id")), + "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), + "contact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), + "gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0", "relation" => array("gcontact" => "id")), + "owner-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), + "author-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0", "relation" => array("contact" => "id")), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "edited" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "commented" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), @@ -1624,6 +1628,9 @@ function db_definition() { "uid_network_created" => array("uid","network","created"), "uid_contactid_commented" => array("uid","contact-id","commented"), "uid_contactid_created" => array("uid","contact-id","created"), + "contactid" => array("contact-id"), + "ownerid" => array("owner-id"), + "authorid" => array("author-id"), "uid_created" => array("uid","created"), "uid_commented" => array("uid","commented"), "uid_wall_created" => array("uid","wall","created"), @@ -1633,10 +1640,10 @@ function db_definition() { "fields" => array( "id" => array("type" => "varchar(40)", "not null" => "1", "primary" => "1"), "secret" => array("type" => "text"), - "client_id" => array("type" => "varchar(20)", "not null" => "1", "default" => ""), + "client_id" => array("type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => array("clients" => "client_id")), "expires" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "scope" => array("type" => "varchar(200)", "not null" => "1", "default" => ""), - "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), + "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0", "relation" => array("user" => "uid")), ), "indexes" => array( "PRIMARY" => array("id"), @@ -1780,7 +1787,7 @@ function dbstructure_run(&$argv, &$argc) { echo "dryrun show database update schema queries without running them\n"; echo "update update database schema\n"; echo "dumpsql dump database schema\n"; - echo "toinnodb convert all tables from MyISAM to InnoDB\n"; + echo "toinnodb convert all tables from MyISAM to InnoDB\n"; return; } diff --git a/include/remove_contact.php b/include/remove_contact.php index 68bf2adfea..bb110a284b 100644 --- a/include/remove_contact.php +++ b/include/remove_contact.php @@ -19,14 +19,7 @@ function remove_contact_run($argv, $argc) { return; } - q("DELETE FROM `item` WHERE `contact-id` = %d", intval($id)); - - q("DELETE FROM `photo` WHERE `contact-id` = %d", intval($id)); - - q("DELETE FROM `mail` WHERE `contact-id` = %d", intval($id)); - - q("DELETE FROM `event` WHERE `cid` = %d", intval($id)); - - q("DELETE FROM `queue` WHERE `cid` = %d", intval($id)); + // Now we delete all the depending table entries + dba::delete('contact', array('id' => $id)); } ?> diff --git a/update.php b/update.php index 704f2ac061..bdb3d68839 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@