]> git.mxchange.org Git - friendica.git/commitdiff
Orphans are removed without giant lock problems
authorMichael Vogel <ike@pirati.ca>
Thu, 20 Oct 2016 22:05:21 +0000 (22:05 +0000)
committerMichael Vogel <ike@pirati.ca>
Thu, 20 Oct 2016 22:05:21 +0000 (22:05 +0000)
include/dba.php
include/dbclean.php
include/dbstructure.php
mod/display.php

index a9ed9e5a051bcd2e554828d5c5cca4e38f490b03..c7b598f2d68e09ed2f3a9ead81d25d23f00d7265 100644 (file)
@@ -108,6 +108,23 @@ class dba {
                return $return;
        }
 
+       /**
+        * @brief Returns the number of rows
+        *
+        * @return string
+        */
+       public function num_rows() {
+               if (!$this->result)
+                       return 0;
+
+               if ($this->mysqli) {
+                       $return = $this->result->num_rows;
+               } else {
+                       $return = mysql_num_rows($this->result);
+               }
+               return $return;
+       }
+
        public function q($sql, $onlyquery = false) {
                global $a;
 
@@ -126,6 +143,8 @@ class dba {
 
                $stamp1 = microtime(true);
 
+               $sql = "/*".$a->callstack()." */ ".$sql;
+
                if($this->mysqli)
                        $result = @$this->db->query($sql);
                else
index 8ec9c1dc4a265c050d6fb50ed9dae0448085cf6b..860d0f22022753910f07a294c5a523f2a5489b05 100644 (file)
@@ -16,22 +16,48 @@ if(is_null($db)) {
 load_config('config');
 load_config('system');
 
-update_shadow_copy();
+remove_orphans();
 killme();
 
 function remove_orphans() {
+        global $db;
 
        logger("Deleting orphaned data from thread table");
-       q("DELETE FROM `thread` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `thread`.`iid`)");
+       if ($db->q("SELECT `iid` FROM `thread` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `thread`.`iid`)", true)) {
+               logger("found thread orphans: ".$db->num_rows());
+               while ($orphan = $db->qfetch())
+                       q("DELETE FROM `thread` WHERE `iid` = %d", intval($orphan["iid"]));
+       }
+       $db->qclose();
+
 
        logger("Deleting orphaned data from notify table");
-       q("DELETE FROM `notify` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `notify`.`iid`)");
+       if ($db->q("SELECT `iid` FROM `notify` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `notify`.`iid`)", true)) {
+               logger("found notify orphans: ".$db->num_rows());
+               while ($orphan = $db->qfetch())
+                       q("DELETE FROM `notify` WHERE `iid` = %d", intval($orphan["iid"]));
+       }
+       $db->qclose();
+
 
        logger("Deleting orphaned data from sign table");
-       q("DELETE FROM `sign` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `sign`.`iid`)");
+       if ($db->q("SELECT `iid` FROM `sign` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `sign`.`iid`)", true)) {
+               logger("found sign orphans: ".$db->num_rows());
+               while ($orphan = $db->qfetch())
+                       q("DELETE FROM `sign` WHERE `iid` = %d", intval($orphan["iid"]));
+       }
+       $db->qclose();
+
 
        logger("Deleting orphaned data from term table");
-       q("DELETE FROM `term` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `term`.`oid`)");
+       if ($db->q("SELECT `oid` FROM `term` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `term`.`oid`)", true)) {
+               logger("found term orphans: ".$db->num_rows());
+               while ($orphan = $db->qfetch())
+                       q("DELETE FROM `term` WHERE `oid` = %d", intval($orphan["oid"]));
+       }
+       $db->qclose();
+
+// SELECT `id`, `received`, `created`, `guid` FROM `item` WHERE `uid` = 0 AND NOT EXISTS (SELECT `guid` FROM `item` AS `i` WHERE `item`.`guid` = `i`.`guid` AND `i`.`uid` != 0) LIMIT 1;
 
        logger("Done deleting orphaned data from tables");
 }
index 2aefdf45c1f47311da2231a857a922310cb2dbab..f3c89474087c3e5c8e4899a75d814f8164dba83d 100644 (file)
@@ -1121,6 +1121,7 @@ function db_definition($charset) {
                        "indexes" => array(
                                        "PRIMARY" => array("id"),
                                        "uid_contactid" => array("uid", "contact-id"),
+                                       "uid_album_created" => array("uid", "album", "created"),
                                        "resource-id" => array("resource-id"),
                                        "guid" => array("guid"),
                                        )
index b21c2810caa4134b407ebadf15daef947b86e3d6..0e0e7b30314a5efd21240ba591c641fa9a445b43 100644 (file)
@@ -236,7 +236,7 @@ function display_content(&$a, $update = 0) {
                        }
 
                        if ($nick == "") {
-                               $r = qu("SELECT `user`.`nickname`, `item`.`id` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid`
+                               $r = qu("SELECT STRAIGHT_JOIN `user`.`nickname`, `item`.`id` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid`
                                        WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`
                                                AND `item`.`allow_cid` = ''  AND `item`.`allow_gid` = ''
                                                AND `item`.`deny_cid`  = '' AND `item`.`deny_gid`  = ''