]> git.mxchange.org Git - friendica.git/commitdiff
Most queries are now done with the dba functions
authorMichael <heluecht@pirati.ca>
Thu, 22 Feb 2018 06:52:58 +0000 (06:52 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 22 Feb 2018 06:52:58 +0000 (06:52 +0000)
src/Model/Item.php

index d7a002f350945d602949ef1ad4249051ad8222ed..4634358d2ef91777c135199b251565cb13311a71 100644 (file)
@@ -1048,9 +1048,7 @@ class Item extends BaseObject
 
                // Is it a forum? Then we don't care about the rules from above
                if (!$update && ($arr["network"] == NETWORK_DFRN) && ($arr["parent-uri"] === $arr["uri"])) {
-                       $isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`",
-                                       intval($arr['contact-id']));
-                       if (DBM::is_result($isforum)) {
+                       if (dba::exists('contact', ['id' => $arr['contact-id'], 'forum' => true])) {
                                $update = true;
                        }
                }
@@ -1141,11 +1139,11 @@ class Item extends BaseObject
 
        public static function getGuidById($id)
        {
-               $r = q("SELECT `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($id));
-               if (DBM::is_result($r)) {
-                       return $r[0]["guid"];
+               $item = dba::selectFirst('item', ['guid'], ['id' => $id]);
+               if (DBM::is_result($item)) {
+                       return $item['guid'];
                } else {
-                       return "";
+                       return '';
                }
        }
 
@@ -1160,26 +1158,28 @@ class Item extends BaseObject
 
                // Does the given user have this item?
                if ($uid) {
-                       $r = q("SELECT `item`.`id`, `user`.`nickname` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid`
-                               WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 AND `item`.`moderated` = 0
-                                       AND `item`.`guid` = '%s' AND `item`.`uid` = %d", dbesc($guid), intval($uid));
-                       if (DBM::is_result($r)) {
-                               $id = $r[0]["id"];
-                               $nick = $r[0]["nickname"];
+                       $items = dba::p("SELECT `item`.`id`, `user`.`nickname` FROM `item`
+                               INNER JOIN `user` ON `user`.`uid` = `item`.`uid`
+                               WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`
+                                       AND `item`.`guid` = ? AND `item`.`uid` = ?", $guid, $uid);
+                       if ($item = dba::fetch($items)) {
+                               $id = $item["id"];
+                               $nick = $item["nickname"];
                        }
                }
 
                // Or is it anywhere on the server?
                if ($nick == "") {
-                       $r = q("SELECT `item`.`id`, `user`.`nickname` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid`
-                               WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 AND `item`.`moderated` = 0
+                       $items = dba::p("SELECT `item`.`id`, `user`.`nickname` 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`  = ''
-                                       AND `item`.`private` = 0 AND `item`.`wall` = 1
-                                       AND `item`.`guid` = '%s'", dbesc($guid));
-                       if (DBM::is_result($r)) {
-                               $id = $r[0]["id"];
-                               $nick = $r[0]["nickname"];
+                                       AND NOT `item`.`private` AND `item`.`wall`
+                                       AND `item`.`guid` = ?", $guid);
+                       if ($item = dba::fetch($items)) {
+                               $id = $item["id"];
+                               $nick = $item["nickname"];
                        }
                }
                return ["nick" => $nick, "id" => $id];
@@ -1195,33 +1195,26 @@ class Item extends BaseObject
        {
                $mention = false;
 
-               $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
-                       intval($uid)
-               );
-               if (!DBM::is_result($u)) {
+               $user = dba::selectFirst('user', [], ['uid' => $uid]);
+               if (!DBM::is_result($user)) {
                        return;
                }
 
-               $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
-               $prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
+               $community_page = (($user['page-flags'] == PAGE_COMMUNITY) ? true : false);
+               $prvgroup = (($user['page-flags'] == PAGE_PRVGROUP) ? true : false);
 
-               $i = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                       intval($item_id),
-                       intval($uid)
-               );
-               if (!DBM::is_result($i)) {
+               $item = dba::selectFirst('item', [], ['id' => $item_id]);
+               if (!DBM::is_result($item)) {
                        return;
                }
 
-               $item = $i[0];
-
-               $link = normalise_link(System::baseUrl() . '/profile/' . $u[0]['nickname']);
+               $link = normalise_link(System::baseUrl() . '/profile/' . $user['nickname']);
 
                /*
                 * Diaspora uses their own hardwired link URL in @-tags
                 * instead of the one we supply with webfinger
                 */
-               $dlink = normalise_link(System::baseUrl() . '/u/' . $u[0]['nickname']);
+               $dlink = normalise_link(System::baseUrl() . '/u/' . $user['nickname']);
 
                $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches, PREG_SET_ORDER);
                if ($cnt) {
@@ -1245,7 +1238,7 @@ class Item extends BaseObject
                        return;
                }
 
-               $arr = ['item' => $item, 'user' => $u[0]];
+               $arr = ['item' => $item, 'user' => $user];
 
                Addon::callHooks('tagged', $arr);
 
@@ -1263,23 +1256,21 @@ class Item extends BaseObject
                }
 
                // now change this copy of the post to a forum head message and deliver to all the tgroup members
-               $c = q("SELECT `name`, `url`, `thumb` FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
-                       intval($u[0]['uid'])
-               );
-               if (!DBM::is_result($c)) {
+               $self = dba::selectFirst('contact', ['name', 'url', 'thumb'], ['uid' => $uid, 'self' => true]);
+               if (!DBM::is_result($self)) {
                        return;
                }
 
                // also reset all the privacy bits to the forum default permissions
 
-               $private = ($u[0]['allow_cid'] || $u[0]['allow_gid'] || $u[0]['deny_cid'] || $u[0]['deny_gid']) ? 1 : 0;
+               $private = ($user['allow_cid'] || $user['allow_gid'] || $user['deny_cid'] || $user['deny_gid']) ? 1 : 0;
 
-               $forum_mode = (($prvgroup) ? 2 : 1);
+               $forum_mode = ($prvgroup ? 2 : 1);
 
                $fields = ['wall' => true, 'origin' => true, 'forum_mode' => $forum_mode,
-                       'owner-name' => $c[0]['name'], 'owner-link' => $c[0]['url'], 'owner-avatar' => $c[0]['thumb'],
-                       'private' => $private, 'allow_cid' => $u[0]['allow_cid'], 'allow_gid' => $u[0]['allow_gid'],
-                       'deny_cid' => $u[0]['deny_cid'], 'deny_gid' => $u[0]['deny_gid']];
+                       'owner-name' => $self['name'], 'owner-link' => $self['url'], 'owner-avatar' => $self['thumb'],
+                       'private' => $private, 'allow_cid' => $user['allow_cid'], 'allow_gid' => $user['allow_gid'],
+                       'deny_cid' => $user['deny_cid'], 'deny_gid' => $user['deny_gid']];
                dba::update('item', $fields, ['id' => $item_id]);
 
                self::updateThread($item_id);
@@ -1317,14 +1308,14 @@ class Item extends BaseObject
                $datarray2 = $datarray;
                logger('remote-self start - Contact '.$contact['url'].' - '.$contact['remote_self'].' Item '.print_r($datarray, true), LOGGER_DEBUG);
                if ($contact['remote_self'] == 2) {
-                       $r = q("SELECT `id`,`url`,`name`,`thumb` FROM `contact` WHERE `uid` = %d AND `self`",
-                               intval($contact['uid']));
-                       if (DBM::is_result($r)) {
-                               $datarray['contact-id'] = $r[0]["id"];
+                       $self = dba::selectFirst('contact', ['id', 'name', 'url', 'thumb'],
+                                       ['uid' => $contact['uid'], 'self' => true]);
+                       if (DBM::is_result($self)) {
+                               $datarray['contact-id'] = $self["id"];
 
-                               $datarray['owner-name'] = $r[0]["name"];
-                               $datarray['owner-link'] = $r[0]["url"];
-                               $datarray['owner-avatar'] = $r[0]["thumb"];
+                               $datarray['owner-name'] = $self["name"];
+                               $datarray['owner-link'] = $self["url"];
+                               $datarray['owner-avatar'] = $self["thumb"];
 
                                $datarray['author-name']   = $datarray['owner-name'];
                                $datarray['author-link']   = $datarray['owner-link'];
@@ -1405,12 +1396,9 @@ class Item extends BaseObject
                                if ($x) {
                                        $res = substr($i, $x + 1);
                                        $i = substr($i, 0, $x);
-                                       $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` = %d AND `uid` = %d",
-                                               dbesc($i),
-                                               intval($res),
-                                               intval($uid)
-                                       );
-                                       if (DBM::is_result($r)) {
+                                       $fields = ['data', 'type', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid'];
+                                       $photo = dba::selectFirst('photo', $fields, ['resource-id' => $i, 'scale' => $res, 'uid' => $uid]);
+                                       if (DBM::is_result($photo)) {
                                                /*
                                                 * Check to see if we should replace this photo link with an embedded image
                                                 * 1. No need to do so if the photo is public
@@ -1420,21 +1408,21 @@ class Item extends BaseObject
                                                 *    permissions, regardless of order but first check to see if they're an exact
                                                 *    match to save some processing overhead.
                                                 */
-                                               if (self::hasPermissions($r[0])) {
+                                               if (self::hasPermissions($photo)) {
                                                        if ($cid) {
-                                                               $recips = self::enumeratePermissions($r[0]);
+                                                               $recips = self::enumeratePermissions($photo);
                                                                if (in_array($cid, $recips)) {
                                                                        $replace = true;
                                                                }
                                                        } elseif ($item) {
-                                                               if (self::samePermissions($item, $r[0])) {
+                                                               if (self::samePermissions($item, $photo)) {
                                                                        $replace = true;
                                                                }
                                                        }
                                                }
                                                if ($replace) {
-                                                       $data = $r[0]['data'];
-                                                       $type = $r[0]['type'];
+                                                       $data = $photo['data'];
+                                                       $type = $photo['type'];
 
                                                        // If a custom width and height were specified, apply before embedding
                                                        if (preg_match("/\[img\=([0-9]*)x([0-9]*)\]/is", substr($orig_body, $img_start, $img_st_close), $match)) {
@@ -1623,18 +1611,13 @@ class Item extends BaseObject
                }
        }
 
-       /// @TODO: This query seems to be really slow
        public static function firstPostDate($uid, $wall = false)
        {
-               $r = q("SELECT `id`, `created` FROM `item`
-                       WHERE `uid` = %d AND `wall` = %d AND `deleted` = 0 AND `visible` = 1 AND `moderated` = 0
-                       AND `id` = `parent`
-                       ORDER BY `created` ASC LIMIT 1",
-                       intval($uid),
-                       intval($wall ? 1 : 0)
-               );
-               if (DBM::is_result($r)) {
-                       return substr(DateTimeFormat::local($r[0]['created']),0,10);
+               $condition = ['uid' => $uid, 'wall' => $wall, 'deleted' => false, 'visible' => true, 'moderated' => false];
+               $params = ['order' => ['created' => false]];
+               $thread = dba::selectFirst('thread', ['created'], $condition, $params);
+               if (DBM::is_result($thread)) {
+                       return substr(DateTimeFormat::local($thread['created']), 0, 10);
                }
                return false;
        }
@@ -1749,6 +1732,7 @@ class Item extends BaseObject
                        $verbs = "'".dbesc($activity)."'";
                }
 
+               /// @todo This query is expected to be a performance eater due to the "OR" - it has to be changed totally
                $existing_like = q("SELECT `id`, `guid`, `verb` FROM `item`
                        WHERE `verb` IN ($verbs)
                        AND `deleted` = 0
@@ -1865,16 +1849,16 @@ EOT;
 
        private static function addThread($itemid, $onlyshadow = false)
        {
-               $items = q("SELECT `uid`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`,
-                               `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`,
-                               `deleted`, `origin`, `forum_mode`, `mention`, `network`, `author-id`, `owner-id`
-                       FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid));
+               $fields = ['uid', 'created', 'edited', 'commented', 'received', 'changed', 'wall', 'private', 'pubmail',
+                       'moderated', 'visible', 'spam', 'starred', 'bookmark', 'contact-id',
+                       'deleted', 'origin', 'forum_mode', 'mention', 'network', 'author-id', 'owner-id'];
+               $condition = ["`id` = ? AND (`parent` = ? OR `parent` = 0)", $itemid, $itemid];
+               $item = dba::selectFirst('item', $fields, $condition);
 
-               if (!$items) {
+               if (!DBM::is_result($item)) {
                        return;
                }
 
-               $item = $items[0];
                $item['iid'] = $itemid;
 
                if (!$onlyshadow) {
@@ -1886,15 +1870,16 @@ EOT;
 
        private static function updateThread($itemid, $setmention = false)
        {
-               $items = q("SELECT `uid`, `guid`, `title`, `body`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`,
-                               `deleted`, `origin`, `forum_mode`, `network`, `rendered-html`, `rendered-hash` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid));
+               $fields = ['uid', 'guid', 'title', 'body', 'created', 'edited', 'commented', 'received', 'changed',
+                       'wall', 'private', 'pubmail', 'moderated', 'visible', 'spam', 'starred', 'bookmark', 'contact-id',
+                       'deleted', 'origin', 'forum_mode', 'network', 'rendered-html', 'rendered-hash'];
+               $condition = ["`id` = ? AND (`parent` = ? OR `parent` = 0)", $itemid, $itemid];
 
-               if (!DBM::is_result($items)) {
+               $item = dba::selectFirst('item', $fields, $condition);
+               if (!DBM::is_result($item)) {
                        return;
                }
 
-               $item = $items[0];
-
                if ($setmention) {
                        $item["mention"] = 1;
                }
@@ -1920,11 +1905,9 @@ EOT;
                        return;
                }
 
-               $result = dba::update(
-                       'item',
-                       ['title' => $item['title'], 'body' => $item['body'], 'rendered-html' => $item['rendered-html'], 'rendered-hash' => $item['rendered-hash']],
-                       ['id' => $items['id']]
-               );
+               $fields = ['title' => $item['title'], 'body' => $item['body'],
+                       'rendered-html' => $item['rendered-html'], 'rendered-hash' => $item['rendered-hash']];
+               $result = dba::update('item', $fields, ['id' => $items['id']]);
 
                logger("Updating public shadow for post ".$items["id"]." - guid ".$item["guid"]." Result: ".print_r($result, true), LOGGER_DEBUG);
        }
@@ -1943,11 +1926,8 @@ EOT;
                logger("deleteThread: Deleted thread for item ".$itemid." - ".print_r($result, true), LOGGER_DEBUG);
 
                if ($itemuri != "") {
-                       $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND NOT `deleted` AND NOT (`uid` IN (%d, 0))",
-                                       dbesc($itemuri),
-                                       intval($item["uid"])
-                               );
-                       if (!DBM::is_result($r)) {
+                       $condition = ["`uri` = ? AND NOT `deleted` AND NOT (`uid` IN (?, 0))", $itemuri, $item["uid"]];
+                       if (!dba::exists('item', $condition)) {
                                dba::delete('item', ['uri' => $itemuri, 'uid' => 0]);
                                logger("deleteThread: Deleted shadow for item ".$itemuri, LOGGER_DEBUG);
                        }