From 3af5f6b8ee7fd855310a92fca06d79116f3c6d52 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 19 Nov 2020 06:26:30 +0000 Subject: [PATCH 1/4] Some more foreign keys added --- database.sql | 39 ++++++++++++++------- include/enotify.php | 21 +++++++---- src/Database/DBStructure.php | 8 +++++ static/dbstructure.config.php | 44 +++++++++++++----------- update.php | 65 ++++++++++++++++++++++++++++++++++- 5 files changed, 138 insertions(+), 39 deletions(-) diff --git a/database.sql b/database.sql index e2b333a6da..0d60666204 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ -- Friendica 2020.12-dev (Red Hot Poker) --- DB_UPDATE_VERSION 1376 +-- DB_UPDATE_VERSION 1377 -- ------------------------------------------ @@ -620,7 +620,7 @@ CREATE TABLE IF NOT EXISTS `inbox-status` ( CREATE TABLE IF NOT EXISTS `intro` ( `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID', `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id', - `fid` int unsigned NOT NULL DEFAULT 0 COMMENT '', + `fid` int unsigned COMMENT '', `contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT '', `knowyou` boolean NOT NULL DEFAULT '0' COMMENT '', `duplex` boolean NOT NULL DEFAULT '0' COMMENT '', @@ -645,7 +645,7 @@ CREATE TABLE IF NOT EXISTS `item` ( `uri` varchar(255) NOT NULL DEFAULT '' COMMENT '', `uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the item uri', `uri-hash` varchar(80) NOT NULL DEFAULT '' COMMENT 'RIPEMD-128 hash from uri', - `parent` int unsigned NOT NULL DEFAULT 0 COMMENT 'item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item', + `parent` int unsigned COMMENT 'item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item', `parent-uri` varchar(255) NOT NULL DEFAULT '' COMMENT 'uri of the top-level parent to this item', `parent-uri-id` int unsigned COMMENT 'Id of the item-uri table that contains the top-level parent uri', `thr-parent` varchar(255) NOT NULL DEFAULT '' COMMENT 'If the parent of this item is not the top-level item in the conversation, the uri of the immediate parent; otherwise set to parent-uri', @@ -661,7 +661,6 @@ CREATE TABLE IF NOT EXISTS `item` ( `author-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the author of this item', `causer-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Link to the contact table with uid=0 of the contact that caused the item creation', `icid` int unsigned COMMENT 'Id of the item-content table entry that contains the whole item content', - `iaid` int unsigned COMMENT 'Id of the item-activity table entry that contains the activity data', `vid` smallint unsigned COMMENT 'Id of the verb table entry that contains the activity verbs', `extid` varchar(255) NOT NULL DEFAULT '' COMMENT '', `post-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Post type (personal note, bookmark, ...)', @@ -681,7 +680,8 @@ CREATE TABLE IF NOT EXISTS `item` ( `forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '', `psid` int unsigned COMMENT 'ID of the permission set of this post', `resource-id` varchar(32) NOT NULL DEFAULT '' COMMENT 'Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type', - `event-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Used to link to the event.id', + `event-id` int unsigned COMMENT 'Used to link to the event.id', + `iaid` int unsigned COMMENT 'Deprecated', `attach` mediumtext COMMENT 'Deprecated', `allow_cid` mediumtext COMMENT 'Deprecated', `allow_gid` mediumtext COMMENT 'Deprecated', @@ -741,6 +741,7 @@ CREATE TABLE IF NOT EXISTS `item` ( INDEX `uid_eventid` (`uid`,`event-id`), INDEX `icid` (`icid`), INDEX `iaid` (`iaid`), + INDEX `vid` (`vid`), INDEX `psid_wall` (`psid`,`wall`), INDEX `uri-id` (`uri-id`), INDEX `parent-uri-id` (`parent-uri-id`), @@ -749,8 +750,12 @@ CREATE TABLE IF NOT EXISTS `item` ( FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`thr-parent-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`owner-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, + FOREIGN KEY (`author-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, FOREIGN KEY (`causer-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, + FOREIGN KEY (`vid`) REFERENCES `verb` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`psid`) REFERENCES `permissionset` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Structure for all posts'; @@ -826,8 +831,8 @@ CREATE TABLE IF NOT EXISTS `mail` ( `from-name` varchar(255) NOT NULL DEFAULT '' COMMENT 'name of the sender', `from-photo` varchar(255) NOT NULL DEFAULT '' COMMENT 'contact photo link of the sender', `from-url` varchar(255) NOT NULL DEFAULT '' COMMENT 'profile linke of the sender', - `contact-id` varchar(255) NOT NULL DEFAULT '' COMMENT 'contact.id', - `convid` int unsigned NOT NULL DEFAULT 0 COMMENT 'conv.id', + `contact-id` varchar(255) COMMENT 'contact.id', + `convid` int unsigned COMMENT 'conv.id', `title` varchar(255) NOT NULL DEFAULT '' COMMENT '', `body` mediumtext COMMENT '', `seen` boolean NOT NULL DEFAULT '0' COMMENT 'if message visited it is 1', @@ -895,8 +900,8 @@ CREATE TABLE IF NOT EXISTS `notify` ( `msg` mediumtext COMMENT '', `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id', `link` varchar(255) NOT NULL DEFAULT '' COMMENT '', - `iid` int unsigned NOT NULL DEFAULT 0 COMMENT 'item.id', - `parent` int unsigned NOT NULL DEFAULT 0 COMMENT '', + `iid` int unsigned COMMENT 'item.id', + `parent` int unsigned COMMENT '', `uri-id` int unsigned COMMENT 'Item-uri id of the related post', `parent-uri-id` int unsigned COMMENT 'Item-uri id of the parent of the related post', `seen` boolean NOT NULL DEFAULT '0' COMMENT '', @@ -908,7 +913,11 @@ CREATE TABLE IF NOT EXISTS `notify` ( INDEX `seen_uid_date` (`seen`,`uid`,`date`), INDEX `uid_date` (`uid`,`date`), INDEX `uid_type_link` (`uid`,`type`,`link`(190)), - FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE + INDEX `uri-id` (`uri-id`), + INDEX `parent-uri-id` (`parent-uri-id`), + FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='notifications'; -- @@ -917,15 +926,18 @@ CREATE TABLE IF NOT EXISTS `notify` ( CREATE TABLE IF NOT EXISTS `notify-threads` ( `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID', `notify-id` int unsigned NOT NULL DEFAULT 0 COMMENT '', - `master-parent-item` int unsigned NOT NULL DEFAULT 0 COMMENT '', + `master-parent-item` int unsigned COMMENT '', `master-parent-uri-id` int unsigned COMMENT 'Item-uri id of the parent of the related post', `parent-item` int unsigned NOT NULL DEFAULT 0 COMMENT '', `receiver-uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id', PRIMARY KEY(`id`), + INDEX `master-parent-item` (`master-parent-item`), INDEX `master-parent-uri-id` (`master-parent-uri-id`), INDEX `receiver-uid` (`receiver-uid`), INDEX `notify-id` (`notify-id`), FOREIGN KEY (`notify-id`) REFERENCES `notify` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`master-parent-item`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`master-parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`receiver-uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE ) DEFAULT COLLATE utf8mb4_general_ci COMMENT=''; @@ -1349,7 +1361,10 @@ CREATE TABLE IF NOT EXISTS `thread` ( INDEX `uri-id` (`uri-id`), FOREIGN KEY (`iid`) REFERENCES `item` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, - FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE + FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`owner-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, + FOREIGN KEY (`author-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Thread related data'; -- diff --git a/include/enotify.php b/include/enotify.php index b7fe18a18f..27eb871065 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -476,21 +476,30 @@ function notification($params) $notify_id = 0; if ($show_in_notification_page) { - $notification = DI::notify()->insert([ + $fields = [ 'name' => $params['source_name'] ?? '', 'name_cache' => substr(strip_tags(BBCode::convert($params['source_name'])), 0, 255), 'url' => $params['source_link'] ?? '', 'photo' => $params['source_photo'] ?? '', 'link' => $itemlink ?? '', 'uid' => $params['uid'] ?? 0, - 'iid' => $item_id, - 'uri-id' => $uri_id, - 'parent' => $parent_id, - 'parent-uri-id' => $parent_uri_id, 'type' => $params['type'] ?? '', 'verb' => $params['verb'] ?? '', 'otype' => $params['otype'] ?? '', - ]); + ]; + if (!empty($item_id)) { + $fields['iid'] = $item_id; + } + if (!empty($uri_id)) { + $fields['uri-id'] = $uri_id; + } + if (!empty($item_id)) { + $fields['parent'] = $parent_id; + } + if (!empty($item_id)) { + $fields['parent-uri-id'] = $parent_uri_id; + } + $notification = DI::notify()->insert($fields); // Notification insertion can be intercepted by an addon registering the 'enotify_store' hook if (!$notification) { diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index 6f3fe5dba5..98d167c2fe 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -1054,6 +1054,14 @@ class DBStructure } } + if (self::existsTable('verb') && !DBA::exists('verb', ['id' => 0])) { + DBA::insert('verb', ['name' => '']); + $lastid = DBA::lastInsertId(); + if ($lastid != 0) { + DBA::update('verb', ['id' => 0], ['id' => $lastid]); + } + } + if (self::existsTable('user') && !DBA::exists('user', ['uid' => 0])) { $user = [ "verified" => true, diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index e952675fef..990835fe8b 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -55,7 +55,7 @@ use Friendica\Database\DBA; if (!defined('DB_UPDATE_VERSION')) { - define('DB_UPDATE_VERSION', 1376); + define('DB_UPDATE_VERSION', 1377); } return [ @@ -686,7 +686,7 @@ return [ "fields" => [ "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"], "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "User id"], - "fid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["fcontact" => "id"], "comment" => ""], + "fid" => ["type" => "int unsigned", "relation" => ["fcontact" => "id"], "comment" => ""], "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => ""], "knowyou" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], @@ -710,7 +710,7 @@ return [ "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"], "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"], - "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item"], + "parent" => ["type" => "int unsigned", "relation" => ["item" => "id"], "comment" => "item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item"], "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "uri of the top-level parent to this item"], "parent-uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the top-level parent uri"], "thr-parent" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "If the parent of this item is not the top-level item in the conversation, the uri of the immediate parent; otherwise set to parent-uri"], @@ -722,12 +722,11 @@ return [ "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date that something in the conversation changed, indicating clients should fetch the conversation again"], "gravity" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""], "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network from where the item comes from"], - "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the owner of this item"], - "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the author of this item"], + "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Link to the contact table with uid=0 of the owner of this item"], + "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Link to the contact table with uid=0 of the author of this item"], "causer-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Link to the contact table with uid=0 of the contact that caused the item creation"], "icid" => ["type" => "int unsigned", "relation" => ["item-content" => "id"], "comment" => "Id of the item-content table entry that contains the whole item content"], - "iaid" => ["type" => "int unsigned", "relation" => ["item-activity" => "id"], "comment" => "Id of the item-activity table entry that contains the activity data"], - "vid" => ["type" => "smallint unsigned", "relation" => ["verb" => "id"], "comment" => "Id of the verb table entry that contains the activity verbs"], + "vid" => ["type" => "smallint unsigned", "foreign" => ["verb" => "id", "on delete" => "restrict"], "comment" => "Id of the verb table entry that contains the activity verbs"], "extid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"], "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], @@ -737,7 +736,7 @@ return [ "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been deleted"], // User specific fields. Eventually they will move to user-item "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner id which owns this copy of the item"], - "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"], + "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => "contact.id"], "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "This item was posted to the wall of uid"], "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item originated at this site"], "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], @@ -748,8 +747,9 @@ return [ "psid" => ["type" => "int unsigned", "foreign" => ["permissionset" => "id", "on delete" => "restrict"], "comment" => "ID of the permission set of this post"], // It has to be decided whether these fields belong to the user or the structure "resource-id" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type"], - "event-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["event" => "id"], "comment" => "Used to link to the event.id"], + "event-id" => ["type" => "int unsigned", "relation" => ["event" => "id"], "comment" => "Used to link to the event.id"], // Deprecated fields. Will be removed in upcoming versions + "iaid" => ["type" => "int unsigned", "comment" => "Deprecated"], "attach" => ["type" => "mediumtext", "comment" => "Deprecated"], "allow_cid" => ["type" => "mediumtext", "comment" => "Deprecated"], "allow_gid" => ["type" => "mediumtext", "comment" => "Deprecated"], @@ -811,6 +811,7 @@ return [ "uid_eventid" => ["uid", "event-id"], "icid" => ["icid"], "iaid" => ["iaid"], + "vid" => ["vid"], "psid_wall" => ["psid", "wall"], "uri-id" => ["uri-id"], "parent-uri-id" => ["parent-uri-id"], @@ -890,8 +891,8 @@ return [ "from-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "name of the sender"], "from-photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "contact photo link of the sender"], "from-url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "profile linke of the sender"], - "contact-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "relation" => ["contact" => "id"], "comment" => "contact.id"], - "convid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["conv" => "id"], "comment" => "conv.id"], + "contact-id" => ["type" => "varchar(255)", "relation" => ["contact" => "id"], "comment" => "contact.id"], + "convid" => ["type" => "int unsigned", "relation" => ["conv" => "id"], "comment" => "conv.id"], "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "body" => ["type" => "mediumtext", "comment" => ""], "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if message visited it is 1"], @@ -958,10 +959,10 @@ return [ "msg" => ["type" => "mediumtext", "comment" => ""], "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner User id"], "link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], - "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"], - "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""], - "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Item-uri id of the related post"], - "parent-uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Item-uri id of the parent of the related post"], + "iid" => ["type" => "int unsigned", "relation" => ["item" => "id"], "comment" => "item.id"], + "parent" => ["type" => "int unsigned", "relation" => ["item" => "id"], "comment" => ""], + "uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Item-uri id of the related post"], + "parent-uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Item-uri id of the parent of the related post"], "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""], "otype" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => ""], @@ -973,6 +974,8 @@ return [ "seen_uid_date" => ["seen", "uid", "date"], "uid_date" => ["uid", "date"], "uid_type_link" => ["uid", "type", "link(190)"], + "uri-id" => ["uri-id"], + "parent-uri-id" => ["parent-uri-id"], ] ], "notify-threads" => [ @@ -980,14 +983,15 @@ return [ "fields" => [ "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"], "notify-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["notify" => "id"], "comment" => ""], - "master-parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""], - "master-parent-uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Item-uri id of the parent of the related post"], + "master-parent-item" => ["type" => "int unsigned", "foreign" => ["item" => "id"], "comment" => ""], + "master-parent-uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Item-uri id of the parent of the related post"], "parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""], "receiver-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "User id"], ], "indexes" => [ "PRIMARY" => ["id"], + "master-parent-item" => ["master-parent-item"], "master-parent-uri-id" => ["master-parent-uri-id"], "receiver-uid" => ["receiver-uid"], "notify-id" => ["notify-id"], @@ -1368,9 +1372,9 @@ return [ "comment" => "sequential ID"], "uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"], "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "User id"], - "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""], - "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item owner"], - "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item author"], + "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => ""], + "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Item owner"], + "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Item author"], "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], diff --git a/update.php b/update.php index 3544275c00..94cb145c64 100644 --- a/update.php +++ b/update.php @@ -788,11 +788,74 @@ function pre_update_1376() return Update::FAILED; } + Photo::delete(["NOT `uid` IN (SELECT `uid` FROM `user`)"]); + if (!DBA::e("DELETE FROM `contact` WHERE NOT `uid` IN (SELECT `uid` FROM `user`)")) { return Update::FAILED; } - Photo::delete(["NOT `uid` IN (SELECT `uid` FROM `user`)"]); + return Update::SUCCESS; +} + +function pre_update_1377() +{ + DBStructure::checkInitialValues(); + + if (!DBA::e("DELETE FROM `item` WHERE NOT `parent` IN (SELECT `id` FROM `item`)")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `item` WHERE NOT `author-id` IN (SELECT `id` FROM `contact`)")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `item` WHERE NOT `owner-id` IN (SELECT `id` FROM `contact`)")) { + return Update::FAILED; + } + + if (!DBA::e("UPDATE `item` SET `contact-id` = `owner-id` WHERE NOT `contact-id` IN (SELECT `id` FROM `contact`)")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `thread` WHERE NOT `author-id` IN (SELECT `id` FROM `contact`)")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `thread` WHERE NOT `owner-id` IN (SELECT `id` FROM `contact`)")) { + return Update::FAILED; + } + + if (!DBA::e("UPDATE `thread` SET `contact-id` = `owner-id` WHERE NOT `contact-id` IN (SELECT `id` FROM `contact`)")) { + return Update::FAILED; + } + + if (!DBA::e("UPDATE `notify` SET `uri-id` = NULL WHERE `uri-id` = 0")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `notify` WHERE `uri-id` NOT IN (SELECT `id` FROM `item-uri`)")) { + return Update::FAILED; + } + + if (!DBA::e("UPDATE `notify` SET `parent-uri-id` = NULL WHERE `parent-uri-id` = 0")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `notify` WHERE `parent-uri-id` NOT IN (SELECT `id` FROM `item-uri`)")) { + return Update::FAILED; + } + + if (!DBA::e("UPDATE `notify-threads` SET `master-parent-uri-id` = NULL WHERE `master-parent-uri-id` = 0")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `notify-threads` WHERE `master-parent-uri-id` NOT IN (SELECT `id` FROM `item-uri`)")) { + return Update::FAILED; + } + + if (!DBA::e("DELETE FROM `notify-threads` WHERE `master-parent-item` NOT IN (SELECT `id` FROM `item`)")) { + return Update::FAILED; + } return Update::SUCCESS; } From cbfea67ba639b4e789b798cc9c7b6cbe3d865775 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 19 Nov 2020 09:47:59 +0000 Subject: [PATCH 2/4] Improved key length --- database.sql | 8 ++++---- static/dbstructure.config.php | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/database.sql b/database.sql index 0d60666204..da3c458ef9 100644 --- a/database.sql +++ b/database.sql @@ -175,14 +175,14 @@ CREATE TABLE IF NOT EXISTS `contact` ( PRIMARY KEY(`id`), INDEX `uid_name` (`uid`,`name`(190)), INDEX `self_uid` (`self`,`uid`), - INDEX `alias_uid` (`alias`(96),`uid`), + INDEX `alias_uid` (`alias`(128),`uid`), INDEX `pending_uid` (`pending`,`uid`), INDEX `blocked_uid` (`blocked`,`uid`), INDEX `uid_rel_network_poll` (`uid`,`rel`,`network`,`poll`(64),`archive`), INDEX `uid_network_batch` (`uid`,`network`,`batch`(64)), - INDEX `addr_uid` (`addr`(96),`uid`), - INDEX `nurl_uid` (`nurl`(96),`uid`), - INDEX `nick_uid` (`nick`(32),`uid`), + INDEX `addr_uid` (`addr`(128),`uid`), + INDEX `nurl_uid` (`nurl`(128),`uid`), + INDEX `nick_uid` (`nick`(128),`uid`), INDEX `attag_uid` (`attag`(96),`uid`), INDEX `dfrn-id` (`dfrn-id`(64)), INDEX `issued-id` (`issued-id`(64)), diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 990835fe8b..4d729960fa 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -234,14 +234,14 @@ return [ "PRIMARY" => ["id"], "uid_name" => ["uid", "name(190)"], "self_uid" => ["self", "uid"], - "alias_uid" => ["alias(96)", "uid"], + "alias_uid" => ["alias(128)", "uid"], "pending_uid" => ["pending", "uid"], "blocked_uid" => ["blocked", "uid"], "uid_rel_network_poll" => ["uid", "rel", "network", "poll(64)", "archive"], "uid_network_batch" => ["uid", "network", "batch(64)"], - "addr_uid" => ["addr(96)", "uid"], - "nurl_uid" => ["nurl(96)", "uid"], - "nick_uid" => ["nick(32)", "uid"], + "addr_uid" => ["addr(128)", "uid"], + "nurl_uid" => ["nurl(128)", "uid"], + "nick_uid" => ["nick(128)", "uid"], "attag_uid" => ["attag(96)", "uid"], "dfrn-id" => ["dfrn-id(64)"], "issued-id" => ["issued-id(64)"], From c07573e25f7c53146a18a4257b90ce7fe6c0baab Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 19 Nov 2020 16:15:00 +0000 Subject: [PATCH 3/4] Test for failed test --- database.sql | 1 - static/dbstructure.config.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/database.sql b/database.sql index da3c458ef9..ea6a1fabe0 100644 --- a/database.sql +++ b/database.sql @@ -753,7 +753,6 @@ CREATE TABLE IF NOT EXISTS `item` ( FOREIGN KEY (`owner-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, FOREIGN KEY (`author-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, FOREIGN KEY (`causer-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, - FOREIGN KEY (`vid`) REFERENCES `verb` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT, FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`psid`) REFERENCES `permissionset` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 4d729960fa..08991ccbd8 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -726,7 +726,7 @@ return [ "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Link to the contact table with uid=0 of the author of this item"], "causer-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Link to the contact table with uid=0 of the contact that caused the item creation"], "icid" => ["type" => "int unsigned", "relation" => ["item-content" => "id"], "comment" => "Id of the item-content table entry that contains the whole item content"], - "vid" => ["type" => "smallint unsigned", "foreign" => ["verb" => "id", "on delete" => "restrict"], "comment" => "Id of the verb table entry that contains the activity verbs"], + "vid" => ["type" => "smallint unsigned", "relation" => ["verb" => "id"], "comment" => "Id of the verb table entry that contains the activity verbs"], "extid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"], "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], From f1b04504cafb43a83b5a6c1724f5424e614fa1a1 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 19 Nov 2020 16:28:15 +0000 Subject: [PATCH 4/4] Chenged compared text --- tests/legacy/ApiTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/legacy/ApiTest.php b/tests/legacy/ApiTest.php index 4fd6855f21..265f502f0a 100644 --- a/tests/legacy/ApiTest.php +++ b/tests/legacy/ApiTest.php @@ -3780,7 +3780,7 @@ class ApiTest extends FixtureTest $assertXml=<< - + XML; self::assertXmlStringEqualsXmlString($assertXml, $result);