From e5c7ce090299102f427bdf427f5347ef6c17d121 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 14 Oct 2016 05:45:32 +0000 Subject: [PATCH 01/21] Use "last-item" in the contact table instead of an expensive sql query --- include/dba.php | 36 ++++++++++++++++++ include/dbm.php | 4 ++ include/event.php | 4 +- include/items.php | 83 +++++++++++++++++++++++------------------ include/post_update.php | 44 +++++++++++++++++++++- mod/admin.php | 17 ++++----- mod/item.php | 2 + mod/nodeinfo.php | 14 +++---- 8 files changed, 148 insertions(+), 56 deletions(-) diff --git a/include/dba.php b/include/dba.php index 86a3762b4..2d96886dc 100644 --- a/include/dba.php +++ b/include/dba.php @@ -343,6 +343,42 @@ function q($sql) { }} +/** + * @brief Performs a query with "dirty reads" + * + * By doing dirty reads (reading uncommitted data) no locks are performed + * This function can be used to fetch data that doesn't need to be reliable. + * + * @param $args Query parameters (1 to N parameters of different types) + * @return array Query array + */ +function qu($sql) { + + global $db; + $args = func_get_args(); + unset($args[0]); + + if($db && $db->connected) { + $stmt = @vsprintf($sql,$args); // Disabled warnings + if($stmt === false) + logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG); + $db->q("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); + $retval = $db->q($stmt); + $db->q("COMMIT;"); + return $retval; + } + + /** + * + * This will happen occasionally trying to store the + * session data after abnormal program termination + * + */ + logger('dba: no database: ' . print_r($args,true)); + return false; + +} + /** * * Raw db query, no arguments diff --git a/include/dbm.php b/include/dbm.php index 72d309b22..812989072 100644 --- a/include/dbm.php +++ b/include/dbm.php @@ -43,6 +43,10 @@ class dbm { * @return Whether $array is a filled array */ public static function is_result($array) { + // It could be a return value from an update statement + if (is_bool($array)) + return $array; + return (is_array($array) && count($array) > 0); } } diff --git a/include/event.php b/include/event.php index a68e1c462..4937bd73f 100644 --- a/include/event.php +++ b/include/event.php @@ -502,7 +502,7 @@ function event_by_id($owner_uid = 0, $event_params, $sql_extra = '') { // query for the event by event id $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`, `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` - LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` + STRAIGHT_JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` WHERE `event`.`uid` = %d AND `event`.`id` = %d $sql_extra", intval($owner_uid), intval($event_params["event_id"]) @@ -535,7 +535,7 @@ function events_by_date($owner_uid = 0, $event_params, $sql_extra = '') { // query for the event by date $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`, `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` - LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` + STRAIGHT_JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` WHERE `event`.`uid` = %d AND event.ignore = %d AND ((`adjust` = 0 AND (`finish` >= '%s' OR (nofinish AND start >= '%s')) AND `start` <= '%s') OR (`adjust` = 1 AND (`finish` >= '%s' OR (nofinish AND start >= '%s')) AND `start` <= '%s')) diff --git a/include/items.php b/include/items.php index 5f0187ad9..aec51ba31 100644 --- a/include/items.php +++ b/include/items.php @@ -798,43 +798,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa $current_post = $r[0]['id']; logger('item_store: created item ' . $current_post); - // Set "success_update" and "last-item" to the date of the last time we heard from this contact - // This can be used to filter for inactive contacts. - // Only do this for public postings to avoid privacy problems, since poco data is public. - // Don't set this value if it isn't from the owner (could be an author that we don't know) - - $update = (!$arr['private'] AND (($arr["author-link"] === $arr["owner-link"]) OR ($arr["parent-uri"] === $arr["uri"]))); - - // Is it a forum? Then we don't care about the rules from above - if (!$update AND ($arr["network"] == NETWORK_DFRN) AND ($arr["parent-uri"] === $arr["uri"])) { - $isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`", - intval($arr['contact-id'])); - if ($isforum) - $update = true; - } - - if ($update) - q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", - dbesc($arr['received']), - dbesc($arr['received']), - intval($arr['contact-id']) - ); - - // Now do the same for the system wide contacts with uid=0 - if (!$arr['private']) { - q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", - dbesc($arr['received']), - dbesc($arr['received']), - intval($arr['owner-id']) - ); - - if ($arr['owner-id'] != $arr['author-id']) - q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", - dbesc($arr['received']), - dbesc($arr['received']), - intval($arr['author-id']) - ); - } + item_set_last_item($arr); } else { logger('item_store: could not locate created item'); return 0; @@ -931,6 +895,51 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa return $current_post; } +/** + * @brief Set "success_update" and "last-item" to the date of the last time we heard from this contact + * + * This can be used to filter for inactive contacts. + * Only do this for public postings to avoid privacy problems, since poco data is public. + * Don't set this value if it isn't from the owner (could be an author that we don't know) + * + * @param array $arr Contains the just posted item record + */ +function item_set_last_item($arr) { + + $update = (!$arr['private'] AND (($arr["author-link"] === $arr["owner-link"]) OR ($arr["parent-uri"] === $arr["uri"]))); + + // Is it a forum? Then we don't care about the rules from above + if (!$update AND ($arr["network"] == NETWORK_DFRN) AND ($arr["parent-uri"] === $arr["uri"])) { + $isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`", + intval($arr['contact-id'])); + if ($isforum) + $update = true; + } + + if ($update) + q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", + dbesc($arr['received']), + dbesc($arr['received']), + intval($arr['contact-id']) + ); + + // Now do the same for the system wide contacts with uid=0 + if (!$arr['private']) { + q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", + dbesc($arr['received']), + dbesc($arr['received']), + intval($arr['owner-id']) + ); + + if ($arr['owner-id'] != $arr['author-id']) + q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", + dbesc($arr['received']), + dbesc($arr['received']), + intval($arr['author-id']) + ); + } +} + function item_body_set_hashtags(&$item) { $tags = get_tags($item["body"]); diff --git a/include/post_update.php b/include/post_update.php index d45a51b5f..a2b8497b9 100644 --- a/include/post_update.php +++ b/include/post_update.php @@ -16,6 +16,9 @@ function post_update() { if (!post_update_1198()) return; + + if (!post_update_1206()) + return; } /** @@ -174,13 +177,18 @@ function post_update_1198() { } // Update the thread table from the item table - q("UPDATE `thread` INNER JOIN `item` ON `item`.`id`=`thread`.`iid` + $r = q("UPDATE `thread` INNER JOIN `item` ON `item`.`id`=`thread`.`iid` SET `thread`.`author-id` = `item`.`author-id`, `thread`.`owner-id` = `item`.`owner-id` WHERE `thread`.`author-id` = 0 AND `thread`.`owner-id` = 0 AND (`thread`.`uid` IN (SELECT `uid` from `user`) OR `thread`.`uid` = 0)"); logger("Updated threads", LOGGER_DEBUG); + if (dbm::is_result($r)) { + set_config("system", "post_update_version", 1198); + logger("Done", LOGGER_DEBUG); + return true; + } return false; } @@ -215,4 +223,38 @@ function post_update_1198() { logger("Updated items", LOGGER_DEBUG); return false; } + +/** + * @brief update the "last-item" field in the "self" contact + * + * This field avoids cost intensive calls in the admin panel and in "nodeinfo" + * + * @return bool "true" when the job is done + */ +function post_update_1206() { + // Was the script completed? + if (get_config("system", "post_update_version") >= 1206) + return true; + + logger("Start", LOGGER_DEBUG); + $r = q("SELECT `contact`.`id`, `contact`.`last-item`, + (SELECT MAX(`changed`) FROM `item` FORCE INDEX (`uid_wall_changed`) WHERE `wall` AND `uid` = `user`.`uid`) AS `lastitem_date` + FROM `user` + INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`"); + + if (!dbm::is_result($r)) + return false; + + foreach ($r AS $user) { + if (!empty($user["lastitem_date"]) AND ($user["lastitem_date"] > $user["last-item"])) + q("UPDATE `contact` SET `last-item` = '%s' WHERE `id` = %d", + dbesc($user["lastitem_date"]), + intval($user["id"])); + } + + set_config("system", "post_update_version", 1206); + logger("Done", LOGGER_DEBUG); + return true; +} + ?> diff --git a/mod/admin.php b/mod/admin.php index c9ff23e2d..644583adb 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -282,14 +282,14 @@ function admin_page_federation(&$a) { foreach ($platforms as $p) { // get a total count for the platform, the name and version of the // highest version and the protocol tpe - $c = q('SELECT COUNT(*) AS `total`, `platform`, `network`, `version` FROM `gserver` + $c = qu('SELECT COUNT(*) AS `total`, `platform`, `network`, `version` FROM `gserver` WHERE `platform` LIKE "%s" AND `last_contact` > `last_failure` AND `version` != "" ORDER BY `version` ASC;', $p); $total = $total + $c[0]['total']; // what versions for that platform do we know at all? // again only the active nodes - $v = q('SELECT COUNT(*) AS `total`, `version` FROM `gserver` + $v = qu('SELECT COUNT(*) AS `total`, `version` FROM `gserver` WHERE `last_contact` > `last_failure` AND `platform` LIKE "%s" AND `version` != "" GROUP BY `version` ORDER BY `version`;', $p); @@ -434,17 +434,17 @@ function admin_page_summary(&$a) { logger('accounts: '.print_r($accounts,true),LOGGER_DATA); - $r = q("SELECT COUNT(`id`) AS `count` FROM `register`"); + $r = qu("SELECT COUNT(`id`) AS `count` FROM `register`"); $pending = $r[0]['count']; - $r = q("SELECT COUNT(*) AS `total` FROM `deliverq` WHERE 1"); + $r = qu("SELECT COUNT(*) AS `total` FROM `deliverq` WHERE 1"); $deliverq = (($r) ? $r[0]['total'] : 0); - $r = q("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1"); + $r = qu("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1"); $queue = (($r) ? $r[0]['total'] : 0); if (get_config('system','worker')) { - $r = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE 1"); + $r = qu("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE 1"); $workerqueue = (($r) ? $r[0]['total'] : 0); } else { $workerqueue = 0; @@ -1271,7 +1271,7 @@ function admin_page_users(&$a){ /* get users */ - $total = q("SELECT COUNT(*) AS `total` FROM `user` WHERE 1"); + $total = qu("SELECT COUNT(*) AS `total` FROM `user` WHERE 1"); if(count($total)) { $a->set_pager_total($total[0]['total']); $a->set_pager_itemspage(100); @@ -1306,8 +1306,7 @@ function admin_page_users(&$a){ $sql_order = "`".str_replace('.','`.`',$order)."`"; $sql_order_direction = ($order_direction==="+")?"ASC":"DESC"; - $users = q("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, - (SELECT MAX(`changed`) FROM `item` FORCE INDEX (`uid_wall_changed`) WHERE `wall` AND `uid` = `user`.`uid`) AS `lastitem_date` + $users = qu("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date` FROM `user` INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` WHERE `user`.`verified` diff --git a/mod/item.php b/mod/item.php index e9056d08c..adc46f120 100644 --- a/mod/item.php +++ b/mod/item.php @@ -875,6 +875,8 @@ function item_post(&$a) { $datarray["id"] = $post_id; + item_set_last_item($datarray); + // update filetags in pconfig file_tag_update_pconfig($uid,$categories_old,$categories_new,'category'); diff --git a/mod/nodeinfo.php b/mod/nodeinfo.php index 585659e5c..0d1328029 100644 --- a/mod/nodeinfo.php +++ b/mod/nodeinfo.php @@ -185,10 +185,10 @@ function nodeinfo_cron() { } logger("cron_start"); - $users = q("SELECT `user`.`uid`, `user`.`login_date`, - (SELECT MAX(`changed`) FROM `item` FORCE INDEX (`uid_wall_changed`) WHERE `wall` AND `uid` = `user`.`uid`) AS `lastitem_date` + $users = qu("SELECT `user`.`uid`, `user`.`login_date`, `contact`.`last-item` FROM `user` INNER JOIN `profile` ON `profile`.`uid` = `user`.`uid` AND `profile`.`is-default` + INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` WHERE (`profile`.`publish` OR `profile`.`net-publish`) AND `user`.`verified` AND NOT `user`.`blocked` AND NOT `user`.`account_removed` AND NOT `user`.`account_expired`"); @@ -202,11 +202,11 @@ function nodeinfo_cron() { foreach ($users AS $user) { if ((strtotime($user['login_date']) > $halfyear) OR - (strtotime($user['lastitem_date']) > $halfyear)) + (strtotime($user['last-item']) > $halfyear)) ++$active_users_halfyear; if ((strtotime($user['login_date']) > $month) OR - (strtotime($user['lastitem_date']) > $month)) + (strtotime($user['last-item']) > $month)) ++$active_users_monthly; } @@ -217,8 +217,8 @@ function nodeinfo_cron() { set_config('nodeinfo','active_users_monthly', $active_users_monthly); } - //$posts = q("SELECT COUNT(*) AS local_posts FROM `item` WHERE `wall` AND `uid` != 0 AND `id` = `parent` AND left(body, 6) != '[share'"); - $posts = q("SELECT COUNT(*) AS `local_posts` FROM `item` + //$posts = qu("SELECT COUNT(*) AS local_posts FROM `item` WHERE `wall` AND `uid` != 0 AND `id` = `parent` AND left(body, 6) != '[share'"); + $posts = qu("SELECT COUNT(*) AS `local_posts` FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` WHERE `contact`.`self` and `item`.`id` = `item`.`parent` AND left(body, 6) != '[share' AND `item`.`network` IN ('%s', '%s', '%s')", dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DFRN)); @@ -232,7 +232,7 @@ function nodeinfo_cron() { logger("local_posts: ".$local_posts, LOGGER_DEBUG); - $posts = q("SELECT COUNT(*) AS `local_comments` FROM `item` + $posts = qu("SELECT COUNT(*) AS `local_comments` FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` WHERE `contact`.`self` and `item`.`id` != `item`.`parent` AND `item`.`network` IN ('%s', '%s', '%s')", dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DFRN)); From 3e5cf5290e08d3e5b8bdae5d7dcf713454466206 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 17 Oct 2016 18:38:51 +0000 Subject: [PATCH 02/21] Improved queries, more uncommitted queries --- include/Contact.php | 39 ++++++++++++++++++++++++++------------- include/Core/Config.php | 28 +++++++++++++++++++++++----- include/Core/PConfig.php | 28 +++++++++++++++++++++++----- include/dba.php | 2 +- include/dbstructure.php | 2 +- include/items.php | 38 +++++++++++++++++++++++++------------- include/poller.php | 7 ++++++- mod/community.php | 6 +++--- mod/display.php | 34 +++++++++++++++++----------------- mod/network.php | 24 ++++++++++++------------ mod/photo.php | 6 +++--- mod/proxy.php | 2 +- 12 files changed, 141 insertions(+), 75 deletions(-) diff --git a/include/Contact.php b/include/Contact.php index 6daba3384..ab74a2f86 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -481,9 +481,9 @@ function get_contact($url, $uid = 0) { if ($contactid == 0) { q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`, - `batch`, `request`, `confirm`, `poco`, + `batch`, `request`, `confirm`, `poco`, `name-date`, `uri-date`, `writable`, `blocked`, `readonly`, `pending`) - VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', 1, 0, 0, 0)", + VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', 1, 0, 0, 0)", intval($uid), dbesc(datetime_convert()), dbesc($data["url"]), @@ -502,7 +502,9 @@ function get_contact($url, $uid = 0) { dbesc($data["batch"]), dbesc($data["request"]), dbesc($data["confirm"]), - dbesc($data["poco"]) + dbesc($data["poco"]), + dbesc(datetime_convert()), + dbesc(datetime_convert()) ); $contact = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2", @@ -533,16 +535,27 @@ function get_contact($url, $uid = 0) { update_contact_avatar($data["photo"],$uid,$contactid); - q("UPDATE `contact` SET `addr` = '%s', `alias` = '%s', `name` = '%s', `nick` = '%s', - `name-date` = '%s', `uri-date` = '%s' WHERE `id` = %d", - dbesc($data["addr"]), - dbesc($data["alias"]), - dbesc($data["name"]), - dbesc($data["nick"]), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($contactid) - ); + $r = q("SELECT `addr`, `alias`, `name`, `nick` FROM `contact` WHERE `id` = %d", intval($contactid)); + + // This condition should always be true + if (!dbm::is_result($r)) + return $contactid; + + // Only update if there had something been changed + if (($data["addr"] != $r[0]["addr"]) OR + ($data["alias"] != $r[0]["alias"]) OR + ($data["name"] != $r[0]["name"]) OR + ($data["nick"] != $r[0]["nick"])) + q("UPDATE `contact` SET `addr` = '%s', `alias` = '%s', `name` = '%s', `nick` = '%s', + `name-date` = '%s', `uri-date` = '%s' WHERE `id` = %d", + dbesc($data["addr"]), + dbesc($data["alias"]), + dbesc($data["name"]), + dbesc($data["nick"]), + dbesc(datetime_convert()), + dbesc(datetime_convert()), + intval($contactid) + ); return $contactid; } diff --git a/include/Core/Config.php b/include/Core/Config.php index a93f18814..d76a7c2b2 100644 --- a/include/Core/Config.php +++ b/include/Core/Config.php @@ -132,15 +132,33 @@ class Config { $dbvalue = (is_array($value)?serialize($value):$value); $dbvalue = (is_bool($dbvalue) ? intval($dbvalue) : $dbvalue); - $ret = q("INSERT INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) -ON DUPLICATE KEY UPDATE `v` = '%s'", + // The "INSERT" command is very cost intense. It saves performance to do it this way. + $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' ORDER BY `id` DESC LIMIT 1", dbesc($family), - dbesc($key), - dbesc($dbvalue), - dbesc($dbvalue) + dbesc($key) ); + + // It would be better to use the dbm class. + // But there is an autoloader issue that I don't know how to fix: + // "Class 'Friendica\Core\dbm' not found" + //if (!dbm::is_result($ret)) + if (!$ret) + $ret = q("INSERT INTO `config` (`cat`, `k`, `v`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'", + dbesc($family), + dbesc($key), + dbesc($dbvalue), + dbesc($dbvalue) + ); + elseif ($ret[0]['v'] != $dbvalue) + $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s'", + dbesc($dbvalue), + dbesc($family), + dbesc($key) + ); + if($ret) return $value; + return $ret; } diff --git a/include/Core/PConfig.php b/include/Core/PConfig.php index de8994d1d..70f83adcb 100644 --- a/include/Core/PConfig.php +++ b/include/Core/PConfig.php @@ -128,14 +128,32 @@ class PConfig { $a->config[$uid][$family][$key] = $value; - $ret = q("INSERT INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) -ON DUPLICATE KEY UPDATE `v` = '%s'", + // The "INSERT" command is very cost intense. It saves performance to do it this way. + $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' ORDER BY `id` DESC LIMIT 1", intval($uid), dbesc($family), - dbesc($key), - dbesc($dbvalue), - dbesc($dbvalue) + dbesc($key) ); + + // It would be better to use the dbm class. + // My lacking knowdledge in autoloaders prohibits this. + // if (!dbm::is_result($ret)) + if (!$ret) + $ret = q("INSERT INTO `pconfig` (`uid`, `cat`, `k`, `v`) VALUES (%d, '%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'", + intval($uid), + dbesc($family), + dbesc($key), + dbesc($dbvalue), + dbesc($dbvalue) + ); + elseif ($ret[0]['v'] != $dbvalue) + $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s'", + dbesc($dbvalue), + intval($uid), + dbesc($family), + dbesc($key) + ); + if($ret) return $value; return $ret; diff --git a/include/dba.php b/include/dba.php index 2d96886dc..a9ed9e5a0 100644 --- a/include/dba.php +++ b/include/dba.php @@ -362,7 +362,7 @@ function qu($sql) { $stmt = @vsprintf($sql,$args); // Disabled warnings if($stmt === false) logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG); - $db->q("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); + $db->q("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); $retval = $db->q($stmt); $db->q("COMMIT;"); return $retval; diff --git a/include/dbstructure.php b/include/dbstructure.php index fdf09d90d..2aefdf45c 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -1120,7 +1120,7 @@ function db_definition($charset) { ), "indexes" => array( "PRIMARY" => array("id"), - "uid" => array("uid"), + "uid_contactid" => array("uid", "contact-id"), "resource-id" => array("resource-id"), "guid" => array("guid"), ) diff --git a/include/items.php b/include/items.php index aec51ba31..0741e1b3d 100644 --- a/include/items.php +++ b/include/items.php @@ -705,22 +705,34 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa dbesc(NETWORK_DFRN), intval($arr['uid']) ); - if($r && count($r)) { - logger('duplicated item with the same uri found. ' . print_r($arr,true)); + if (dbm::is_result($r)) { + logger('duplicated item with the same uri found. '.print_r($arr,true)); return 0; } - // Check for an existing post with the same content. There seems to be a problem with OStatus. - $r = q("SELECT `id` FROM `item` WHERE `body` = '%s' AND `network` = '%s' AND `created` = '%s' AND `contact-id` = %d AND `uid` = %d LIMIT 1", - dbesc($arr['body']), - dbesc($arr['network']), - dbesc($arr['created']), - intval($arr['contact-id']), - intval($arr['uid']) - ); - if($r && count($r)) { - logger('duplicated item with the same body found. ' . print_r($arr,true)); - return 0; + // On Friendica and Diaspora the GUID is unique + if (in_array($arr['network'], array(NETWORK_DFRN, NETWORK_DIASPORA))) { + $r = q("SELECT `id` FROM `item` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1", + dbesc($arr['guid']), + intval($arr['uid']) + ); + if (dbm::is_result($r)) { + logger('duplicated item with the same guid found. '.print_r($arr,true)); + return 0; + } + } else { + // Check for an existing post with the same content. There seems to be a problem with OStatus. + $r = q("SELECT `id` FROM `item` WHERE `body` = '%s' AND `network` = '%s' AND `created` = '%s' AND `contact-id` = %d AND `uid` = %d LIMIT 1", + dbesc($arr['body']), + dbesc($arr['network']), + dbesc($arr['created']), + intval($arr['contact-id']), + intval($arr['uid']) + ); + if (dbm::is_result($r)) { + logger('duplicated item with the same body found. '.print_r($arr,true)); + return 0; + } } // Is this item available in the global items (with uid=0)? diff --git a/include/poller.php b/include/poller.php index c1761e302..bbec43ae7 100644 --- a/include/poller.php +++ b/include/poller.php @@ -91,11 +91,16 @@ function poller_run(&$argv, &$argc){ if (poller_too_much_workers()) return; - q("UPDATE `workerqueue` SET `executed` = '%s', `pid` = %d WHERE `id` = %d AND `executed` = '0000-00-00 00:00:00'", + $upd = q("UPDATE `workerqueue` SET `executed` = '%s', `pid` = %d WHERE `id` = %d AND `pid` = 0", dbesc(datetime_convert()), intval($mypid), intval($r[0]["id"])); + if (!$upd) { + logger("Couldn't update queue entry ".$r[0]["id"]." - skip this execution", LOGGER_DEBUG); + continue; + } + // Assure that there are no tasks executed twice $id = q("SELECT `pid`, `executed` FROM `workerqueue` WHERE `id` = %d", intval($r[0]["id"])); if (!$id) { diff --git a/mod/community.php b/mod/community.php index 06a96c740..c8d1e0c9d 100644 --- a/mod/community.php +++ b/mod/community.php @@ -49,7 +49,7 @@ function community_content(&$a, $update = 0) { // OR your own posts if you are a logged in member if(get_config('system', 'old_pager')) { - $r = q("SELECT COUNT(distinct(`item`.`uri`)) AS `total` + $r = qu("SELECT COUNT(distinct(`item`.`uri`)) AS `total` FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 INNER JOIN `user` ON `user`.`uid` = `item`.`uid` AND `user`.`hidewall` = 0 @@ -120,7 +120,7 @@ function community_getitems($start, $itemspage) { if (get_config('system','community_page_style') == CP_GLOBAL_COMMUNITY) return(community_getpublicitems($start, $itemspage)); - $r = q("SELECT %s + $r = qu("SELECT %s FROM `thread` FORCE INDEX (`wall_private_received`) INNER JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall` INNER JOIN `item` ON `item`.`id` = `thread`.`iid` @@ -140,7 +140,7 @@ function community_getitems($start, $itemspage) { function community_getpublicitems($start, $itemspage) { - $r = q("SELECT %s + $r = qu("SELECT %s FROM `thread` INNER JOIN `item` ON `item`.`id` = `thread`.`iid` %s WHERE `thread`.`uid` = 0 diff --git a/mod/display.php b/mod/display.php index f879a91ae..01a66c93b 100644 --- a/mod/display.php +++ b/mod/display.php @@ -16,7 +16,7 @@ function display_init(&$a) { // Does the local user have this item? if (local_user()) { - $r = q("SELECT `id`, `parent`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` + $r = qu("SELECT `id`, `parent`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `guid` = '%s' AND `uid` = %d", dbesc($a->argv[1]), local_user()); if (count($r)) { @@ -27,7 +27,7 @@ function display_init(&$a) { // Or is it anywhere on the server? if ($nick == "") { - $r = q("SELECT `user`.`nickname`, `item`.`id`, `item`.`parent`, `item`.`author-name`, + $r = qu("SELECT `user`.`nickname`, `item`.`id`, `item`.`parent`, `item`.`author-name`, `item`.`author-link`, `item`.`author-avatar`, `item`.`network`, `item`.`uid`, `item`.`owner-link`, `item`.`body` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` @@ -44,7 +44,7 @@ function display_init(&$a) { // Is it an item with uid=0? if ($nick == "") { - $r = q("SELECT `item`.`id`, `item`.`parent`, `item`.`author-name`, `item`.`author-link`, + $r = qu("SELECT `item`.`id`, `item`.`parent`, `item`.`author-name`, `item`.`author-link`, `item`.`author-avatar`, `item`.`network`, `item`.`uid`, `item`.`owner-link`, `item`.`body` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' @@ -55,7 +55,7 @@ function display_init(&$a) { } if (count($r)) { if ($r[0]["id"] != $r[0]["parent"]) - $r = q("SELECT `id`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` + $r = qu("SELECT `id`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `id` = %d", $r[0]["parent"]); @@ -65,7 +65,7 @@ function display_init(&$a) { // We really should change this need for the future since it scales very bad. $contactid = get_contact($r[0]['owner-link'], local_user()); if ($contactid) { - $items = q("SELECT * FROM `item` WHERE `parent` = %d ORDER BY `id`", intval($r[0]["id"])); + $items = qu("SELECT * FROM `item` WHERE `parent` = %d ORDER BY `id`", intval($r[0]["id"])); foreach ($items AS $item) { $itemcontactid = get_contact($item['owner-link'], local_user()); if (!$itemcontactid) @@ -87,7 +87,7 @@ function display_init(&$a) { $nickname = str_replace(normalise_link($a->get_baseurl())."/profile/", "", normalise_link($profiledata["url"])); if (($nickname != $a->user["nickname"])) { - $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile` + $r = qu("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile` INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` AND `contact`.`self` LIMIT 1", dbesc($nickname) @@ -228,7 +228,7 @@ function display_content(&$a, $update = 0) { $nick = ""; if (local_user()) { - $r = q("SELECT `id` FROM `item` + $r = qu("SELECT `id` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `guid` = '%s' AND `uid` = %d", dbesc($a->argv[1]), local_user()); if (count($r)) { @@ -238,7 +238,7 @@ function display_content(&$a, $update = 0) { } if ($nick == "") { - $r = q("SELECT `user`.`nickname`, `item`.`id` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid` + $r = qu("SELECT `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` = '' @@ -251,7 +251,7 @@ function display_content(&$a, $update = 0) { } } if ($nick == "") { - $r = q("SELECT `item`.`id` FROM `item` + $r = qu("SELECT `item`.`id` FROM `item` 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` = '' @@ -266,7 +266,7 @@ function display_content(&$a, $update = 0) { } if ($item_id AND !is_numeric($item_id)) { - $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", + $r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($item_id), intval($a->profile['uid'])); if ($r) $item_id = $r[0]["id"]; @@ -299,7 +299,7 @@ function display_content(&$a, $update = 0) { if($contact_id) { $groups = init_groups_visitor($contact_id); - $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", + $r = qu("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($contact_id), intval($a->profile['uid']) ); @@ -316,7 +316,7 @@ function display_content(&$a, $update = 0) { } } - $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1", + $r = qu("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1", intval($a->profile['uid']) ); if(count($r)) @@ -351,7 +351,7 @@ function display_content(&$a, $update = 0) { if($update) { - $r = q("SELECT `id` FROM `item` WHERE `item`.`uid` = %d + $r = qu("SELECT `id` FROM `item` WHERE `item`.`uid` = %d AND `item`.`parent` = (SELECT `parent` FROM `item` WHERE `id` = %d) $sql_extra AND `unseen`", intval($a->profile['uid']), @@ -362,7 +362,7 @@ function display_content(&$a, $update = 0) { return ''; } - $r = q(item_query()." AND `item`.`uid` = %d + $r = qu(item_query()." AND `item`.`uid` = %d AND `item`.`parent` = (SELECT `parent` FROM `item` WHERE `id` = %d) $sql_extra ORDER BY `parent` DESC, `gravity` ASC, `id` ASC", @@ -373,7 +373,7 @@ function display_content(&$a, $update = 0) { if(!$r && local_user()) { // Check if this is another person's link to a post that we have - $r = q("SELECT `item`.uri FROM `item` + $r = qu("SELECT `item`.uri FROM `item` WHERE (`item`.`id` = %d OR `item`.`uri` = '%s') LIMIT 1", intval($item_id), @@ -382,7 +382,7 @@ function display_content(&$a, $update = 0) { if($r) { $item_uri = $r[0]['uri']; - $r = q(item_query()." AND `item`.`uid` = %d + $r = qu(item_query()." AND `item`.`uid` = %d AND `item`.`parent` = (SELECT `parent` FROM `item` WHERE `uri` = '%s' AND uid = %d) ORDER BY `parent` DESC, `gravity` ASC, `id` ASC ", intval(local_user()), @@ -462,7 +462,7 @@ function display_content(&$a, $update = 0) { return $o; } - $r = q("SELECT `id`,`deleted` FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1", + $r = qu("SELECT `id`,`deleted` FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1", dbesc($item_id), dbesc($item_id) ); diff --git a/mod/network.php b/mod/network.php index f4af489db..559bad0a3 100644 --- a/mod/network.php +++ b/mod/network.php @@ -122,7 +122,7 @@ function network_init(&$a) { $search = ((x($_GET,'search')) ? escape_tags($_GET['search']) : ''); if(x($_GET,'save')) { - $r = q("SELECT * FROM `search` WHERE `uid` = %d AND `term` = '%s' LIMIT 1", + $r = qu("SELECT * FROM `search` WHERE `uid` = %d AND `term` = '%s' LIMIT 1", intval(local_user()), dbesc($search) ); @@ -176,7 +176,7 @@ function saved_searches($search) { $o = ''; - $r = q("SELECT `id`,`term` FROM `search` WHERE `uid` = %d", + $r = qu("SELECT `id`,`term` FROM `search` WHERE `uid` = %d", intval(local_user()) ); @@ -375,7 +375,7 @@ function network_content(&$a, $update = 0) { $def_acl = array('allow_cid' => '<' . intval($cid) . '>'); if($nets) { - $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND network = '%s' AND `self` = 0", + $r = qu("SELECT `id` FROM `contact` WHERE `uid` = %d AND network = '%s' AND `self` = 0", intval(local_user()), dbesc($nets) ); @@ -408,7 +408,7 @@ function network_content(&$a, $update = 0) { if ($cid) { // If $cid belongs to a communitity forum or a privat goup,.add a mention to the status editor - $contact = q("SELECT `nick` FROM `contact` WHERE `id` = %d AND `uid` = %d AND (`forum` OR `prv`) ", + $contact = qu("SELECT `nick` FROM `contact` WHERE `id` = %d AND `uid` = %d AND (`forum` OR `prv`) ", intval($cid), intval(local_user()) ); @@ -458,7 +458,7 @@ function network_content(&$a, $update = 0) { $sql_nets = (($nets) ? sprintf(" and $sql_table.`network` = '%s' ", dbesc($nets)) : ''); if($group) { - $r = q("SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1", + $r = qu("SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($group), intval($_SESSION['uid']) ); @@ -479,7 +479,7 @@ function network_content(&$a, $update = 0) { $contact_str = implode(',',$contacts); $gcontact_str = implode(',',$gcontacts); - $self = q("SELECT `contact`.`id`, `gcontact`.`id` AS `gid` FROM `contact` + $self = qu("SELECT `contact`.`id`, `gcontact`.`id` AS `gid` FROM `contact` INNER JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl` WHERE `uid` = %d AND `self`", intval($_SESSION['uid'])); if (count($self)) { @@ -502,7 +502,7 @@ function network_content(&$a, $update = 0) { } elseif($cid) { - $r = q("SELECT `id`,`name`,`network`,`writable`,`nurl`, `forum`, `prv`, `contact-type`, `addr`, `thumb`, `location` FROM `contact` WHERE `id` = %d + $r = qu("SELECT `id`,`name`,`network`,`writable`,`nurl`, `forum`, `prv`, `contact-type`, `addr`, `thumb`, `location` FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0 LIMIT 1", intval($cid) ); @@ -600,7 +600,7 @@ function network_content(&$a, $update = 0) { } else { if(get_config('system', 'old_pager')) { - $r = q("SELECT COUNT(*) AS `total` + $r = qu("SELECT COUNT(*) AS `total` FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = $sql_table.`contact-id` AND NOT `contact`.`blocked` AND NOT `contact`.`pending` WHERE $sql_table.`uid` = %d AND $sql_table.`visible` AND NOT $sql_table.`deleted` @@ -640,7 +640,7 @@ function network_content(&$a, $update = 0) { $sql_order = "`item`.`received`"; // "New Item View" - show all items unthreaded in reverse created date order - $items = q("SELECT %s FROM $sql_table $sql_post_table %s + $items = qu("SELECT %s FROM $sql_table $sql_post_table %s WHERE %s AND `item`.`uid` = %d $simple_update $sql_extra $sql_nets @@ -678,7 +678,7 @@ function network_content(&$a, $update = 0) { else $sql_extra4 = ""; - $r = q("SELECT `item`.`parent` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` + $r = qu("SELECT `item`.`parent` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND NOT `contact`.`blocked` AND NOT `contact`.`pending` WHERE `item`.`uid` = %d AND `item`.`visible` AND NOT `item`.`deleted` $sql_extra4 @@ -688,7 +688,7 @@ function network_content(&$a, $update = 0) { intval(local_user()) ); } else { - $r = q("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` + $r = qu("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid` FROM $sql_table $sql_post_table STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` AND NOT `contact`.`blocked` AND NOT `contact`.`pending` WHERE `thread`.`uid` = %d AND `thread`.`visible` AND NOT `thread`.`deleted` @@ -722,7 +722,7 @@ function network_content(&$a, $update = 0) { $items = array(); foreach ($parents_arr AS $parents) { - $thread_items = q(item_query()." AND `item`.`uid` = %d + $thread_items = qu(item_query()." AND `item`.`uid` = %d AND `item`.`parent` = %d ORDER BY `item`.`commented` DESC LIMIT %d", intval(local_user()), diff --git a/mod/photo.php b/mod/photo.php index 4166b4d53..0d60282d5 100644 --- a/mod/photo.php +++ b/mod/photo.php @@ -72,7 +72,7 @@ function photo_init(&$a) { $uid = str_replace(array('.jpg','.png'),array('',''), $person); - $r = q("SELECT * FROM `photo` WHERE `scale` = %d AND `uid` = %d AND `profile` = 1 LIMIT 1", + $r = qu("SELECT * FROM `photo` WHERE `scale` = %d AND `uid` = %d AND `profile` = 1 LIMIT 1", intval($resolution), intval($uid) ); @@ -102,7 +102,7 @@ function photo_init(&$a) { } // check if the photo exists and get the owner of the photo - $r = q("SELECT `uid` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", + $r = qu("SELECT `uid` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", dbesc($photo), intval($resolution) ); @@ -112,7 +112,7 @@ function photo_init(&$a) { // Now we'll see if we can access the photo - $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1", + $r = qu("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1", dbesc($photo), intval($resolution) ); diff --git a/mod/proxy.php b/mod/proxy.php index abcaf4912..a4fbdd244 100644 --- a/mod/proxy.php +++ b/mod/proxy.php @@ -135,7 +135,7 @@ function proxy_init() { $valid = true; if (!$direct_cache AND ($cachefile == "")) { - $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash); + $r = qu("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash); if (count($r)) { $img_str = $r[0]['data']; $mime = $r[0]["desc"]; From e2d35bd8519e34c931fb007be3ec8c16821366b6 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 17 Oct 2016 20:09:48 +0000 Subject: [PATCH 03/21] New database version --- boot.php | 2 +- update.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boot.php b/boot.php index f39fb0369..aa5574e3c 100644 --- a/boot.php +++ b/boot.php @@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_CODENAME', 'Asparagus'); define ( 'FRIENDICA_VERSION', '3.5.1-dev' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); -define ( 'DB_UPDATE_VERSION', 1206 ); +define ( 'DB_UPDATE_VERSION', 1207 ); /** * @brief Constant with a HTML line break. diff --git a/update.php b/update.php index 756091113..5eab9c220 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ Date: Wed, 19 Oct 2016 21:06:37 +0000 Subject: [PATCH 04/21] Remove orphaned data --- include/cron.php | 6 ++++-- include/dbclean.php | 38 ++++++++++++++++++++++++++++++++++++++ mod/display.php | 4 +--- 3 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 include/dbclean.php diff --git a/include/cron.php b/include/cron.php index 0669f24a1..6913588db 100644 --- a/include/cron.php +++ b/include/cron.php @@ -125,6 +125,8 @@ function cron_run(&$argv, &$argc){ set_config('system','last_expire_day',$d2); proc_run(PRIORITY_LOW,'include/expire.php'); + + proc_run(PRIORITY_LOW,'include/dbclean.php'); } // Clear cache entries @@ -355,10 +357,10 @@ function cron_clear_cache(&$a) { } // Delete the cached OEmbed entries that are older than one year - q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 1 YEAR"); + q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 3 MONTH"); // Delete the cached "parse_url" entries that are older than one year - q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 1 YEAR"); + q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 3 MONTH"); // Maximum table size in megabyte $max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000; diff --git a/include/dbclean.php b/include/dbclean.php new file mode 100644 index 000000000..8ec9c1dc4 --- /dev/null +++ b/include/dbclean.php @@ -0,0 +1,38 @@ + diff --git a/mod/display.php b/mod/display.php index 01a66c93b..b21c2810c 100644 --- a/mod/display.php +++ b/mod/display.php @@ -27,7 +27,7 @@ function display_init(&$a) { // Or is it anywhere on the server? if ($nick == "") { - $r = qu("SELECT `user`.`nickname`, `item`.`id`, `item`.`parent`, `item`.`author-name`, + $r = qu("SELECT STRAIGHT_JOIN `user`.`nickname`, `item`.`id`, `item`.`parent`, `item`.`author-name`, `item`.`author-link`, `item`.`author-avatar`, `item`.`network`, `item`.`uid`, `item`.`owner-link`, `item`.`body` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` @@ -35,7 +35,6 @@ function display_init(&$a) { AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND NOT `item`.`private` AND NOT `user`.`hidewall` AND `item`.`guid` = '%s'", dbesc($a->argv[1])); - // AND NOT `item`.`private` AND `item`.`wall` if (count($r)) { $nick = $r[0]["nickname"]; $itemuid = $r[0]["uid"]; @@ -51,7 +50,6 @@ function display_init(&$a) { AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND NOT `item`.`private` AND `item`.`uid` = 0 AND `item`.`guid` = '%s'", dbesc($a->argv[1])); - // AND NOT `item`.`private` AND `item`.`wall` } if (count($r)) { if ($r[0]["id"] != $r[0]["parent"]) From fd2d8cc180dba428170b51d46bd9d1d301e101f9 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 20 Oct 2016 22:05:21 +0000 Subject: [PATCH 05/21] Orphans are removed without giant lock problems --- include/dba.php | 19 +++++++++++++++++++ include/dbclean.php | 36 +++++++++++++++++++++++++++++++----- include/dbstructure.php | 1 + mod/display.php | 2 +- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/include/dba.php b/include/dba.php index a9ed9e5a0..c7b598f2d 100644 --- a/include/dba.php +++ b/include/dba.php @@ -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 diff --git a/include/dbclean.php b/include/dbclean.php index 8ec9c1dc4..860d0f220 100644 --- a/include/dbclean.php +++ b/include/dbclean.php @@ -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"); } diff --git a/include/dbstructure.php b/include/dbstructure.php index 2aefdf45c..f3c894740 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -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"), ) diff --git a/mod/display.php b/mod/display.php index b21c2810c..0e0e7b303 100644 --- a/mod/display.php +++ b/mod/display.php @@ -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` = '' From 501c45def5036b28c0eacd695ba56ccef1ebd844 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 21 Oct 2016 18:25:21 +0000 Subject: [PATCH 06/21] Some more improved queries --- include/api.php | 4 +--- include/dbstructure.php | 2 ++ include/dfrn.php | 4 ++-- include/items.php | 11 +++++++++-- include/onepoll.php | 2 +- include/ostatus.php | 28 ++++++++++++++++++++++++---- mod/display.php | 6 +++--- mod/item.php | 6 ++++++ mod/photos.php | 4 ++-- 9 files changed, 50 insertions(+), 17 deletions(-) diff --git a/include/api.php b/include/api.php index b93f8cf72..af7c2ca52 100644 --- a/include/api.php +++ b/include/api.php @@ -565,9 +565,7 @@ //AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''", // count public wall messages - $r = q("SELECT count(*) as `count` FROM `item` - WHERE `uid` = %d - AND `type`='wall'", + $r = q("SELECT COUNT(*) as `count` FROM `item` WHERE `uid` = %d AND wall", intval($uinfo[0]['uid']) ); $countitms = $r[0]['count']; diff --git a/include/dbstructure.php b/include/dbstructure.php index f3c894740..b28e072f9 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -1121,6 +1121,7 @@ function db_definition($charset) { "indexes" => array( "PRIMARY" => array("id"), "uid_contactid" => array("uid", "contact-id"), + "uid_profile" => array("uid", "profile"), "uid_album_created" => array("uid", "album", "created"), "resource-id" => array("resource-id"), "guid" => array("guid"), @@ -1356,6 +1357,7 @@ function db_definition($charset) { "type_term" => array("type","term"), "uid_otype_type_term_global_created" => array("uid","otype","type","term","global","created"), "otype_type_term_tid" => array("otype","type","term","tid"), + "uid_otype_type_url" => array("uid","otype","type","url"), "guid" => array("guid"), ) ); diff --git a/include/dfrn.php b/include/dfrn.php index 3b06932d8..061991c4c 100644 --- a/include/dfrn.php +++ b/include/dfrn.php @@ -193,13 +193,13 @@ class dfrn { // AND ( `item`.`edited` > '%s' OR `item`.`changed` > '%s' ) // dbesc($check_date), - $r = q("SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id`, + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`, `contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, `sign`.`signed_text`, `sign`.`signature`, `sign`.`signer` FROM `item` $sql_post_table - INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` + STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `item`.`uid` = %d AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`parent` != 0 diff --git a/include/items.php b/include/items.php index 0741e1b3d..b969a75d6 100644 --- a/include/items.php +++ b/include/items.php @@ -779,6 +779,9 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa logger('item_store: ' . print_r($arr,true), LOGGER_DATA); + q("COMMIT;"); + q("START TRANSACTION;"); + $r = dbq("INSERT INTO `item` (`" . implode("`, `", array_keys($arr)) . "`) VALUES ('" @@ -804,6 +807,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa dbesc($arr['network']), intval($r[0]["id"]) ); + q("COMMIT"); return 0; } elseif(count($r)) { @@ -813,6 +817,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa item_set_last_item($arr); } else { logger('item_store: could not locate created item'); + q("COMMIT"); return 0; } @@ -891,10 +896,12 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa create_tags_from_item($current_post); create_files_from_item($current_post); + q("COMMIT"); + // Only check for notifications on start posts - if ($arr['parent-uri'] === $arr['uri']) + if ($arr['parent-uri'] === $arr['uri']) { add_thread($current_post); - else { + } else { update_thread($parent_id); add_shadow_entry($arr); } diff --git a/include/onepoll.php b/include/onepoll.php index e77937272..951b87043 100644 --- a/include/onepoll.php +++ b/include/onepoll.php @@ -443,7 +443,7 @@ function onepoll_run(&$argv, &$argc){ $refs_arr[$x] = "'" . msgid2iri(str_replace(array('<','>',' '),array('','',''),dbesc($refs_arr[$x]))) . "'"; } $qstr = implode(',',$refs_arr); - $r = q("SELECT `uri` , `parent-uri` FROM `item` WHERE `uri` IN ( $qstr ) AND `uid` = %d LIMIT 1", + $r = q("SELECT `uri` , `parent-uri` FROM `item` USE INDEX (`uid_uri`) WHERE `uri` IN ($qstr) AND `uid` = %d LIMIT 1", intval($importer_uid) ); if(count($r)) diff --git a/include/ostatus.php b/include/ostatus.php index ec53141dc..556c81e98 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -806,11 +806,19 @@ class ostatus { } // Get the parent + $parents = q("SELECT `item`.`id`, `item`.`parent`, `item`.`uri`, `item`.`contact-id`, `item`.`type`, + `item`.`verb`, `item`.`visible` FROM `term` + STRAIGHT_JOIN `item` AS `thritem` ON `thritem`.`parent` = `term`.`oid` + STRAIGHT_JOIN `item` ON `item`.`parent` = `thritem`.`parent` + WHERE `term`.`uid` = %d AND `term`.`otype` = %d AND `term`.`type` = %d AND `term`.`url` = '%s'))", + intval($uid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), dbesc($conversation_url)); + +/* $parents = q("SELECT `id`, `parent`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `id` IN (SELECT `parent` FROM `item` WHERE `id` IN (SELECT `oid` FROM `term` WHERE `uid` = %d AND `otype` = %d AND `type` = %d AND `url` = '%s'))", intval($uid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), dbesc($conversation_url)); - +*/ if ($parents) $parent = $parents[0]; elseif (count($item) > 0) { @@ -1961,9 +1969,21 @@ class ostatus { $last_update = 'now -30 days'; $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s'); + $authorid = get_contact($owner["url"], 0); - $items = q("SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id` FROM `item` - INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent` + $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` USE INDEX (`uid_contactid_created`) + STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` + WHERE `item`.`uid` = %d AND `item`.`contact-id` = %d AND + `item`.`author-id` = %d AND `item`.`created` > '%s' AND + NOT `item`.`deleted` AND NOT `item`.`private` AND + `thread`.`network` IN ('%s', '%s') + ORDER BY `item`.`created` DESC LIMIT 300", + intval($owner["uid"]), intval($owner["id"]), + intval($authorid), dbesc($check_date), + dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); +/* + $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` + STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` LEFT JOIN `item` AS `thritem` ON `thritem`.`uri`=`item`.`thr-parent` AND `thritem`.`uid`=`item`.`uid` WHERE `item`.`uid` = %d AND `item`.`received` > '%s' AND NOT `item`.`private` AND NOT `item`.`deleted` AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' @@ -1981,7 +2001,7 @@ class ostatus { dbesc($owner["nurl"]), dbesc(str_replace("http://", "https://", $owner["nurl"])), dbesc($owner["nurl"]), dbesc(str_replace("http://", "https://", $owner["nurl"])) ); - +*/ $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; diff --git a/mod/display.php b/mod/display.php index 0e0e7b303..dcb9eb094 100644 --- a/mod/display.php +++ b/mod/display.php @@ -27,9 +27,9 @@ function display_init(&$a) { // Or is it anywhere on the server? if ($nick == "") { - $r = qu("SELECT STRAIGHT_JOIN `user`.`nickname`, `item`.`id`, `item`.`parent`, `item`.`author-name`, + $r = qu("SELECT `user`.`nickname`, `item`.`id`, `item`.`parent`, `item`.`author-name`, `item`.`author-link`, `item`.`author-avatar`, `item`.`network`, `item`.`uid`, `item`.`owner-link`, `item`.`body` - FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid` + FROM `item` STRAIGHT_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` = '' @@ -236,7 +236,7 @@ function display_content(&$a, $update = 0) { } if ($nick == "") { - $r = qu("SELECT STRAIGHT_JOIN `user`.`nickname`, `item`.`id` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid` + $r = qu("SELECT `user`.`nickname`, `item`.`id` FROM `item` STRAIGHT_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` = '' diff --git a/mod/item.php b/mod/item.php index adc46f120..94ff6b93d 100644 --- a/mod/item.php +++ b/mod/item.php @@ -788,6 +788,9 @@ function item_post(&$a) { } else $post_id = 0; + q("COMMIT;"); + q("START TRANSACTION;"); + $r = q("INSERT INTO `item` (`guid`, `extid`, `uid`,`type`,`wall`,`gravity`, `network`, `contact-id`, `owner-name`,`owner-link`,`owner-avatar`, `owner-id`, `author-name`, `author-link`, `author-avatar`, `author-id`, @@ -864,6 +867,7 @@ function item_post(&$a) { $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1", dbesc($datarray['uri'])); if(!count($r)) { + q("COMMIT"); logger('mod_item: unable to retrieve post that was just stored.'); notice( t('System error. Post not saved.') . EOL); goaway($a->get_baseurl() . "/" . $return_path ); @@ -986,6 +990,8 @@ function item_post(&$a) { create_tags_from_item($post_id); create_files_from_item($post_id); + q("COMMIT"); + if ($post_id == $parent) add_thread($post_id); else { diff --git a/mod/photos.php b/mod/photos.php index 741181b2e..ced9523e2 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -53,8 +53,8 @@ function photos_init(&$a) { $sql_extra = permissions_sql($a->data['user']['uid']); - $albums = q("SELECT count(distinct `resource-id`) AS `total`, `album` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' - $sql_extra group by album order by created desc", + $albums = q("SELECT count(distinct `resource-id`) AS `total`, `album` FROM `photo` USE INDEX (`uid_album_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' + $sql_extra GROUP BY `album` ORDER BY `created` DESC", intval($a->data['user']['uid']), dbesc('Contact Photos'), dbesc( t('Contact Photos')) From a8bef370d3148d8a9d0a3ffc5ce906ee0c08d792 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 21 Oct 2016 23:04:04 +0000 Subject: [PATCH 07/21] Some code adjustements and performance improvements to the DFRN feed. --- include/Core/Config.php | 38 +++++++++++++++++--------------------- include/Core/PConfig.php | 28 ++++++++++++++-------------- include/dbclean.php | 7 +++++++ include/dfrn.php | 17 +++++------------ 4 files changed, 43 insertions(+), 47 deletions(-) diff --git a/include/Core/Config.php b/include/Core/Config.php index d76a7c2b2..de371eb7f 100644 --- a/include/Core/Config.php +++ b/include/Core/Config.php @@ -33,8 +33,8 @@ class Config { global $a; $r = q("SELECT `v`, `k` FROM `config` WHERE `cat` = '%s' ORDER BY `cat`, `k`, `id`", dbesc($family)); - if(count($r)) { - foreach($r as $rr) { + if (count($r)) { + foreach ($r as $rr) { $k = $rr['k']; if ($family === 'config') { $a->config[$k] = $rr['v']; @@ -70,20 +70,20 @@ class Config { * If true the config is loaded from the db and not from the cache (default: false) * @return mixed Stored value or null if it does not exist */ - public static function get($family, $key, $default_value=null, $refresh = false) { + public static function get($family, $key, $default_value = null, $refresh = false) { global $a; - if(! $refresh) { + if (!$refresh) { // Looking if the whole family isn't set - if(isset($a->config[$family])) { - if($a->config[$family] === '!!') { + if (isset($a->config[$family])) { + if ($a->config[$family] === '!!') { return $default_value; } } - if(isset($a->config[$family][$key])) { - if($a->config[$family][$key] === '!!') { + if (isset($a->config[$family][$key])) { + if ($a->config[$family][$key] === '!!') { return $default_value; } return $a->config[$family][$key]; @@ -94,7 +94,7 @@ class Config { dbesc($family), dbesc($key) ); - if(count($ret)) { + if (count($ret)) { // manage array value $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']); $a->config[$family][$key] = $val; @@ -123,13 +123,13 @@ class Config { * The value to store * @return mixed Stored $value or false if the database update failed */ - public static function set($family,$key,$value) { + public static function set($family, $key, $value) { global $a; $a->config[$family][$key] = $value; // manage array value - $dbvalue = (is_array($value)?serialize($value):$value); + $dbvalue = (is_array($value) ? serialize($value):$value); $dbvalue = (is_bool($dbvalue) ? intval($dbvalue) : $dbvalue); // The "INSERT" command is very cost intense. It saves performance to do it this way. @@ -138,25 +138,21 @@ class Config { dbesc($key) ); - // It would be better to use the dbm class. - // But there is an autoloader issue that I don't know how to fix: - // "Class 'Friendica\Core\dbm' not found" - //if (!dbm::is_result($ret)) - if (!$ret) + if (!$ret) { $ret = q("INSERT INTO `config` (`cat`, `k`, `v`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'", dbesc($family), dbesc($key), dbesc($dbvalue), dbesc($dbvalue) ); - elseif ($ret[0]['v'] != $dbvalue) + } elseif ($ret[0]['v'] != $dbvalue) { $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s'", dbesc($dbvalue), dbesc($family), dbesc($key) ); - - if($ret) + } + if ($ret) return $value; return $ret; @@ -174,10 +170,10 @@ class Config { * The configuration key to delete * @return mixed */ - public static function delete($family,$key) { + public static function delete($family, $key) { global $a; - if(x($a->config[$family],$key)) + if (x($a->config[$family],$key)) unset($a->config[$family][$key]); $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s'", dbesc($family), diff --git a/include/Core/PConfig.php b/include/Core/PConfig.php index 70f83adcb..764ab8ae8 100644 --- a/include/Core/PConfig.php +++ b/include/Core/PConfig.php @@ -27,14 +27,14 @@ class PConfig { * The category of the configuration value * @return void */ - public static function load($uid,$family) { + public static function load($uid, $family) { global $a; $r = q("SELECT `v`,`k` FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d ORDER BY `cat`, `k`, `id`", dbesc($family), intval($uid) ); - if(count($r)) { - foreach($r as $rr) { + if (count($r)) { + foreach ($r as $rr) { $k = $rr['k']; $a->config[$uid][$family][$k] = $rr['v']; } @@ -67,16 +67,16 @@ class PConfig { global $a; - if(! $refresh) { + if (!$refresh) { // Looking if the whole family isn't set - if(isset($a->config[$uid][$family])) { - if($a->config[$uid][$family] === '!!') { + if (isset($a->config[$uid][$family])) { + if ($a->config[$uid][$family] === '!!') { return $default_value; } } - if(isset($a->config[$uid][$family][$key])) { - if($a->config[$uid][$family][$key] === '!!') { + if (isset($a->config[$uid][$family][$key])) { + if ($a->config[$uid][$family][$key] === '!!') { return $default_value; } return $a->config[$uid][$family][$key]; @@ -89,13 +89,12 @@ class PConfig { dbesc($key) ); - if(count($ret)) { + if (count($ret)) { $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']); $a->config[$uid][$family][$key] = $val; return $val; - } - else { + } else { $a->config[$uid][$family][$key] = '!!'; } return $default_value; @@ -124,7 +123,7 @@ class PConfig { global $a; // manage array value - $dbvalue = (is_array($value)?serialize($value):$value); + $dbvalue = (is_array($value) ? serialize($value):$value); $a->config[$uid][$family][$key] = $value; @@ -154,8 +153,9 @@ class PConfig { dbesc($key) ); - if($ret) + if ($ret) return $value; + return $ret; } @@ -175,7 +175,7 @@ class PConfig { public static function delete($uid,$family,$key) { global $a; - if(x($a->config[$uid][$family],$key)) + if (x($a->config[$uid][$family],$key)) unset($a->config[$uid][$family][$key]); $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s'", intval($uid), diff --git a/include/dbclean.php b/include/dbclean.php index 860d0f220..746c39ed9 100644 --- a/include/dbclean.php +++ b/include/dbclean.php @@ -1,4 +1,8 @@ '%s' OR `item`.`changed` > '%s' ) - // dbesc($check_date), - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`, `contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, `sign`.`signed_text`, `sign`.`signature`, `sign`.`signer` - FROM `item` $sql_post_table + FROM `item` USE INDEX (`uid_wall_changed`, `uid_type_changed`) $sql_post_table STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` - AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND NOT `contact`.`blocked` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` - WHERE `item`.`uid` = %d AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`parent` != 0 - AND ((`item`.`wall` = 1) $visibility) AND `item`.$date_field > '%s' + WHERE `item`.`uid` = %d AND `item`.`visible` AND NOT `item`.`moderated` AND `item`.`parent` != 0 + AND `item`.`wall` AND `item`.`changed` > '%s' $sql_extra - ORDER BY $sql_order LIMIT 0, 300", + ORDER BY `item`.`parent` ".$sort.", `item`.`created` ASC LIMIT 0, 300", intval($owner_id), dbesc($check_date), dbesc($sort) From bc324c3ef466c786a1b3e7375fecd505f00b5288 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 21 Oct 2016 23:42:45 +0000 Subject: [PATCH 08/21] Setting for the callstack in the database query added --- include/dba.php | 8 ++++++-- include/dbstructure.php | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/dba.php b/include/dba.php index c7b598f2d..0b5af341e 100644 --- a/include/dba.php +++ b/include/dba.php @@ -143,7 +143,11 @@ class dba { $stamp1 = microtime(true); - $sql = "/*".$a->callstack()." */ ".$sql; + $orig_sql = $sql; + + if(x($a->config,'system') && x($a->config['system'],'db_callstack')) { + $sql = "/*".$a->callstack()." */ ".$sql; + } if($this->mysqli) $result = @$this->db->query($sql); @@ -155,7 +159,7 @@ class dba { $a->save_timestamp($stamp1, "database"); - if (strtolower(substr($sql, 0, 6)) != "select") + if (strtolower(substr($orig_sql, 0, 6)) != "select") $a->save_timestamp($stamp1, "database_write"); if(x($a->config,'system') && x($a->config['system'],'db_log')) { diff --git a/include/dbstructure.php b/include/dbstructure.php index b28e072f9..b0f90ae24 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -557,6 +557,7 @@ function db_definition($charset) { "indexes" => array( "PRIMARY" => array("id"), "uid" => array("uid"), + "addr_uid" => array("addr", "uid"), "nurl" => array("nurl"), ) ); From 31409e2ca12684328a0f0d9961f81eed559b78ae Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 22 Oct 2016 04:57:52 +0000 Subject: [PATCH 09/21] dbclean is restructured --- include/dbclean.php | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/include/dbclean.php b/include/dbclean.php index 746c39ed9..659733a1a 100644 --- a/include/dbclean.php +++ b/include/dbclean.php @@ -5,24 +5,26 @@ */ require_once("boot.php"); -global $a, $db; +function dbclean_run(&$argv, &$argc) { + global $a, $db; -if(is_null($a)) - $a = new App; + if(is_null($a)) + $a = new App; -if(is_null($db)) { - @include(".htconfig.php"); - require_once("include/dba.php"); - $db = new dba($db_host, $db_user, $db_pass, $db_data); - unset($db_host, $db_user, $db_pass, $db_data); + if(is_null($db)) { + @include(".htconfig.php"); + require_once("include/dba.php"); + $db = new dba($db_host, $db_user, $db_pass, $db_data); + unset($db_host, $db_user, $db_pass, $db_data); + } + + load_config('config'); + load_config('system'); + + remove_orphans(); + killme(); } -load_config('config'); -load_config('system'); - -remove_orphans(); -killme(); - /** * @brief Remove orphaned database entries */ @@ -68,4 +70,9 @@ function remove_orphans() { logger("Done deleting orphaned data from tables"); } + +if (array_search(__file__,get_included_files())===0){ + dbclean_run($_SERVER["argv"],$_SERVER["argc"]); + killme(); +} ?> From b429b856806fb0d0481c11a8630b36dbbea7aedf Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 22 Oct 2016 10:14:41 +0000 Subject: [PATCH 10/21] CSR changes, split dbclean in separate processes if worker is active --- include/Core/PConfig.php | 2 +- include/cron.php | 9 +- include/dba.php | 155 +++++++------- include/dbclean.php | 79 ++++--- include/dbm.php | 4 +- include/items.php | 306 +++++++++++++------------- include/post_update.php | 22 +- mod/display.php | 152 ++++++------- mod/nodeinfo.php | 1 - mod/photos.php | 451 +++++++++++++++++++-------------------- 10 files changed, 592 insertions(+), 589 deletions(-) diff --git a/include/Core/PConfig.php b/include/Core/PConfig.php index 764ab8ae8..975210cfd 100644 --- a/include/Core/PConfig.php +++ b/include/Core/PConfig.php @@ -175,7 +175,7 @@ class PConfig { public static function delete($uid,$family,$key) { global $a; - if (x($a->config[$uid][$family],$key)) + if (x($a->config[$uid][$family], $key)) unset($a->config[$uid][$family][$key]); $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s'", intval($uid), diff --git a/include/cron.php b/include/cron.php index 6913588db..07770a2ee 100644 --- a/include/cron.php +++ b/include/cron.php @@ -126,7 +126,14 @@ function cron_run(&$argv, &$argc){ proc_run(PRIORITY_LOW,'include/expire.php'); - proc_run(PRIORITY_LOW,'include/dbclean.php'); + if (get_config("system", "worker")) { + proc_run(PRIORITY_LOW,'include/dbclean.php', 1); + proc_run(PRIORITY_LOW,'include/dbclean.php', 2); + proc_run(PRIORITY_LOW,'include/dbclean.php', 3); + proc_run(PRIORITY_LOW,'include/dbclean.php', 4); + } else { + proc_run(PRIORITY_LOW,'include/dbclean.php'); + } } // Clear cache entries diff --git a/include/dba.php b/include/dba.php index 0b5af341e..36986ebc7 100644 --- a/include/dba.php +++ b/include/dba.php @@ -5,7 +5,7 @@ require_once("dbm.php"); # TODO: PDO is disabled for release 3.3. We need to investigate why # the update from 3.2 fails with pdo /* -if(class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) { +if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) { require_once("library/dddbl2/dddbl.php"); require_once("include/dba_pdo.php"); } @@ -24,7 +24,7 @@ require_once('include/datetime.php'); * */ -if(! class_exists('dba')) { +if (! class_exists('dba')) { class dba { private $debug = 0; @@ -44,15 +44,15 @@ class dba { $pass = trim($pass); $db = trim($db); - if (!(strlen($server) && strlen($user))){ + if (!(strlen($server) && strlen($user))) { $this->connected = false; $this->db = null; return; } - if($install) { - if(strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) { - if(! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) { + if ($install) { + if (strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) { + if (! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) { $this->error = sprintf( t('Cannot locate DNS info for database server \'%s\''), $server); $this->connected = false; $this->db = null; @@ -61,26 +61,26 @@ class dba { } } - if(class_exists('mysqli')) { + if (class_exists('mysqli')) { $this->db = @new mysqli($server,$user,$pass,$db); - if(! mysqli_connect_errno()) { + if (! mysqli_connect_errno()) { $this->connected = true; } - if (isset($a->config["system"]["db_charset"])) + if (isset($a->config["system"]["db_charset"])) { $this->db->set_charset($a->config["system"]["db_charset"]); - } - else { + } + } else { $this->mysqli = false; $this->db = mysql_connect($server,$user,$pass); - if($this->db && mysql_select_db($db,$this->db)) { + if ($this->db && mysql_select_db($db,$this->db)) { $this->connected = true; } if (isset($a->config["system"]["db_charset"])) mysql_set_charset($a->config["system"]["db_charset"], $this->db); } - if(! $this->connected) { + if (!$this->connected) { $this->db = null; - if(! $install) + if (!$install) system_unavailable(); } @@ -111,7 +111,7 @@ class dba { /** * @brief Returns the number of rows * - * @return string + * @return integer */ public function num_rows() { if (!$this->result) @@ -128,32 +128,32 @@ class dba { public function q($sql, $onlyquery = false) { global $a; - if((! $this->db) || (! $this->connected)) + if ((!$this->db) || (!$this->connected)) return false; $this->error = ''; // Check the connection (This can reconnect the connection - if configured) - if ($this->mysqli) + if ($this->mysqli) { $connected = $this->db->ping(); - else + } else { $connected = mysql_ping($this->db); - + } $connstr = ($connected ? "Connected": "Disonnected"); $stamp1 = microtime(true); $orig_sql = $sql; - if(x($a->config,'system') && x($a->config['system'],'db_callstack')) { + if (x($a->config,'system') && x($a->config['system'],'db_callstack')) { $sql = "/*".$a->callstack()." */ ".$sql; } - if($this->mysqli) + if ($this->mysqli) { $result = @$this->db->query($sql); - else + } else { $result = @mysql_query($sql,$this->db); - + } $stamp2 = microtime(true); $duration = (float)($stamp2-$stamp1); @@ -162,7 +162,7 @@ class dba { if (strtolower(substr($orig_sql, 0, 6)) != "select") $a->save_timestamp($stamp1, "database_write"); - if(x($a->config,'system') && x($a->config['system'],'db_log')) { + if (x($a->config,'system') && x($a->config['system'],'db_log')) { if (($duration > $a->config["system"]["db_loglimit"])) { $duration = round($duration, 3); $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); @@ -173,33 +173,34 @@ class dba { } } - if($this->mysqli) { - if($this->db->errno) { + if ($this->mysqli) { + if ($this->db->errno) { $this->error = $this->db->error; $this->errorno = $this->db->errno; } - } elseif(mysql_errno($this->db)) { + } elseif (mysql_errno($this->db)) { $this->error = mysql_error($this->db); $this->errorno = mysql_errno($this->db); } - if(strlen($this->error)) { + if (strlen($this->error)) { logger('DB Error ('.$connstr.') '.$this->errorno.': '.$this->error); } - if($this->debug) { + if ($this->debug) { $mesg = ''; - if($result === false) + if ($result === false) { $mesg = 'false'; - elseif($result === true) + } elseif ($result === true) { $mesg = 'true'; - else { - if($this->mysqli) + } else { + if ($this->mysqli) { $mesg = $result->num_rows . ' results' . EOL; - else + } else { $mesg = mysql_num_rows($result) . ' results' . EOL; + } } $str = 'SQL = ' . printable($sql) . EOL . 'SQL returned ' . $mesg @@ -215,13 +216,13 @@ class dba { * These usually indicate SQL syntax errors that need to be resolved. */ - if($result === false) { + if ($result === false) { logger('dba: ' . printable($sql) . ' returned false.' . "\n" . $this->error); - if(file_exists('dbfail.out')) + if (file_exists('dbfail.out')) file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND); } - if(($result === true) || ($result === false)) + if (($result === true) || ($result === false)) return $result; if ($onlyquery) { @@ -230,15 +231,14 @@ class dba { } $r = array(); - if($this->mysqli) { - if($result->num_rows) { + if ($this->mysqli) { + if ($result->num_rows) { while($x = $result->fetch_array(MYSQLI_ASSOC)) $r[] = $x; $result->free_result(); } - } - else { - if(mysql_num_rows($result)) { + } else { + if (mysql_num_rows($result)) { while($x = mysql_fetch_array($result, MYSQL_ASSOC)) $r[] = $x; mysql_free_result($result); @@ -247,7 +247,7 @@ class dba { //$a->save_timestamp($stamp1, "database"); - if($this->debug) + if ($this->debug) logger('dba: ' . printable(print_r($r, true))); return($r); } @@ -256,11 +256,11 @@ class dba { $x = false; if ($this->result) - if($this->mysqli) { - if($this->result->num_rows) + if ($this->mysqli) { + if ($this->result->num_rows) $x = $this->result->fetch_array(MYSQLI_ASSOC); } else { - if(mysql_num_rows($this->result)) + if (mysql_num_rows($this->result)) $x = mysql_fetch_array($this->result, MYSQL_ASSOC); } @@ -269,7 +269,7 @@ class dba { public function qclose() { if ($this->result) - if($this->mysqli) { + if ($this->mysqli) { $this->result->free_result(); } else { mysql_free_result($this->result); @@ -281,56 +281,60 @@ class dba { } public function escape($str) { - if($this->db && $this->connected) { - if($this->mysqli) + if ($this->db && $this->connected) { + if ($this->mysqli) { return @$this->db->real_escape_string($str); - else + } else { return @mysql_real_escape_string($str,$this->db); + } } } function connected() { - if ($this->mysqli) + if ($this->mysqli) { $connected = $this->db->ping(); - else + } else { $connected = mysql_ping($this->db); - + } return $connected; } function __destruct() { - if ($this->db) - if($this->mysqli) + if ($this->db) { + if ($this->mysqli) { $this->db->close(); - else + } else { mysql_close($this->db); + } + } } }} -if(! function_exists('printable')) { +if (! function_exists('printable')) { function printable($s) { $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s); $s = str_replace("\x00",'.',$s); - if(x($_SERVER,'SERVER_NAME')) + if (x($_SERVER,'SERVER_NAME')) $s = escape_tags($s); return $s; }} // Procedural functions -if(! function_exists('dbg')) { +if (! function_exists('dbg')) { function dbg($state) { global $db; - if($db) + if ($db) $db->dbg($state); }} -if(! function_exists('dbesc')) { +if (! function_exists('dbesc')) { function dbesc($str) { global $db; - if($db && $db->connected) + if ($db && $db->connected) { return($db->escape($str)); - else + } else { return(str_replace("'","\\'",$str)); + } }} @@ -340,17 +344,17 @@ function dbesc($str) { // Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d", // 'user', 1); -if(! function_exists('q')) { +if (! function_exists('q')) { function q($sql) { global $db; $args = func_get_args(); unset($args[0]); - if($db && $db->connected) { + if ($db && $db->connected) { $stmt = @vsprintf($sql,$args); // Disabled warnings //logger("dba: q: $stmt", LOGGER_ALL); - if($stmt === false) + if ($stmt === false) logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG); return $db->q($stmt); } @@ -381,9 +385,9 @@ function qu($sql) { $args = func_get_args(); unset($args[0]); - if($db && $db->connected) { + if ($db && $db->connected) { $stmt = @vsprintf($sql,$args); // Disabled warnings - if($stmt === false) + if ($stmt === false) logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG); $db->q("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); $retval = $db->q($stmt); @@ -408,14 +412,15 @@ function qu($sql) { * */ -if(! function_exists('dbq')) { +if (! function_exists('dbq')) { function dbq($sql) { global $db; - if($db && $db->connected) + if ($db && $db->connected) { $ret = $db->q($sql); - else + } else { $ret = false; + } return $ret; }} @@ -426,16 +431,16 @@ function dbq($sql) { // cast to int to avoid trouble. -if(! function_exists('dbesc_array_cb')) { +if (! function_exists('dbesc_array_cb')) { function dbesc_array_cb(&$item, $key) { - if(is_string($item)) + if (is_string($item)) $item = dbesc($item); }} -if(! function_exists('dbesc_array')) { +if (! function_exists('dbesc_array')) { function dbesc_array(&$arr) { - if(is_array($arr) && count($arr)) { + if (is_array($arr) && count($arr)) { array_walk($arr,'dbesc_array_cb'); } }} diff --git a/include/dbclean.php b/include/dbclean.php index 659733a1a..5b80b084a 100644 --- a/include/dbclean.php +++ b/include/dbclean.php @@ -8,10 +8,10 @@ require_once("boot.php"); function dbclean_run(&$argv, &$argc) { global $a, $db; - if(is_null($a)) + if (is_null($a)) $a = new App; - if(is_null($db)) { + if (is_null($db)) { @include(".htconfig.php"); require_once("include/dba.php"); $db = new dba($db_host, $db_user, $db_pass, $db_data); @@ -21,52 +21,69 @@ function dbclean_run(&$argv, &$argc) { load_config('config'); load_config('system'); - remove_orphans(); + if ($argc == 2) { + $stage = intval($argv[1]); + } else { + $stage = 0; + } + remove_orphans($stage); killme(); } /** * @brief Remove orphaned database entries */ -function remove_orphans() { - global $db; +function remove_orphans($stage = 0) { + global $db; - logger("Deleting orphaned data from thread table"); - 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"])); + if (($stage == 1) OR ($stage == 0)) { + logger("Deleting orphaned data from thread table"); + 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(); } - $db->qclose(); - - logger("Deleting orphaned data from notify table"); - 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"])); + if (($stage == 2) OR ($stage == 0)) { + logger("Deleting orphaned data from notify table"); + 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(); } - $db->qclose(); - logger("Deleting orphaned data from sign table"); - 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"])); + if (($stage == 3) OR ($stage == 0)) { + logger("Deleting orphaned data from sign table"); + 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(); } - $db->qclose(); - logger("Deleting orphaned data from term table"); - 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"])); + if (($stage == 4) OR ($stage == 0)) { + logger("Deleting orphaned data from term table"); + 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(); } - $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; + /// @todo Based on the following query we should remove some more data + // 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"); } diff --git a/include/dbm.php b/include/dbm.php index 812989072..6098dce73 100644 --- a/include/dbm.php +++ b/include/dbm.php @@ -44,9 +44,9 @@ class dbm { */ public static function is_result($array) { // It could be a return value from an update statement - if (is_bool($array)) + if (is_bool($array)) { return $array; - + } return (is_array($array) && count($array) > 0); } } diff --git a/include/items.php b/include/items.php index b969a75d6..27c198d89 100644 --- a/include/items.php +++ b/include/items.php @@ -23,7 +23,7 @@ require_once('include/group.php'); require_once('library/defuse/php-encryption-1.2.1/Crypto.php'); function construct_verb($item) { - if($item['verb']) + if ($item['verb']) return $item['verb']; return ACTIVITY_POST; } @@ -33,7 +33,7 @@ function construct_verb($item) { * The purpose of this function is to apply system message length limits to * imported messages without including any embedded photos in the length */ -if(! function_exists('limit_body_size')) { +if (! function_exists('limit_body_size')) { function limit_body_size($body) { // logger('limit_body_size: start', LOGGER_DEBUG); @@ -42,7 +42,7 @@ function limit_body_size($body) { // If the length of the body, including the embedded images, is smaller // than the maximum, then don't waste time looking for the images - if($maxlen && (strlen($body) > $maxlen)) { + if ($maxlen && (strlen($body) > $maxlen)) { logger('limit_body_size: the total body length exceeds the limit', LOGGER_DEBUG); @@ -60,40 +60,37 @@ function limit_body_size($body) { $img_end += $img_start; $img_end += strlen('[/img]'); - if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) { + if (! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) { // This is an embedded image - if( ($textlen + $img_start) > $maxlen ) { - if($textlen < $maxlen) { + if ( ($textlen + $img_start) > $maxlen ) { + if ($textlen < $maxlen) { logger('limit_body_size: the limit happens before an embedded image', LOGGER_DEBUG); $new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); $textlen = $maxlen; } - } - else { + } else { $new_body = $new_body . substr($orig_body, 0, $img_start); $textlen += $img_start; } $new_body = $new_body . substr($orig_body, $img_start, $img_end - $img_start); - } - else { + } else { - if( ($textlen + $img_end) > $maxlen ) { - if($textlen < $maxlen) { + if ( ($textlen + $img_end) > $maxlen ) { + if ($textlen < $maxlen) { logger('limit_body_size: the limit happens before the end of a non-embedded image', LOGGER_DEBUG); $new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); $textlen = $maxlen; } - } - else { + } else { $new_body = $new_body . substr($orig_body, 0, $img_end); $textlen += $img_end; } } $orig_body = substr($orig_body, $img_end); - if($orig_body === false) // in case the body ends on a closing image tag + if ($orig_body === false) // in case the body ends on a closing image tag $orig_body = ''; $img_start = strpos($orig_body, '[img'); @@ -101,22 +98,20 @@ function limit_body_size($body) { $img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false); } - if( ($textlen + strlen($orig_body)) > $maxlen) { - if($textlen < $maxlen) { + if ( ($textlen + strlen($orig_body)) > $maxlen) { + if ($textlen < $maxlen) { logger('limit_body_size: the limit happens after the end of the last image', LOGGER_DEBUG); $new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen); $textlen = $maxlen; } - } - else { + } else { logger('limit_body_size: the text size with embedded images extracted did not violate the limit', LOGGER_DEBUG); $new_body = $new_body . $orig_body; $textlen += strlen($orig_body); } return $new_body; - } - else + } else return $body; }} @@ -319,9 +314,7 @@ function item_add_language_opt(&$arr) { return; } $postopts = $arr['postopts']; - } - else - { + } else { $postopts = ""; } @@ -383,7 +376,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa // item array and set it aside for later storage. $dsprsig = null; - if(x($arr,'dsprsig')) { + if (x($arr,'dsprsig')) { $dsprsig = json_decode(base64_decode($arr['dsprsig'])); unset($arr['dsprsig']); } @@ -396,16 +389,16 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa $arr['plink'] = ostatus::convert_href($arr['uri']); } - if(x($arr, 'gravity')) + if (x($arr, 'gravity')) $arr['gravity'] = intval($arr['gravity']); - elseif($arr['parent-uri'] === $arr['uri']) + elseif ($arr['parent-uri'] === $arr['uri']) $arr['gravity'] = 0; - elseif(activity_match($arr['verb'],ACTIVITY_POST)) + elseif (activity_match($arr['verb'],ACTIVITY_POST)) $arr['gravity'] = 6; else $arr['gravity'] = 6; // extensible catchall - if(! x($arr,'type')) + if (! x($arr,'type')) $arr['type'] = 'remote'; @@ -413,7 +406,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa /* check for create date and expire time */ $uid = intval($arr['uid']); $r = q("SELECT expire FROM user WHERE uid = %d", intval($uid)); - if(count($r)) { + if (count($r)) { $expire_interval = $r[0]['expire']; if ($expire_interval>0) { $expire_date = new DateTime( '- '.$expire_interval.' days', new DateTimeZone('UTC')); @@ -445,7 +438,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa // Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin. // Deactivated, since the bbcode parser can handle with it - and it destroys posts with some smileys that contain "<" - //if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false)) + //if ((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false)) // $arr['body'] = strip_tags($arr['body']); item_add_language_opt($arr); @@ -530,19 +523,19 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa intval($arr['uid']) ); - if(!count($r)) + if (!count($r)) $r = q("SELECT `network` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' LIMIT 1", dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS), dbesc(normalise_link($arr['author-link'])) ); - if(!count($r)) + if (!count($r)) $r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($arr['contact-id']), intval($arr['uid']) ); - if(count($r)) + if (count($r)) $arr['network'] = $r[0]["network"]; // Fallback to friendica (why is it empty in some cases?) @@ -556,7 +549,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa if ($arr["contact-id"] == 0) { // First we are looking for a suitable contact that matches with the author of the post // This is done only for comments (See below explanation at "gcontact-id") - if($arr['parent-uri'] != $arr['uri']) + if ($arr['parent-uri'] != $arr['uri']) $arr["contact-id"] = get_contact($arr['author-link'], $uid); // If not present then maybe the owner was found @@ -576,7 +569,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa // The gcontact should mostly behave like the contact. But is is supposed to be global for the system. // This means that wall posts, repeated posts, etc. should have the gcontact id of the owner. // On comments the author is the better choice. - if($arr['parent-uri'] === $arr['uri']) + if ($arr['parent-uri'] === $arr['uri']) $arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['owner-link'], "network" => $arr['network'], "photo" => $arr['owner-avatar'], "name" => $arr['owner-name'])); else @@ -596,7 +589,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa $r = q("SELECT `guid` FROM `item` WHERE `guid` = '%s' AND `network` = '%s' AND `uid` = '%d' LIMIT 1", dbesc($arr['guid']), dbesc($arr['network']), intval($arr['uid'])); - if(count($r)) { + if (count($r)) { logger('found item with guid '.$arr['guid'].' for user '.$arr['uid'].' on network '.$arr['network'], LOGGER_DEBUG); return 0; } @@ -606,7 +599,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa item_body_set_hashtags($arr); $arr['thr-parent'] = $arr['parent-uri']; - if($arr['parent-uri'] === $arr['uri']) { + if ($arr['parent-uri'] === $arr['uri']) { $parent_id = 0; $parent_deleted = 0; $allow_cid = $arr['allow_cid']; @@ -614,8 +607,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa $deny_cid = $arr['deny_cid']; $deny_gid = $arr['deny_gid']; $notify_type = 'wall-new'; - } - else { + } else { // find the parent and snarf the item id and ACLs // and anything else we need to inherit @@ -625,13 +617,13 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa intval($arr['uid']) ); - if(count($r)) { + if (count($r)) { // is the new message multi-level threaded? // even though we don't support it now, preserve the info // and re-attach to the conversation parent. - if($r[0]['uri'] != $r[0]['parent-uri']) { + if ($r[0]['uri'] != $r[0]['parent-uri']) { $arr['parent-uri'] = $r[0]['parent-uri']; $z = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `parent-uri` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1", @@ -639,7 +631,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa dbesc($r[0]['parent-uri']), intval($arr['uid']) ); - if($z && count($z)) + if ($z && count($z)) $r = $z; } @@ -656,21 +648,21 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa // This differs from the above settings as it subtly allows comments from // email correspondents to be private even if the overall thread is not. - if($r[0]['private']) + if ($r[0]['private']) $arr['private'] = $r[0]['private']; // Edge case. We host a public forum that was originally posted to privately. // The original author commented, but as this is a comment, the permissions // weren't fixed up so it will still show the comment as private unless we fix it here. - if((intval($r[0]['forum_mode']) == 1) && (! $r[0]['private'])) + if ((intval($r[0]['forum_mode']) == 1) && (! $r[0]['private'])) $arr['private'] = 0; // If its a post from myself then tag the thread as "mention" logger("item_store: Checking if parent ".$parent_id." has to be tagged as mention for user ".$arr['uid'], LOGGER_DEBUG); $u = q("SELECT `nickname` FROM `user` WHERE `uid` = %d", intval($arr['uid'])); - if(count($u)) { + if (count($u)) { $a = get_app(); $self = normalise_link($a->get_baseurl() . '/profile/' . $u[0]['nickname']); logger("item_store: 'myself' is ".$self." for parent ".$parent_id." checking against ".$arr['author-link']." and ".$arr['owner-link'], LOGGER_DEBUG); @@ -684,13 +676,12 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa // Allow one to see reply tweets from status.net even when // we don't have or can't see the original post. - if($force_parent) { + if ($force_parent) { logger('item_store: $force_parent=true, reply converted to top-level post.'); $parent_id = 0; $arr['parent-uri'] = $arr['uri']; $arr['gravity'] = 0; - } - else { + } else { logger('item_store: item parent '.$arr['parent-uri'].' for '.$arr['uid'].' was not found - ignoring item'); return 0; } @@ -740,14 +731,14 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa $arr["global"] = true; q("UPDATE `item` SET `global` = 1 WHERE `uri` = '%s'", dbesc($arr["uri"])); - } else { + } else { $isglobal = q("SELECT `global` FROM `item` WHERE `uid` = 0 AND `uri` = '%s'", dbesc($arr["uri"])); $arr["global"] = (count($isglobal) > 0); } // ACL settings - if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid)) + if (strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid)) $private = 1; else $private = $arr['private']; @@ -767,7 +758,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa else call_hooks('post_remote',$arr); - if(x($arr,'cancel')) { + if (x($arr,'cancel')) { logger('item_store: post cancelled by plugin.'); return 0; } @@ -798,7 +789,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa dbesc($arr['network']) ); - if(count($r) > 1) { + if (count($r) > 1) { // There are duplicates. Keep the oldest one, delete the others logger('item_store: duplicated post occurred. Removing newer duplicates. uri = '.$arr['uri'].' uid = '.$arr['uid']); q("DELETE FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` = '%s' AND `id` > %d", @@ -809,7 +800,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa ); q("COMMIT"); return 0; - } elseif(count($r)) { + } elseif (count($r)) { $current_post = $r[0]['id']; logger('item_store: created item ' . $current_post); @@ -821,7 +812,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa return 0; } - if(!$parent_id || ($arr['parent-uri'] === $arr['uri'])) + if (!$parent_id || ($arr['parent-uri'] === $arr['uri'])) $parent_id = $current_post; // Set parent id @@ -847,7 +838,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa intval($parent_id) ); - if($dsprsig) { + if ($dsprsig) { // Friendica servers lower than 3.4.3-2 had double encoded the signature ... // We can check for this condition when we decode and encode the stuff again. @@ -869,7 +860,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa * If this is now the last-child, force all _other_ children of this parent to *not* be last-child */ - if($arr['last-child']) { + if ($arr['last-child']) { $r = q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d AND `id` != %d", dbesc($arr['uri']), intval($arr['uid']), @@ -931,17 +922,18 @@ function item_set_last_item($arr) { if (!$update AND ($arr["network"] == NETWORK_DFRN) AND ($arr["parent-uri"] === $arr["uri"])) { $isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`", intval($arr['contact-id'])); - if ($isforum) + if ($isforum) { $update = true; + } } - if ($update) + if ($update) { q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", dbesc($arr['received']), dbesc($arr['received']), intval($arr['contact-id']) ); - + } // Now do the same for the system wide contacts with uid=0 if (!$arr['private']) { q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", @@ -950,12 +942,13 @@ function item_set_last_item($arr) { intval($arr['owner-id']) ); - if ($arr['owner-id'] != $arr['author-id']) + if ($arr['owner-id'] != $arr['author-id']) { q("UPDATE `contact` SET `success_update` = '%s', `last-item` = '%s' WHERE `id` = %d", dbesc($arr['received']), dbesc($arr['received']), intval($arr['author-id']) ); + } } } @@ -964,7 +957,7 @@ function item_body_set_hashtags(&$item) { $tags = get_tags($item["body"]); // No hashtags? - if(!count($tags)) + if (!count($tags)) return(false); // This sorting is important when there are hashtags that are part of other hashtags @@ -1004,10 +997,10 @@ function item_body_set_hashtags(&$item) { foreach($tags as $tag) { - if(strpos($tag,'#') !== 0) + if (strpos($tag,'#') !== 0) continue; - if(strpos($tag,'[url=')) + if (strpos($tag,'[url=')) continue; $basetag = str_replace('_',' ',substr($tag,1)); @@ -1016,8 +1009,8 @@ function item_body_set_hashtags(&$item) { $item["body"] = str_replace($tag, $newtag, $item["body"]); - if(!stristr($item["tag"],"/search?tag=".$basetag."]".$basetag."[/url]")) { - if(strlen($item["tag"])) + if (!stristr($item["tag"],"/search?tag=".$basetag."]".$basetag."[/url]")) { + if (strlen($item["tag"])) $item["tag"] = ','.$item["tag"]; $item["tag"] = $newtag.$item["tag"]; } @@ -1072,10 +1065,10 @@ function get_item_id($guid, $uid = 0) { // return - test function get_item_contact($item,$contacts) { - if(! count($contacts) || (! is_array($item))) + if (! count($contacts) || (! is_array($item))) return false; foreach($contacts as $contact) { - if($contact['id'] == $item['contact-id']) { + if ($contact['id'] == $item['contact-id']) { return $contact; break; // NOTREACHED } @@ -1100,7 +1093,7 @@ function tag_deliver($uid,$item_id) { $u = q("select * from user where uid = %d limit 1", intval($uid) ); - if(! count($u)) + if (! count($u)) return; $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); @@ -1111,7 +1104,7 @@ function tag_deliver($uid,$item_id) { intval($item_id), intval($uid) ); - if(! count($i)) + if (! count($i)) return; $item = $i[0]; @@ -1124,16 +1117,16 @@ function tag_deliver($uid,$item_id) { $dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']); $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$item['body'],$matches,PREG_SET_ORDER); - if($cnt) { + if ($cnt) { foreach($matches as $mtch) { - if(link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) { + if (link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) { $mention = true; logger('tag_deliver: mention found: ' . $mtch[2]); } } } - if(! $mention){ + if (! $mention){ if ( ($community_page || $prvgroup) && (!$item['wall']) && (!$item['origin']) && ($item['id'] == $item['parent'])){ // mmh.. no mention.. community page or private group... no wall.. no origin.. top-post (not a comment) @@ -1152,7 +1145,7 @@ function tag_deliver($uid,$item_id) { call_hooks('tagged', $arr); - if((! $community_page) && (! $prvgroup)) + if ((! $community_page) && (! $prvgroup)) return; @@ -1160,7 +1153,7 @@ function tag_deliver($uid,$item_id) { // prevent delivery looping - only proceed // if the message originated elsewhere and is a top-level post - if(($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent'])) + if (($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent'])) return; // now change this copy of the post to a forum head message and deliver to all the tgroup members @@ -1169,7 +1162,7 @@ function tag_deliver($uid,$item_id) { $c = q("select name, url, thumb from contact where self = 1 and uid = %d limit 1", intval($u[0]['uid']) ); - if(! count($c)) + if (! count($c)) return; // also reset all the privacy bits to the forum default permissions @@ -1207,14 +1200,14 @@ function tgroup_check($uid,$item) { // check that the message originated elsewhere and is a top-level post - if(($item['wall']) || ($item['origin']) || ($item['uri'] != $item['parent-uri'])) + if (($item['wall']) || ($item['origin']) || ($item['uri'] != $item['parent-uri'])) return false; $u = q("select * from user where uid = %d limit 1", intval($uid) ); - if(! count($u)) + if (! count($u)) return false; $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); @@ -1229,19 +1222,19 @@ function tgroup_check($uid,$item) { $dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']); $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$item['body'],$matches,PREG_SET_ORDER); - if($cnt) { + if ($cnt) { foreach($matches as $mtch) { - if(link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) { + if (link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) { $mention = true; logger('tgroup_check: mention found: ' . $mtch[2]); } } } - if(! $mention) + if (! $mention) return false; - if((! $community_page) && (! $prvgroup)) + if ((! $community_page) && (! $prvgroup)) return false; return true; @@ -1404,13 +1397,13 @@ function new_follower($importer,$contact,$datarray,$item,$sharing = false) { if (is_object($item)) { $rawtag = $item->get_item_tags(NAMESPACE_ACTIVITY,'actor'); - if($rawtag && $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data']) + if ($rawtag && $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data']) $nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data']; } else $nick = $item; - if(is_array($contact)) { - if(($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING) + if (is_array($contact)) { + if (($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING) || ($sharing && $contact['rel'] == CONTACT_IS_FOLLOWER)) { $r = q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d", intval(CONTACT_IS_FRIEND), @@ -1440,7 +1433,7 @@ function new_follower($importer,$contact,$datarray,$item,$sharing = false) { intval($importer['uid']), dbesc($url) ); - if(count($r)) { + if (count($r)) { $contact_record = $r[0]; update_contact_avatar($photo, $importer["uid"], $contact_record["id"], true); } @@ -1450,12 +1443,12 @@ function new_follower($importer,$contact,$datarray,$item,$sharing = false) { intval($importer['uid']) ); $a = get_app(); - if(count($r) AND !in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE))) { + if (count($r) AND !in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE))) { // create notification $hash = random_string(); - if(is_array($contact_record)) { + if (is_array($contact_record)) { $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `hash`, `datetime`) VALUES ( %d, %d, 0, 0, '%s', '%s' )", intval($importer['uid']), @@ -1467,10 +1460,10 @@ function new_follower($importer,$contact,$datarray,$item,$sharing = false) { $def_gid = get_default_group($importer['uid'], $contact_record["network"]); - if(intval($def_gid)) + if (intval($def_gid)) group_add_member($importer['uid'],'',$contact_record['id'],$def_gid); - if(($r[0]['notify-flags'] & NOTIFY_INTRO) && + if (($r[0]['notify-flags'] & NOTIFY_INTRO) && in_array($r[0]['page-flags'], array(PAGE_NORMAL))) { notification(array( @@ -1501,26 +1494,24 @@ function new_follower($importer,$contact,$datarray,$item,$sharing = false) { function lose_follower($importer,$contact,$datarray = array(),$item = "") { - if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_SHARING)) { + if (($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_SHARING)) { q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d", intval(CONTACT_IS_SHARING), intval($contact['id']) ); - } - else { + } else { contact_remove($contact['id']); } } function lose_sharer($importer,$contact,$datarray = array(),$item = "") { - if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_FOLLOWER)) { + if (($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_FOLLOWER)) { q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d", intval(CONTACT_IS_FOLLOWER), intval($contact['id']) ); - } - else { + } else { contact_remove($contact['id']); } } @@ -1529,7 +1520,7 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') { $a = get_app(); - if(is_array($importer)) { + if (is_array($importer)) { $r = q("SELECT `nickname` FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer['uid']) ); @@ -1539,7 +1530,7 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') { // through the direct Diaspora protocol. If we try and use // the feed, we'll get duplicates. So don't. - if((! count($r)) || $contact['network'] === NETWORK_DIASPORA) + if ((! count($r)) || $contact['network'] === NETWORK_DIASPORA) return; $push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id']; @@ -1552,7 +1543,7 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') { logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token); - if(!strlen($contact['hub-verify']) OR ($contact['hub-verify'] != $verify_token)) { + if (!strlen($contact['hub-verify']) OR ($contact['hub-verify'] != $verify_token)) { $r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d", dbesc($verify_token), intval($contact['id']) @@ -1569,7 +1560,7 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') { function fix_private_photos($s, $uid, $item = null, $cid = 0) { - if(get_config('system','disable_embedded')) + if (get_config('system','disable_embedded')) return $s; $a = get_app(); @@ -1591,14 +1582,14 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) { logger('fix_private_photos: found photo ' . $image, LOGGER_DEBUG); - if(stristr($image , $site . '/photo/')) { + if (stristr($image , $site . '/photo/')) { // Only embed locally hosted photos $replace = false; $i = basename($image); $i = str_replace(array('.jpg','.png','.gif'),array('','',''),$i); $x = strpos($i,'-'); - if($x) { + 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", @@ -1606,7 +1597,7 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) { intval($res), intval($uid) ); - if($r) { + if ($r) { // 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 @@ -1616,31 +1607,30 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) { // permissions, regardless of order but first check to see if they're an exact // match to save some processing overhead. - if(has_permissions($r[0])) { - if($cid) { + if (has_permissions($r[0])) { + if ($cid) { $recips = enumerate_permissions($r[0]); - if(in_array($cid, $recips)) { + if (in_array($cid, $recips)) { $replace = true; } - } - elseif($item) { - if(compare_permissions($item,$r[0])) + } elseif ($item) { + if (compare_permissions($item,$r[0])) $replace = true; } } - if($replace) { + if ($replace) { $data = $r[0]['data']; $type = $r[0]['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)) { + if (preg_match("/\[img\=([0-9]*)x([0-9]*)\]/is", substr($orig_body, $img_start, $img_st_close), $match)) { logger('fix_private_photos: scaling photo', LOGGER_DEBUG); $width = intval($match[1]); $height = intval($match[2]); $ph = new Photo($data, $type); - if($ph->is_valid()) { + if ($ph->is_valid()) { $ph->scaleImage(max($width, $height)); $data = $ph->imageString(); $type = $ph->getType(); @@ -1657,7 +1647,7 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) { $new_body = $new_body . substr($orig_body, 0, $img_start + $img_st_close) . $image . '[/img]'; $orig_body = substr($orig_body, $img_start + $img_st_close + $img_len + strlen('[/img]')); - if($orig_body === false) + if ($orig_body === false) $orig_body = ''; $img_start = strpos($orig_body, '[img'); @@ -1671,14 +1661,14 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) { } function has_permissions($obj) { - if(($obj['allow_cid'] != '') || ($obj['allow_gid'] != '') || ($obj['deny_cid'] != '') || ($obj['deny_gid'] != '')) + if (($obj['allow_cid'] != '') || ($obj['allow_gid'] != '') || ($obj['deny_cid'] != '') || ($obj['deny_gid'] != '')) return true; return false; } function compare_permissions($obj1,$obj2) { // first part is easy. Check that these are exactly the same. - if(($obj1['allow_cid'] == $obj2['allow_cid']) + if (($obj1['allow_cid'] == $obj2['allow_cid']) && ($obj1['allow_gid'] == $obj2['allow_gid']) && ($obj1['deny_cid'] == $obj2['deny_cid']) && ($obj1['deny_gid'] == $obj2['deny_gid'])) @@ -1690,7 +1680,7 @@ function compare_permissions($obj1,$obj2) { $recipients2 = enumerate_permissions($obj2); sort($recipients1); sort($recipients2); - if($recipients1 == $recipients2) + if ($recipients1 == $recipients2) return true; return false; } @@ -1712,17 +1702,17 @@ function item_getfeedtags($item) { $ret = array(); $matches = false; $cnt = preg_match_all('|\#\[url\=(.*?)\](.*?)\[\/url\]|',$item['tag'],$matches); - if($cnt) { + if ($cnt) { for($x = 0; $x < $cnt; $x ++) { - if($matches[1][$x]) + if ($matches[1][$x]) $ret[$matches[2][$x]] = array('#',$matches[1][$x], $matches[2][$x]); } } $matches = false; $cnt = preg_match_all('|\@\[url\=(.*?)\](.*?)\[\/url\]|',$item['tag'],$matches); - if($cnt) { + if ($cnt) { for($x = 0; $x < $cnt; $x ++) { - if($matches[1][$x]) + if ($matches[1][$x]) $ret[] = array('@',$matches[1][$x], $matches[2][$x]); } } @@ -1731,7 +1721,7 @@ function item_getfeedtags($item) { function item_expire($uid, $days, $network = "", $force = false) { - if((! $uid) || ($days < 1)) + if ((! $uid) || ($days < 1)) return; // $expire_network_only = save your own wall posts @@ -1758,7 +1748,7 @@ function item_expire($uid, $days, $network = "", $force = false) { intval($days) ); - if(! count($r)) + if (! count($r)) return; $expire_items = get_pconfig($uid, 'expire','items'); @@ -1783,18 +1773,18 @@ function item_expire($uid, $days, $network = "", $force = false) { // don't expire filed items - if(strpos($item['file'],'[') !== false) + if (strpos($item['file'],'[') !== false) continue; // Only expire posts, not photos and photo comments - if($expire_photos==0 && strlen($item['resource-id'])) + if ($expire_photos==0 && strlen($item['resource-id'])) continue; - if($expire_starred==0 && intval($item['starred'])) + if ($expire_starred==0 && intval($item['starred'])) continue; - if($expire_notes==0 && $item['type']=='note') + if ($expire_notes==0 && $item['type']=='note') continue; - if($expire_items==0 && $item['type']!='note') + if ($expire_items==0 && $item['type']!='note') continue; drop_item($item['id'],false); @@ -1808,20 +1798,20 @@ function item_expire($uid, $days, $network = "", $force = false) { function drop_items($items) { $uid = 0; - if(! local_user() && ! remote_user()) + if (! local_user() && ! remote_user()) return; - if(count($items)) { + if (count($items)) { foreach($items as $item) { $owner = drop_item($item,false); - if($owner && ! $uid) + if ($owner && ! $uid) $uid = $owner; } } // multiple threads may have been deleted, send an expire notification - if($uid) + if ($uid) proc_run(PRIORITY_HIGH,"include/notifier.php", "expire", $uid); } @@ -1836,8 +1826,8 @@ function drop_item($id,$interactive = true) { intval($id) ); - if(! count($r)) { - if(! $interactive) + if (! count($r)) { + if (! $interactive) return 0; notice( t('Item not found.') . EOL); goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); @@ -1851,9 +1841,9 @@ function drop_item($id,$interactive = true) { // check if logged in user is either the author or owner of this item - if(is_array($_SESSION['remote'])) { + if (is_array($_SESSION['remote'])) { foreach($_SESSION['remote'] as $visitor) { - if($visitor['uid'] == $item['uid'] && $visitor['cid'] == $item['contact-id']) { + if ($visitor['uid'] == $item['uid'] && $visitor['cid'] == $item['contact-id']) { $cid = $visitor['cid']; break; } @@ -1861,16 +1851,16 @@ function drop_item($id,$interactive = true) { } - if((local_user() == $item['uid']) || ($cid) || (! $interactive)) { + if ((local_user() == $item['uid']) || ($cid) || (! $interactive)) { // Check if we should do HTML-based delete confirmation - if($_REQUEST['confirm']) { + if ($_REQUEST['confirm']) { //
can't take arguments in its "action" parameter // so add any arguments as hidden inputs $query = explode_querystring($a->query_string); $inputs = array(); foreach($query['args'] as $arg) { - if(strpos($arg, 'confirm=') === false) { + if (strpos($arg, 'confirm=') === false) { $arg_parts = explode('=', $arg); $inputs[] = array('name' => $arg_parts[0], 'value' => $arg_parts[1]); } @@ -1887,7 +1877,7 @@ function drop_item($id,$interactive = true) { )); } // Now check how the user responded to the confirmation query - if($_REQUEST['canceled']) { + if ($_REQUEST['canceled']) { goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); } @@ -1907,7 +1897,7 @@ function drop_item($id,$interactive = true) { $matches = false; $cnt = preg_match_all('/<(.*?)>/',$item['file'],$matches,PREG_SET_ORDER); - if($cnt) { + if ($cnt) { foreach($matches as $mtch) { file_tag_unsave_file($item['uid'],$item['id'],$mtch[1],true); } @@ -1916,7 +1906,7 @@ function drop_item($id,$interactive = true) { $matches = false; $cnt = preg_match_all('/\[(.*?)\]/',$item['file'],$matches,PREG_SET_ORDER); - if($cnt) { + if ($cnt) { foreach($matches as $mtch) { file_tag_unsave_file($item['uid'],$item['id'],$mtch[1],false); } @@ -1927,7 +1917,7 @@ function drop_item($id,$interactive = true) { // This only applies to photos uploaded from the photos page. Photos inserted into a post do not // generate a resource-id and therefore aren't intimately linked to the item. - if(strlen($item['resource-id'])) { + if (strlen($item['resource-id'])) { q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ", dbesc($item['resource-id']), intval($item['uid']) @@ -1937,7 +1927,7 @@ function drop_item($id,$interactive = true) { // If item is a link to an event, nuke the event record. - if(intval($item['event-id'])) { + if (intval($item['event-id'])) { q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d", intval($item['event-id']), intval($item['uid']) @@ -1999,7 +1989,7 @@ function drop_item($id,$interactive = true) { // If it's the parent of a comment thread, kill all the kids - if($item['uri'] == $item['parent-uri']) { + if ($item['uri'] == $item['parent-uri']) { $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' , `title` = '' WHERE `parent-uri` = '%s' AND `uid` = %d ", dbesc(datetime_convert()), @@ -2011,8 +2001,7 @@ function drop_item($id,$interactive = true) { create_files_from_itemuri($item['parent-uri'], $item['uid']); delete_thread_uri($item['parent-uri'], $item['uid']); // ignore the result - } - else { + } else { // ensure that last-child is set in case the comment that had it just got wiped. q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ", dbesc(datetime_convert()), @@ -2024,7 +2013,7 @@ function drop_item($id,$interactive = true) { dbesc($item['parent-uri']), intval($item['uid']) ); - if(count($r)) { + if (count($r)) { q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d", intval($r[0]['id']) ); @@ -2037,13 +2026,12 @@ function drop_item($id,$interactive = true) { proc_run(PRIORITY_HIGH,"include/notifier.php", "drop", $drop_id); - if(! $interactive) + if (! $interactive) return $owner; goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); //NOTREACHED - } - else { - if(! $interactive) + } else { + if (! $interactive) return 0; notice( t('Permission denied.') . EOL); goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); @@ -2061,7 +2049,7 @@ function first_post_date($uid,$wall = false) { intval($uid), intval($wall ? 1 : 0) ); - if(count($r)) { + if (count($r)) { // logger('first_post_date: ' . $r[0]['id'] . ' ' . $r[0]['created'], LOGGER_DATA); return substr(datetime_convert('',date_default_timezone_get(),$r[0]['created']),0,10); } @@ -2073,7 +2061,7 @@ function list_post_dates($uid, $wall) { $dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d'); $dthen = first_post_date($uid, $wall); - if(! $dthen) + if (! $dthen) return array(); // Set the start and end date to the beginning of the month @@ -2091,7 +2079,7 @@ function list_post_dates($uid, $wall) { $start_month = datetime_convert('','',$dstart,'Y-m-d'); $end_month = datetime_convert('','',$dend,'Y-m-d'); $str = day_translate(datetime_convert('','',$dnow,'F')); - if(! $ret[$dyear]) + if (! $ret[$dyear]) $ret[$dyear] = array(); $ret[$dyear][] = array($str,$end_month,$start_month); $dnow = datetime_convert('','',$dnow . ' -1 month', 'Y-m-d'); @@ -2103,7 +2091,7 @@ function posted_dates($uid,$wall) { $dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d'); $dthen = first_post_date($uid,$wall); - if(! $dthen) + if (! $dthen) return array(); // Set the start and end date to the beginning of the month @@ -2129,21 +2117,21 @@ function posted_dates($uid,$wall) { function posted_date_widget($url,$uid,$wall) { $o = ''; - if(! feature_enabled($uid,'archives')) + if (! feature_enabled($uid,'archives')) return $o; // For former Facebook folks that left because of "timeline" -/* if($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget'))) +/* if ($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget'))) return $o;*/ $visible_years = get_pconfig($uid,'system','archive_visible_years'); - if(! $visible_years) + if (! $visible_years) $visible_years = 5; $ret = list_post_dates($uid,$wall); - if(! count($ret)) + if (! count($ret)) return $o; $cutoff_year = intval(datetime_convert('',date_default_timezone_get(),'now','Y')) - $visible_years; diff --git a/include/post_update.php b/include/post_update.php index a2b8497b9..b2d682d72 100644 --- a/include/post_update.php +++ b/include/post_update.php @@ -8,17 +8,18 @@ */ function post_update() { - if (!post_update_1192()) + if (!post_update_1192()) { return; - - if (!post_update_1194()) + } + if (!post_update_1194()) { return; - - if (!post_update_1198()) + } + if (!post_update_1198()) { return; - - if (!post_update_1206()) + } + if (!post_update_1206()) { return; + } } /** @@ -242,14 +243,15 @@ function post_update_1206() { FROM `user` INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`"); - if (!dbm::is_result($r)) + if (!dbm::is_result($r)) { return false; - + } foreach ($r AS $user) { - if (!empty($user["lastitem_date"]) AND ($user["lastitem_date"] > $user["last-item"])) + if (!empty($user["lastitem_date"]) AND ($user["lastitem_date"] > $user["last-item"])) { q("UPDATE `contact` SET `last-item` = '%s' WHERE `id` = %d", dbesc($user["lastitem_date"]), intval($user["id"])); + } } set_config("system", "post_update_version", 1206); diff --git a/mod/display.php b/mod/display.php index dcb9eb094..52e9b5928 100644 --- a/mod/display.php +++ b/mod/display.php @@ -2,7 +2,7 @@ function display_init(&$a) { - if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + if ((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { return; } @@ -19,7 +19,7 @@ function display_init(&$a) { $r = qu("SELECT `id`, `parent`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `guid` = '%s' AND `uid` = %d", dbesc($a->argv[1]), local_user()); - if (count($r)) { + if (dbm::isresult($r)) { $nick = $a->user["nickname"]; $itemuid = local_user(); } @@ -35,7 +35,7 @@ function display_init(&$a) { AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND NOT `item`.`private` AND NOT `user`.`hidewall` AND `item`.`guid` = '%s'", dbesc($a->argv[1])); - if (count($r)) { + if (dbm::isresult($r)) { $nick = $r[0]["nickname"]; $itemuid = $r[0]["uid"]; } @@ -51,12 +51,12 @@ function display_init(&$a) { AND NOT `item`.`private` AND `item`.`uid` = 0 AND `item`.`guid` = '%s'", dbesc($a->argv[1])); } - if (count($r)) { - if ($r[0]["id"] != $r[0]["parent"]) + if (dbm::isresult($r)) { + if ($r[0]["id"] != $r[0]["parent"]) { $r = qu("SELECT `id`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `id` = %d", $r[0]["parent"]); - + } if (($itemuid != local_user()) AND local_user()) { // Do we know this contact but we haven't got this item? // Copy the wohle thread to our local storage so that we can interact. @@ -66,9 +66,9 @@ function display_init(&$a) { $items = qu("SELECT * FROM `item` WHERE `parent` = %d ORDER BY `id`", intval($r[0]["id"])); foreach ($items AS $item) { $itemcontactid = get_contact($item['owner-link'], local_user()); - if (!$itemcontactid) + if (!$itemcontactid) { $itemcontactid = $contactid; - + } unset($item['id']); $item['uid'] = local_user(); $item['origin'] = 0; @@ -90,16 +90,17 @@ function display_init(&$a) { WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` AND `contact`.`self` LIMIT 1", dbesc($nickname) ); - if (count($r)) + if (dbm::isresult($r)) { $profiledata = $r[0]; - + } $profiledata["network"] = NETWORK_DFRN; - } else + } else { $profiledata = array(); + } } } else { $a->error = 404; - notice( t('Item not found.') . EOL); + notice(t('Item not found.') . EOL); return; } } @@ -127,48 +128,49 @@ function display_fetchauthor($a, $item) { // Skip if it isn't a pure repeated messages // Does it start with a share? - if (!$skip AND strpos($body, "[share") > 0) + if (!$skip AND strpos($body, "[share") > 0) } $skip = true; - + } // Does it end with a share? - if (!$skip AND (strlen($body) > (strrpos($body, "[/share]") + 8))) + if (!$skip AND (strlen($body) > (strrpos($body, "[/share]") + 8))) { $skip = true; - + } if (!$skip) { $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body); // Skip if there is no shared message in there - if ($body == $attributes) + if ($body == $attributes) { $skip = true; + } } if (!$skip) { $author = ""; preg_match("/author='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if ($matches[1] != "") { $profiledata["name"] = html_entity_decode($matches[1],ENT_QUOTES,'UTF-8'); - + } preg_match('/author="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if ($matches[1] != "") { $profiledata["name"] = html_entity_decode($matches[1],ENT_QUOTES,'UTF-8'); - + } $profile = ""; preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if ($matches[1] != "") { $profiledata["url"] = $matches[1]; - + } preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if ($matches[1] != "") { $profiledata["url"] = $matches[1]; - + } $avatar = ""; preg_match("/avatar='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if ($matches[1] != "") { $profiledata["photo"] = $matches[1]; - + } preg_match('/avatar="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if ($matches[1] != "") { $profiledata["photo"] = $matches[1]; - + } $profiledata["nickname"] = $profiledata["name"]; $profiledata["network"] = GetProfileUsername($profiledata["url"], "", false, true); @@ -181,8 +183,9 @@ function display_fetchauthor($a, $item) { $profiledata["photo"] = App::remove_baseurl($profiledata["photo"]); if (local_user()) { - if (in_array($profiledata["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) + if (in_array($profiledata["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) { $profiledata["remoteconnect"] = $a->get_baseurl()."/follow?url=".urlencode($profiledata["url"]); + } } elseif ($profiledata["network"] == NETWORK_DFRN) { $connect = str_replace("/profile/", "/dfrn_request/", $profiledata["url"]); $profiledata["remoteconnect"] = $connect; @@ -193,8 +196,8 @@ function display_fetchauthor($a, $item) { function display_content(&$a, $update = 0) { - if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { - notice( t('Public access denied.') . EOL); + if ((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + notice(t('Public access denied.') . EOL); return; } @@ -208,18 +211,16 @@ function display_content(&$a, $update = 0) { $a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array()); - if($update) { + if ($update) { $nick = $_REQUEST['nick']; - } - else { + } else { $nick = (($a->argc > 1) ? $a->argv[1] : ''); } - if($update) { + if ($update) { $item_id = $_REQUEST['item_id']; $a->profile = array('uid' => intval($update), 'profile_uid' => intval($update)); - } - else { + } else { $item_id = (($a->argc > 2) ? $a->argv[2] : 0); if ($a->argc == 2) { @@ -229,7 +230,7 @@ function display_content(&$a, $update = 0) { $r = qu("SELECT `id` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `guid` = '%s' AND `uid` = %d", dbesc($a->argv[1]), local_user()); - if (count($r)) { + if (dbm::isresult($r)) { $item_id = $r[0]["id"]; $nick = $a->user["nickname"]; } @@ -243,7 +244,7 @@ function display_content(&$a, $update = 0) { AND NOT `item`.`private` AND NOT `user`.`hidewall` AND `item`.`guid` = '%s'", dbesc($a->argv[1])); // AND NOT `item`.`private` AND `item`.`wall` - if (count($r)) { + if (dbm::isresult($r)) { $item_id = $r[0]["id"]; $nick = $r[0]["nickname"]; } @@ -256,7 +257,7 @@ function display_content(&$a, $update = 0) { AND NOT `item`.`private` AND `item`.`uid` = 0 AND `item`.`guid` = '%s'", dbesc($a->argv[1])); // AND NOT `item`.`private` AND `item`.`wall` - if (count($r)) { + if (dbm::isresult($r)) { $item_id = $r[0]["id"]; } } @@ -266,10 +267,11 @@ function display_content(&$a, $update = 0) { if ($item_id AND !is_numeric($item_id)) { $r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($item_id), intval($a->profile['uid'])); - if ($r) + if (dbm::is_result($r)) { $item_id = $r[0]["id"]; - else + } else { $item_id = false; + } } if (!$item_id) { @@ -286,29 +288,29 @@ function display_content(&$a, $update = 0) { $contact_id = 0; - if(is_array($_SESSION['remote'])) { - foreach($_SESSION['remote'] as $v) { - if($v['uid'] == $a->profile['uid']) { + if (is_array($_SESSION['remote'])) { + foreach ($_SESSION['remote'] as $v) { + if ($v['uid'] == $a->profile['uid']) { $contact_id = $v['cid']; break; } } } - if($contact_id) { + if ($contact_id) { $groups = init_groups_visitor($contact_id); $r = qu("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($contact_id), intval($a->profile['uid']) ); - if(count($r)) { + if (dbm::isresult($r)) { $contact = $r[0]; $remote_contact = true; } } - if(! $remote_contact) { - if(local_user()) { + if (!$remote_contact) { + if (local_user()) { $contact_id = $_SESSION['cid']; $contact = $a->contact; } @@ -317,13 +319,13 @@ function display_content(&$a, $update = 0) { $r = qu("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1", intval($a->profile['uid']) ); - if(count($r)) + if (dbm::isresult($r)) { $a->page_contact = $r[0]; - + } $is_owner = ((local_user()) && (local_user() == $a->profile['profile_uid']) ? true : false); - if($a->profile['hidewall'] && (! $is_owner) && (! $remote_contact)) { - notice( t('Access to this profile has been restricted.') . EOL); + if ($a->profile['hidewall'] && (! $is_owner) && (! $remote_contact)) { + notice(t('Access to this profile has been restricted.') . EOL); return; } @@ -347,7 +349,7 @@ function display_content(&$a, $update = 0) { $sql_extra = item_permissions_sql($a->profile['uid'],$remote_contact,$groups); - if($update) { + if ($update) { $r = qu("SELECT `id` FROM `item` WHERE `item`.`uid` = %d AND `item`.`parent` = (SELECT `parent` FROM `item` WHERE `id` = %d) @@ -356,8 +358,9 @@ function display_content(&$a, $update = 0) { intval($item_id) ); - if(!$r) + if (!$r) { return ''; + } } $r = qu(item_query()." AND `item`.`uid` = %d @@ -369,7 +372,7 @@ function display_content(&$a, $update = 0) { ); - if(!$r && local_user()) { + if (!$r && local_user()) { // Check if this is another person's link to a post that we have $r = qu("SELECT `item`.uri FROM `item` WHERE (`item`.`id` = %d OR `item`.`uri` = '%s') @@ -377,7 +380,7 @@ function display_content(&$a, $update = 0) { intval($item_id), dbesc($item_id) ); - if($r) { + if (dbm::is_result($r)) { $item_uri = $r[0]['uri']; $r = qu(item_query()." AND `item`.`uid` = %d @@ -390,23 +393,24 @@ function display_content(&$a, $update = 0) { } } - if($r) { + if ($r) { - if((local_user()) && (local_user() == $a->profile['uid'])) { + if ((local_user()) && (local_user() == $a->profile['uid'])) { $unseen = q("SELECT `id` FROM `item` WHERE `unseen` AND `parent` = %d", intval($r[0]['parent'])); - if ($unseen) - q("UPDATE `item` SET `unseen` = 0 - WHERE `parent` = %d AND `unseen`", + if ($unseen) { + q("UPDATE `item` SET `unseen` = 0 WHERE `parent` = %d AND `unseen`", intval($r[0]['parent']) ); + } } $items = conv_sort($r,"`commented`"); - if(!$update) + if (!$update) { $o .= ""; + } $o .= conversation($a,$items,'display', $update); // Preparing the meta header @@ -418,9 +422,9 @@ function display_content(&$a, $update = 0) { $image = $a->remove_baseurl($r[0]["thumb"]); - if ($title == "") + if ($title == "") { $title = $author_name; - + } $description = htmlspecialchars($description, ENT_COMPAT, 'UTF-8', true); // allow double encoding here $title = htmlspecialchars($title, ENT_COMPAT, 'UTF-8', true); // allow double encoding here $author_name = htmlspecialchars($author_name, ENT_COMPAT, 'UTF-8', true); // allow double encoding here @@ -464,16 +468,14 @@ function display_content(&$a, $update = 0) { dbesc($item_id), dbesc($item_id) ); - if($r) { - if($r[0]['deleted']) { - notice( t('Item has been removed.') . EOL ); + if ($r) { + if ($r[0]['deleted']) { + notice(t('Item has been removed.') . EOL ); + } else { + notice(t('Permission denied.') . EOL ); } - else { - notice( t('Permission denied.') . EOL ); - } - } - else { - notice( t('Item not found.') . EOL ); + } else { + notice(t('Item not found.') . EOL ); } return $o; diff --git a/mod/nodeinfo.php b/mod/nodeinfo.php index 0d1328029..40094ee6e 100644 --- a/mod/nodeinfo.php +++ b/mod/nodeinfo.php @@ -217,7 +217,6 @@ function nodeinfo_cron() { set_config('nodeinfo','active_users_monthly', $active_users_monthly); } - //$posts = qu("SELECT COUNT(*) AS local_posts FROM `item` WHERE `wall` AND `uid` != 0 AND `id` = `parent` AND left(body, 6) != '[share'"); $posts = qu("SELECT COUNT(*) AS `local_posts` FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` WHERE `contact`.`self` and `item`.`id` = `item`.`parent` AND left(body, 6) != '[share' AND `item`.`network` IN ('%s', '%s', '%s')", diff --git a/mod/photos.php b/mod/photos.php index ced9523e2..19d3d1c6c 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -12,10 +12,10 @@ require_once('include/Probe.php'); function photos_init(&$a) { - if($a->argc > 1) + if ($a->argc > 1) auto_redir($a, $a->argv[1]); - if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + if ((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { return; } @@ -23,13 +23,13 @@ function photos_init(&$a) { $o = ''; - if($a->argc > 1) { + if ($a->argc > 1) { $nick = $a->argv[1]; $user = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `blocked` = 0 LIMIT 1", dbesc($nick) ); - if(! count($user)) + if (! count($user)) return; $a->data['user'] = $user[0]; @@ -53,7 +53,7 @@ function photos_init(&$a) { $sql_extra = permissions_sql($a->data['user']['uid']); - $albums = q("SELECT count(distinct `resource-id`) AS `total`, `album` FROM `photo` USE INDEX (`uid_album_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' + $albums = qu("SELECT count(distinct `resource-id`) AS `total`, `album` FROM `photo` USE INDEX (`uid_album_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra GROUP BY `album` ORDER BY `created` DESC", intval($a->data['user']['uid']), dbesc('Contact Photos'), @@ -65,15 +65,15 @@ function photos_init(&$a) { // add various encodings to the array so we can just loop through and pick them out in a template $ret = array('success' => false); - if($albums) { + if ($albums) { $a->data['albums'] = $albums; if ($albums_visible) $ret['success'] = true; $ret['albums'] = array(); - foreach($albums as $k => $album) { + foreach ($albums as $k => $album) { //hide profile photos to others - if((! $is_owner) && (! remote_user()) && ($album['album'] == t('Profile Photos'))) + if ((! $is_owner) && (! remote_user()) && ($album['album'] == t('Profile Photos'))) continue; $entry = array( 'text' => $album['album'], @@ -88,10 +88,10 @@ function photos_init(&$a) { $albums = $ret; - if(local_user() && $a->data['user']['uid'] == local_user()) + if (local_user() && $a->data['user']['uid'] == local_user()) $can_post = true; - if($albums['success']) { + if ($albums['success']) { $photo_albums_widget = replace_macros(get_markup_template('photo_albums.tpl'),array( '$nick' => $a->data['user']['nickname'], '$title' => t('Photo Albums'), @@ -104,7 +104,7 @@ function photos_init(&$a) { } - if(! x($a->page,'aside')) + if (! x($a->page,'aside')) $a->page['aside'] = ''; $a->page['aside'] .= $vcard_widget; $a->page['aside'] .= $photo_albums_widget; @@ -138,26 +138,26 @@ function photos_post(&$a) { $page_owner_uid = $a->data['user']['uid']; $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false); - if((local_user()) && (local_user() == $page_owner_uid)) + if ((local_user()) && (local_user() == $page_owner_uid)) $can_post = true; else { - if($community_page && remote_user()) { + if ($community_page && remote_user()) { $cid = 0; - if(is_array($_SESSION['remote'])) { - foreach($_SESSION['remote'] as $v) { - if($v['uid'] == $page_owner_uid) { + if (is_array($_SESSION['remote'])) { + foreach ($_SESSION['remote'] as $v) { + if ($v['uid'] == $page_owner_uid) { $cid = $v['cid']; break; } } } - if($cid) { + if ($cid) { $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", intval($cid), intval($page_owner_uid) ); - if(count($r)) { + if (dbm::is_result($r)) { $can_post = true; $visitor = $cid; } @@ -165,7 +165,7 @@ function photos_post(&$a) { } } - if(! $can_post) { + if (! $can_post) { notice( t('Permission denied.') . EOL ); killme(); } @@ -175,7 +175,7 @@ function photos_post(&$a) { intval($page_owner_uid) ); - if(! count($r)) { + if (! count($r)) { notice( t('Contact information unavailable') . EOL); logger('photos_post: unable to locate contact record for page owner. uid=' . $page_owner_uid); killme(); @@ -184,10 +184,10 @@ function photos_post(&$a) { $owner_record = $r[0]; - if(($a->argc > 3) && ($a->argv[2] === 'album')) { + if (($a->argc > 3) && ($a->argv[2] === 'album')) { $album = hex2bin($a->argv[3]); - if($album === t('Profile Photos') || $album === 'Contact Photos' || $album === t('Contact Photos')) { + if ($album === t('Profile Photos') || $album === 'Contact Photos' || $album === t('Contact Photos')) { goaway($_SESSION['photo_return']); return; // NOTREACHED } @@ -196,14 +196,14 @@ function photos_post(&$a) { dbesc($album), intval($page_owner_uid) ); - if(! count($r)) { + if (! count($r)) { notice( t('Album not found.') . EOL); goaway($_SESSION['photo_return']); return; // NOTREACHED } // Check if the user has responded to a delete confirmation query - if($_REQUEST['canceled']) { + if ($_REQUEST['canceled']) { goaway($_SESSION['photo_return']); } @@ -212,7 +212,7 @@ function photos_post(&$a) { */ $newalbum = notags(trim($_POST['albumname'])); - if($newalbum != $album) { + if ($newalbum != $album) { q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d", dbesc($newalbum), dbesc($album), @@ -227,10 +227,10 @@ function photos_post(&$a) { * DELETE photo album and all its photos */ - if($_POST['dropalbum'] == t('Delete Album')) { + if ($_POST['dropalbum'] == t('Delete Album')) { // Check if we should do HTML-based delete confirmation - if($_REQUEST['confirm']) { + if ($_REQUEST['confirm']) { $drop_url = $a->query_string; $extra_inputs = array( array('name' => 'albumname', 'value' => $_POST['albumname']), @@ -252,25 +252,23 @@ function photos_post(&$a) { // get the list of photos we are about to delete - if($visitor) { + if ($visitor) { $r = q("SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `album` = '%s'", intval($visitor), intval($page_owner_uid), dbesc($album) ); - } - else { + } else { $r = q("SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `uid` = %d AND `album` = '%s'", intval(local_user()), dbesc($album) ); } - if(count($r)) { - foreach($r as $rr) { + if (dbm::is_result($r)) { + foreach ($r as $rr) { $res[] = "'" . dbesc($rr['rid']) . "'" ; } - } - else { + } else { goaway($_SESSION['photo_return']); return; // NOTREACHED } @@ -288,8 +286,8 @@ function photos_post(&$a) { $r = q("SELECT `parent-uri` FROM `item` WHERE `resource-id` IN ( $str_res ) AND `uid` = %d", intval($page_owner_uid) ); - if(count($r)) { - foreach($r as $rr) { + if (dbm::is_result($r)) { + foreach ($r as $rr) { q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d", dbesc(datetime_convert()), dbesc($rr['parent-uri']), @@ -302,7 +300,7 @@ function photos_post(&$a) { // send the notification upstream/downstream as the case may be - if($rr['visible']) + if ($rr['visible']) proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $drop_id); } } @@ -313,16 +311,16 @@ function photos_post(&$a) { // Check if the user has responded to a delete confirmation query for a single photo - if(($a->argc > 2) && $_REQUEST['canceled']) { + if (($a->argc > 2) && $_REQUEST['canceled']) { goaway($_SESSION['photo_return']); } - if(($a->argc > 2) && (x($_POST,'delete')) && ($_POST['delete'] == t('Delete Photo'))) { + if (($a->argc > 2) && (x($_POST,'delete')) && ($_POST['delete'] == t('Delete Photo'))) { // same as above but remove single photo // Check if we should do HTML-based delete confirmation - if($_REQUEST['confirm']) { + if ($_REQUEST['confirm']) { $drop_url = $a->query_string; $a->page['content'] = replace_macros(get_markup_template('confirm.tpl'), array( '$method' => 'post', @@ -337,20 +335,19 @@ function photos_post(&$a) { return; } - if($visitor) { + if ($visitor) { $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `resource-id` = '%s' LIMIT 1", intval($visitor), intval($page_owner_uid), dbesc($a->argv[2]) ); - } - else { + } else { $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' LIMIT 1", intval(local_user()), dbesc($a->argv[2]) ); } - if(count($r)) { + if (dbm::is_result($r)) { q("DELETE FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s'", intval($page_owner_uid), dbesc($r[0]['resource-id']) @@ -359,7 +356,7 @@ function photos_post(&$a) { dbesc($r[0]['resource-id']), intval($page_owner_uid) ); - if(count($i)) { + if (count($i)) { q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d", dbesc(datetime_convert()), dbesc(datetime_convert()), @@ -372,7 +369,7 @@ function photos_post(&$a) { $url = $a->get_baseurl(); $drop_id = intval($i[0]['id']); - if($i[0]['visible']) + if ($i[0]['visible']) proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $drop_id); } } @@ -381,7 +378,7 @@ function photos_post(&$a) { return; // NOTREACHED } - if(($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) { + if (($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) { $desc = ((x($_POST,'desc')) ? notags(trim($_POST['desc'])) : ''); $rawtags = ((x($_POST,'newtag')) ? notags(trim($_POST['newtag'])) : ''); @@ -394,11 +391,11 @@ function photos_post(&$a) { $resource_id = $a->argv[2]; - if(! strlen($albname)) + if (! strlen($albname)) $albname = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y'); - if((x($_POST,'rotate') !== false) && + if ((x($_POST,'rotate') !== false) && ( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) { logger('rotate'); @@ -406,9 +403,9 @@ function photos_post(&$a) { dbesc($resource_id), intval($page_owner_uid) ); - if(count($r)) { + if (dbm::is_result($r)) { $ph = new Photo($r[0]['data'], $r[0]['type']); - if($ph->is_valid()) { + if ($ph->is_valid()) { $rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 ); $ph->rotate($rotate_deg); @@ -423,7 +420,7 @@ function photos_post(&$a) { intval($page_owner_uid) ); - if($width > 640 || $height > 640) { + if ($width > 640 || $height > 640) { $ph->scaleImage(640); $width = $ph->getWidth(); $height = $ph->getHeight(); @@ -437,7 +434,7 @@ function photos_post(&$a) { ); } - if($width > 320 || $height > 320) { + if ($width > 320 || $height > 320) { $ph->scaleImage(320); $width = $ph->getWidth(); $height = $ph->getHeight(); @@ -458,7 +455,7 @@ function photos_post(&$a) { dbesc($resource_id), intval($page_owner_uid) ); - if(count($p)) { + if (count($p)) { $ext = $phototypes[$p[0]['type']]; $r = q("UPDATE `photo` SET `desc` = '%s', `album` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource-id` = '%s' AND `uid` = %d", dbesc($desc), @@ -475,10 +472,10 @@ function photos_post(&$a) { /* Don't make the item visible if the only change was the album name */ $visibility = 0; - if($p[0]['desc'] !== $desc || strlen($rawtags)) + if ($p[0]['desc'] !== $desc || strlen($rawtags)) $visibility = 1; - if(! $item_id) { + if (! $item_id) { // Create item container @@ -517,18 +514,18 @@ function photos_post(&$a) { } - if($item_id) { + if ($item_id) { $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($item_id), intval($page_owner_uid) ); } - if(count($r)) { + if (dbm::is_result($r)) { $old_tag = $r[0]['tag']; $old_inform = $r[0]['inform']; } - if(strlen($rawtags)) { + if (strlen($rawtags)) { $str_tags = ''; $inform = ''; @@ -536,49 +533,47 @@ function photos_post(&$a) { // if the new tag doesn't have a namespace specifier (@foo or #foo) give it a hashtag $x = substr($rawtags,0,1); - if($x !== '@' && $x !== '#') + if ($x !== '@' && $x !== '#') $rawtags = '#' . $rawtags; $taginfo = array(); $tags = get_tags($rawtags); - if(count($tags)) { - foreach($tags as $tag) { - if(isset($profile)) + if (count($tags)) { + foreach ($tags as $tag) { + if (isset($profile)) unset($profile); - if(strpos($tag,'@') === 0) { + if (strpos($tag,'@') === 0) { $name = substr($tag,1); - if((strpos($name,'@')) || (strpos($name,'http://'))) { + if ((strpos($name,'@')) || (strpos($name,'http://'))) { $newname = $name; $links = @Probe::lrdd($name); - if(count($links)) { - foreach($links as $link) { - if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page') + if (count($links)) { + foreach ($links as $link) { + if ($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page') $profile = $link['@attributes']['href']; - if($link['@attributes']['rel'] === 'salmon') { + if ($link['@attributes']['rel'] === 'salmon') { $salmon = '$url:' . str_replace(',','%sc',$link['@attributes']['href']); - if(strlen($inform)) + if (strlen($inform)) $inform .= ','; $inform .= $salmon; } } } $taginfo[] = array($newname,$profile,$salmon); - } - else { + } else { $newname = $name; $alias = ''; $tagcid = 0; - if(strrpos($newname,'+')) + if (strrpos($newname,'+')) $tagcid = intval(substr($newname,strrpos($newname,'+') + 1)); - if($tagcid) { + if ($tagcid) { $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($tagcid), intval($profile_uid) ); - } - else { + } else { $newname = str_replace('_',' ',$name); //select someone from this user's contacts by name @@ -587,7 +582,7 @@ function photos_post(&$a) { intval($page_owner_uid) ); - if(! $r) { + if (! $r) { //select someone by attag or nick and the name passed in $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", dbesc($name), @@ -596,35 +591,34 @@ function photos_post(&$a) { ); } } -/* elseif(strstr($name,'_') || strstr($name,' ')) { +/* elseif (strstr($name,'_') || strstr($name,' ')) { $newname = str_replace('_',' ',$name); $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1", dbesc($newname), intval($page_owner_uid) ); - } - else { + } else { $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", dbesc($name), dbesc($name), intval($page_owner_uid) ); }*/ - if(count($r)) { + if (dbm::is_result($r)) { $newname = $r[0]['name']; $profile = $r[0]['url']; $notify = 'cid:' . $r[0]['id']; - if(strlen($inform)) + if (strlen($inform)) $inform .= ','; $inform .= $notify; } } - if($profile) { - if(substr($notify,0,4) === 'cid:') + if ($profile) { + if (substr($notify,0,4) === 'cid:') $taginfo[] = array($newname,$profile,$notify,$r[0],'@[url=' . str_replace(',','%2c',$profile) . ']' . $newname . '[/url]'); else $taginfo[] = array($newname,$profile,$notify,null,$str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]'); - if(strlen($str_tags)) + if (strlen($str_tags)) $str_tags .= ','; $profile = str_replace(',','%2c',$profile); $str_tags .= '@[url='.$profile.']'.$newname.'[/url]'; @@ -637,12 +631,12 @@ function photos_post(&$a) { } $newtag = $old_tag; - if(strlen($newtag) && strlen($str_tags)) + if (strlen($newtag) && strlen($str_tags)) $newtag .= ','; $newtag .= $str_tags; $newinform = $old_inform; - if(strlen($newinform) && strlen($inform)) + if (strlen($newinform) && strlen($inform)) $newinform .= ','; $newinform .= $inform; @@ -658,19 +652,19 @@ function photos_post(&$a) { update_thread($item_id); $best = 0; - foreach($p as $scales) { - if(intval($scales['scale']) == 2) { + foreach ($p as $scales) { + if (intval($scales['scale']) == 2) { $best = 2; break; } - if(intval($scales['scale']) == 4) { + if (intval($scales['scale']) == 4) { $best = 4; break; } } - if(count($taginfo)) { - foreach($taginfo as $tagged) { + if (count($taginfo)) { + foreach ($taginfo as $tagged) { $uri = item_new_uri($a->get_hostname(),$page_owner_uid); @@ -706,7 +700,7 @@ function photos_post(&$a) { $arr['object'] = '' . ACTIVITY_OBJ_PERSON . '' . $tagged[0] . '' . $tagged[1] . '/' . $tagged[0] . ''; $arr['object'] .= '' . xmlify('' . "\n"); - if($tagged[3]) + if ($tagged[3]) $arr['object'] .= xmlify('' . "\n"); $arr['object'] .= '' . "\n"; @@ -715,7 +709,7 @@ function photos_post(&$a) { $arr['target'] .= '' . xmlify('' . "\n" . '') . ''; $item_id = item_store($arr); - if($item_id) { + if ($item_id) { proc_run(PRIORITY_HIGH, "include/notifier.php", "tag", $item_id); } } @@ -743,8 +737,8 @@ function photos_post(&$a) { logger('mod/photos.php: photos_post(): album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG); - if(! strlen($album)) { - if(strlen($newalbum)) + if (! strlen($album)) { + if (strlen($newalbum)) $album = $newalbum; else $album = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y'); @@ -764,12 +758,12 @@ function photos_post(&$a) { dbesc($album), intval($page_owner_uid) ); - if((! count($r)) || ($album == t('Profile Photos'))) + if ((! count($r)) || ($album == t('Profile Photos'))) $visible = 1; else $visible = 0; - if(intval($_REQUEST['not_visible']) || $_REQUEST['not_visible'] === 'true') + if (intval($_REQUEST['not_visible']) || $_REQUEST['not_visible'] === 'true') $visible = 0; $str_group_allow = perms2str(((is_array($_REQUEST['group_allow'])) ? $_REQUEST['group_allow'] : explode(',',$_REQUEST['group_allow']))); @@ -781,13 +775,12 @@ function photos_post(&$a) { call_hooks('photo_post_file',$ret); - if(x($ret,'src') && x($ret,'filesize')) { + if (x($ret,'src') && x($ret,'filesize')) { $src = $ret['src']; $filename = $ret['filename']; $filesize = $ret['filesize']; $type = $ret['type']; - } - else { + } else { $src = $_FILES['userfile']['tmp_name']; $filename = basename($_FILES['userfile']['name']); $filesize = intval($_FILES['userfile']['size']); @@ -799,7 +792,7 @@ function photos_post(&$a) { $maximagesize = get_config('system','maximagesize'); - if(($maximagesize) && ($filesize > $maximagesize)) { + if (($maximagesize) && ($filesize > $maximagesize)) { notice( sprintf(t('Image exceeds size limit of %s'), formatBytes($maximagesize)) . EOL); @unlink($src); $foo = 0; @@ -807,7 +800,7 @@ function photos_post(&$a) { return; } - if(! $filesize) { + if (! $filesize) { notice( t('Image file is empty.') . EOL); @unlink($src); $foo = 0; @@ -827,7 +820,7 @@ function photos_post(&$a) { $limit = service_class_fetch($a->data['user']['uid'],'photo_upload_limit'); - if(($limit !== false) && (($r[0]['total'] + strlen($imagedata)) > $limit)) { + if (($limit !== false) && (($r[0]['total'] + strlen($imagedata)) > $limit)) { notice( upgrade_message() . EOL ); @unlink($src); $foo = 0; @@ -838,7 +831,7 @@ function photos_post(&$a) { $ph = new Photo($imagedata, $type); - if(! $ph->is_valid()) { + if (! $ph->is_valid()) { logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG); notice( t('Unable to process image.') . EOL ); @unlink($src); @@ -851,9 +844,9 @@ function photos_post(&$a) { @unlink($src); $max_length = get_config('system','max_image_length'); - if(! $max_length) + if (! $max_length) $max_length = MAX_IMAGE_LENGTH; - if($max_length > 0) + if ($max_length > 0) $ph->scaleImage($max_length); $width = $ph->getWidth(); @@ -865,19 +858,19 @@ function photos_post(&$a) { $r = $ph->store($page_owner_uid, $visitor, $photo_hash, $filename, $album, 0 , 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny); - if(! $r) { + if (! $r) { logger('mod/photos.php: photos_post(): image store failed' , LOGGER_DEBUG); notice( t('Image upload failed.') . EOL ); killme(); } - if($width > 640 || $height > 640) { + if ($width > 640 || $height > 640) { $ph->scaleImage(640); $ph->store($page_owner_uid, $visitor, $photo_hash, $filename, $album, 1, 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny); $smallest = 1; } - if($width > 320 || $height > 320) { + if ($width > 320 || $height > 320) { $ph->scaleImage(320); $ph->store($page_owner_uid, $visitor, $photo_hash, $filename, $album, 2, 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny); $smallest = 2; @@ -890,8 +883,8 @@ function photos_post(&$a) { $lat = $lon = null; - if($exif && $exif['GPS']) { - if(feature_enabled($channel_id,'photo_location')) { + if ($exif && $exif['GPS']) { + if (feature_enabled($channel_id,'photo_location')) { $lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']); $lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']); } @@ -899,7 +892,7 @@ function photos_post(&$a) { $arr = array(); - if($lat && $lon) + if ($lat && $lon) $arr['coord'] = $lat . ' ' . $lon; $arr['guid'] = get_guid(32); @@ -931,7 +924,7 @@ function photos_post(&$a) { $item_id = item_store($arr); - if($visible) + if ($visible) proc_run(PRIORITY_HIGH, "include/notifier.php", 'wall-new', $item_id); call_hooks('photo_post_end',intval($item_id)); @@ -957,7 +950,7 @@ function photos_content(&$a) { // photos/name/image/xxxxx/edit - if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + if ((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { notice( t('Public access denied.') . EOL); return; } @@ -967,7 +960,7 @@ function photos_content(&$a) { require_once('include/security.php'); require_once('include/conversation.php'); - if(! x($a->data,'user')) { + if (! x($a->data,'user')) { notice( t('No photos selected') . EOL ); return; } @@ -980,16 +973,15 @@ function photos_content(&$a) { // Parse arguments // - if($a->argc > 3) { + if ($a->argc > 3) { $datatype = $a->argv[2]; $datum = $a->argv[3]; - } - elseif(($a->argc > 2) && ($a->argv[2] === 'upload')) + } elseif (($a->argc > 2) && ($a->argv[2] === 'upload')) $datatype = 'upload'; else $datatype = 'summary'; - if($a->argc > 4) + if ($a->argc > 4) $cmd = $a->argv[4]; else $cmd = 'view'; @@ -1008,25 +1000,25 @@ function photos_content(&$a) { $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false); - if((local_user()) && (local_user() == $owner_uid)) + if ((local_user()) && (local_user() == $owner_uid)) $can_post = true; else { - if($community_page && remote_user()) { - if(is_array($_SESSION['remote'])) { - foreach($_SESSION['remote'] as $v) { - if($v['uid'] == $owner_uid) { + if ($community_page && remote_user()) { + if (is_array($_SESSION['remote'])) { + foreach ($_SESSION['remote'] as $v) { + if ($v['uid'] == $owner_uid) { $contact_id = $v['cid']; break; } } } - if($contact_id) { + if ($contact_id) { $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", intval($contact_id), intval($owner_uid) ); - if(count($r)) { + if (dbm::is_result($r)) { $can_post = true; $contact = $r[0]; $remote_contact = true; @@ -1038,37 +1030,37 @@ function photos_content(&$a) { // perhaps they're visiting - but not a community page, so they wouldn't have write access - if(remote_user() && (! $visitor)) { + if (remote_user() && (! $visitor)) { $contact_id = 0; - if(is_array($_SESSION['remote'])) { - foreach($_SESSION['remote'] as $v) { - if($v['uid'] == $owner_uid) { + if (is_array($_SESSION['remote'])) { + foreach ($_SESSION['remote'] as $v) { + if ($v['uid'] == $owner_uid) { $contact_id = $v['cid']; break; } } } - if($contact_id) { + if ($contact_id) { $groups = init_groups_visitor($contact_id); $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", intval($contact_id), intval($owner_uid) ); - if(count($r)) { + if (dbm::is_result($r)) { $contact = $r[0]; $remote_contact = true; } } } - if(! $remote_contact) { - if(local_user()) { + if (! $remote_contact) { + if (local_user()) { $contact_id = $_SESSION['cid']; $contact = $a->contact; } } - if($a->data['user']['hidewall'] && (local_user() != $owner_uid) && (! $remote_contact)) { + if ($a->data['user']['hidewall'] && (local_user() != $owner_uid) && (! $remote_contact)) { notice( t('Access to this item is restricted.') . EOL); return; } @@ -1085,8 +1077,8 @@ function photos_content(&$a) { * Display upload form */ - if($datatype === 'upload') { - if(! ($can_post)) { + if ($datatype === 'upload') { + if (! ($can_post)) { notice( t('Permission denied.')); return; } @@ -1099,9 +1091,9 @@ function photos_content(&$a) { $albumselect .= ''; - if(count($a->data['albums'])) { - foreach($a->data['albums'] as $album) { - if(($album['album'] === '') || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos'))) + if (count($a->data['albums'])) { + foreach ($a->data['albums'] as $album) { + if (($album['album'] === '') || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos'))) continue; $selected = (($selname === $album['album']) ? ' selected="selected" ' : ''); $albumselect .= ''; @@ -1124,7 +1116,7 @@ function photos_content(&$a) { $usage_message = ''; $limit = service_class_fetch($a->data['user']['uid'],'photo_upload_limit'); - if($limit !== false) { + if ($limit !== false) { $r = q("select sum(datasize) as total from photo where uid = %d and scale = 0 and album != 'Contact Photos' ", intval($a->data['user']['uid']) @@ -1135,17 +1127,17 @@ function photos_content(&$a) { // Private/public post links for the non-JS ACL form $private_post = 1; - if($_REQUEST['public']) + if ($_REQUEST['public']) $private_post = 0; $query_str = $a->query_string; - if(strpos($query_str, 'public=1') !== false) + if (strpos($query_str, 'public=1') !== false) $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str); // I think $a->query_string may never have ? in it, but I could be wrong // It looks like it's from the index.php?q=[etc] rewrite that the web // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61 - if(strpos($query_str, '?') === false) + if (strpos($query_str, '?') === false) $public_post_link = '?public=1'; else $public_post_link = '&public=1'; @@ -1154,11 +1146,10 @@ function photos_content(&$a) { $tpl = get_markup_template('photos_upload.tpl'); - if($a->theme['template_engine'] === 'internal') { + if ($a->theme['template_engine'] === 'internal') { $albumselect_e = template_escape($albumselect); $aclselect_e = (($visitor) ? '' : template_escape(populate_acl($a->user))); - } - else { + } else { $albumselect_e = $albumselect; $aclselect_e = (($visitor) ? '' : populate_acl($a->user)); } @@ -1198,7 +1189,7 @@ function photos_content(&$a) { * Display a single photo album */ - if($datatype === 'album') { + if ($datatype === 'album') { $album = hex2bin($datum); @@ -1207,12 +1198,12 @@ function photos_content(&$a) { intval($owner_uid), dbesc($album) ); - if(count($r)) { + if (dbm::is_result($r)) { $a->set_pager_total(count($r)); $a->set_pager_itemspage(20); } - if($_GET['order'] === 'posted') + if ($_GET['order'] === 'posted') $order = 'ASC'; else $order = 'DESC'; @@ -1226,15 +1217,14 @@ function photos_content(&$a) { ); //edit album name - if($cmd === 'edit') { - if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) { - if($can_post) { + if ($cmd === 'edit') { + if (($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) { + if ($can_post) { $edit_tpl = get_markup_template('album_edit.tpl'); - if($a->theme['template_engine'] === 'internal') { + if ($a->theme['template_engine'] === 'internal') { $album_e = template_escape($album); - } - else { + } else { $album_e = $album; } @@ -1248,37 +1238,35 @@ function photos_content(&$a) { )); } } - } - else { - if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) { - if($can_post) { + } else { + if (($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) { + if ($can_post) { $edit = array(t('Edit Album'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '/edit'); } } } - if($_GET['order'] === 'posted') + if ($_GET['order'] === 'posted') $order = array(t('Show Newest First'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album)); else $order = array(t('Show Oldest First'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '?f=&order=posted'); $photos = array(); - if(count($r)) + if (dbm::is_result($r)) $twist = 'rotright'; - foreach($r as $rr) { - if($twist == 'rotright') + foreach ($r as $rr) { + if ($twist == 'rotright') $twist = 'rotleft'; else $twist = 'rotright'; $ext = $phototypes[$rr['type']]; - if($a->theme['template_engine'] === 'internal') { + if ($a->theme['template_engine'] === 'internal') { $imgalt_e = template_escape($rr['filename']); $desc_e = template_escape($rr['desc']); - } - else { + } else { $imgalt_e = $rr['filename']; $desc_e = $rr['desc']; } @@ -1316,7 +1304,7 @@ function photos_content(&$a) { * Display one photo */ - if($datatype === 'image') { + if ($datatype === 'image') { //$o = ''; // fetch image, item containing image, then comments @@ -1327,13 +1315,13 @@ function photos_content(&$a) { dbesc($datum) ); - if(! count($ph)) { + if (! count($ph)) { $ph = q("SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' LIMIT 1", intval($owner_uid), dbesc($datum) ); - if(count($ph)) + if (count($ph)) notice( t('Permission denied. Access to this item may be restricted.')); else notice( t('Photo not available') . EOL ); @@ -1343,7 +1331,7 @@ function photos_content(&$a) { $prevlink = ''; $nextlink = ''; - if($_GET['order'] === 'posted') + if ($_GET['order'] === 'posted') $order = 'ASC'; else $order = 'DESC'; @@ -1355,14 +1343,14 @@ function photos_content(&$a) { intval($owner_uid) ); - if(count($prvnxt)) { + if (count($prvnxt)) { for($z = 0; $z < count($prvnxt); $z++) { - if($prvnxt[$z]['resource-id'] == $ph[0]['resource-id']) { + if ($prvnxt[$z]['resource-id'] == $ph[0]['resource-id']) { $prv = $z - 1; $nxt = $z + 1; - if($prv < 0) + if ($prv < 0) $prv = count($prvnxt) - 1; - if($nxt >= count($prvnxt)) + if ($nxt >= count($prvnxt)) $nxt = 0; break; } @@ -1373,16 +1361,15 @@ function photos_content(&$a) { } - if(count($ph) == 1) + if (count($ph) == 1) $hires = $lores = $ph[0]; - if(count($ph) > 1) { - if($ph[1]['scale'] == 2) { + if (count($ph) > 1) { + if ($ph[1]['scale'] == 2) { // original is 640 or less, we can display it directly $hires = $lores = $ph[0]; - } - else { - $hires = $ph[0]; - $lores = $ph[1]; + } else { + $hires = $ph[0]; + $lores = $ph[1]; } } @@ -1390,7 +1377,7 @@ function photos_content(&$a) { $tools = Null; $lock = Null; - if($can_post && ($ph[0]['uid'] == $owner_uid)) { + if ($can_post && ($ph[0]['uid'] == $owner_uid)) { $tools = array( 'edit' => array('photos/' . $a->data['user']['nickname'] . '/image/' . $datum . (($cmd === 'edit') ? '' : '/edit'), (($cmd === 'edit') ? t('View photo') : t('Edit photo'))), 'profile'=>array('profile_photo/use/'.$ph[0]['resource-id'], t('Use as profile photo')), @@ -1405,7 +1392,7 @@ function photos_content(&$a) { } - if( $cmd === 'edit') { + if ( $cmd === 'edit') { $tpl = get_markup_template('photo_edit_head.tpl'); $a->page['htmlhead'] .= replace_macros($tpl,array( '$prevlink' => $prevlink, @@ -1413,7 +1400,7 @@ function photos_content(&$a) { )); } - if($prevlink) + if ($prevlink) $prevlink = array($prevlink, '') ; $photo = array( @@ -1426,7 +1413,7 @@ function photos_content(&$a) { 'filename' => $hires['filename'], ); - if($nextlink) + if ($nextlink) $nextlink = array($nextlink, ''); @@ -1444,7 +1431,7 @@ function photos_content(&$a) { $map = null; - if(count($linked_items)) { + if (count($linked_items)) { $link_item = $linked_items[0]; $r = q("SELECT COUNT(*) AS `total` FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` @@ -1458,7 +1445,7 @@ function photos_content(&$a) { ); - if(count($r)) + if (dbm::is_result($r)) $a->set_pager_total($r[0]['total']); @@ -1480,7 +1467,7 @@ function photos_content(&$a) { ); - if((local_user()) && (local_user() == $link_item['uid'])) { + if ((local_user()) && (local_user() == $link_item['uid'])) { q("UPDATE `item` SET `unseen` = 0 WHERE `parent` = %d and `uid` = %d", intval($link_item['parent']), intval(local_user()) @@ -1488,24 +1475,24 @@ function photos_content(&$a) { update_thread($link_item['parent']); } - if($link_item['coord']) { + if ($link_item['coord']) { $map = generate_map($link_item['coord']); } } $tags=Null; - if(count($linked_items) && strlen($link_item['tag'])) { + if (count($linked_items) && strlen($link_item['tag'])) { $arr = explode(',',$link_item['tag']); // parse tags and add links $tag_str = ''; - foreach($arr as $t) { - if(strlen($tag_str)) + foreach ($arr as $t) { + if (strlen($tag_str)) $tag_str .= ', '; $tag_str .= bbcode($t); } $tags = array(t('Tags: '), $tag_str); - if($cmd === 'edit') { + if ($cmd === 'edit') { $tags[] = 'tagrm/' . $link_item['id']; $tags[] = t('[Remove any tag]'); } @@ -1513,33 +1500,32 @@ function photos_content(&$a) { $edit = Null; - if(($cmd === 'edit') && ($can_post)) { + if (($cmd === 'edit') && ($can_post)) { $edit_tpl = get_markup_template('photo_edit.tpl'); // Private/public post links for the non-JS ACL form $private_post = 1; - if($_REQUEST['public']) + if ($_REQUEST['public']) $private_post = 0; $query_str = $a->query_string; - if(strpos($query_str, 'public=1') !== false) + if (strpos($query_str, 'public=1') !== false) $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str); // I think $a->query_string may never have ? in it, but I could be wrong // It looks like it's from the index.php?q=[etc] rewrite that the web // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61 - if(strpos($query_str, '?') === false) + if (strpos($query_str, '?') === false) $public_post_link = '?public=1'; else $public_post_link = '&public=1'; - if($a->theme['template_engine'] === 'internal') { + if ($a->theme['template_engine'] === 'internal') { $album_e = template_escape($ph[0]['album']); $caption_e = template_escape($ph[0]['desc']); $aclselect_e = template_escape(populate_acl($ph[0])); - } - else { + } else { $album_e = $ph[0]['album']; $caption_e = $ph[0]['desc']; $aclselect_e = populate_acl($ph[0]); @@ -1575,7 +1561,7 @@ function photos_content(&$a) { )); } - if(count($linked_items)) { + if (count($linked_items)) { $cmnt_tpl = get_markup_template('comment_item.tpl'); $tpl = get_markup_template('photo_item.tpl'); @@ -1585,7 +1571,7 @@ function photos_content(&$a) { $likebuttons = ''; - if($can_post || can_write_wall($a,$owner_uid)) { + if ($can_post || can_write_wall($a,$owner_uid)) { $likebuttons = replace_macros($like_tpl,array( '$id' => $link_item['id'], '$likethis' => t("I like this \x28toggle\x29"), @@ -1597,9 +1583,9 @@ function photos_content(&$a) { } $comments = ''; - if(! count($r)) { - if($can_post || can_write_wall($a,$owner_uid)) { - if($link_item['last-child']) { + if (! count($r)) { + if ($can_post || can_write_wall($a,$owner_uid)) { + if ($link_item['last-child']) { $comments .= replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => $return_url, @@ -1635,9 +1621,9 @@ function photos_content(&$a) { // display comments - if(count($r)) { + if (dbm::is_result($r)) { - foreach($r as $item) { + foreach ($r as $item) { builtin_activity_puller($item, $conv_responses); } @@ -1646,8 +1632,8 @@ function photos_content(&$a) { - if($can_post || can_write_wall($a,$owner_uid)) { - if($link_item['last-child']) { + if ($can_post || can_write_wall($a,$owner_uid)) { + if ($link_item['last-child']) { $comments .= replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => $return_url, @@ -1669,23 +1655,22 @@ function photos_content(&$a) { } - foreach($r as $item) { + foreach ($r as $item) { $comment = ''; $template = $tpl; $sparkle = ''; - if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE))) && ($item['id'] != $item['parent'])) + if (((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE))) && ($item['id'] != $item['parent'])) continue; $redirect_url = 'redir/' . $item['cid'] ; - if(local_user() && ($item['contact-uid'] == local_user()) + if (local_user() && ($item['contact-uid'] == local_user()) && ($item['network'] == NETWORK_DFRN) && (! $item['self'] )) { $profile_url = $redirect_url; $sparkle = ' sparkle'; - } - else { + } else { $profile_url = $item['url']; $sparkle = ''; } @@ -1708,12 +1693,11 @@ function photos_content(&$a) { ); - if($a->theme['template_engine'] === 'internal') { + if ($a->theme['template_engine'] === 'internal') { $name_e = template_escape($profile_name); $title_e = template_escape($item['title']); $body_e = template_escape(bbcode($item['body'])); - } - else { + } else { $name_e = $profile_name; $title_e = $item['title']; $body_e = bbcode($item['body']); @@ -1733,9 +1717,9 @@ function photos_content(&$a) { '$comment' => $comment )); - if($can_post || can_write_wall($a,$owner_uid)) { + if ($can_post || can_write_wall($a,$owner_uid)) { - if($item['last-child']) { + if ($item['last-child']) { $comments .= replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => $return_url, @@ -1763,19 +1747,18 @@ function photos_content(&$a) { $response_verbs = array('like'); - if(feature_enabled($owner_uid,'dislike')) + if (feature_enabled($owner_uid,'dislike')) $response_verbs[] = 'dislike'; $responses = get_responses($conv_responses,$response_verbs,'',$link_item); $photo_tpl = get_markup_template('photo_view.tpl'); - if($a->theme['template_engine'] === 'internal') { + if ($a->theme['template_engine'] === 'internal') { $album_e = array($album_link,template_escape($ph[0]['album'])); $tags_e = template_escape($tags); $like_e = template_escape($like); $dislike_e = template_escape($dislike); - } - else { + } else { $album_e = array($album_link,$ph[0]['album']); $tags_e = $tags; $like_e = $like; @@ -1821,7 +1804,7 @@ function photos_content(&$a) { dbesc('Contact Photos'), dbesc( t('Contact Photos')) ); - if(count($r)) { + if (dbm::is_result($r)) { $a->set_pager_total(count($r)); $a->set_pager_itemspage(20); } @@ -1839,24 +1822,24 @@ function photos_content(&$a) { $photos = array(); - if(count($r)) { + if (dbm::is_result($r)) { $twist = 'rotright'; - foreach($r as $rr) { + foreach ($r as $rr) { //hide profile photos to others - if((! $is_owner) && (! remote_user()) && ($rr['album'] == t('Profile Photos'))) + if ((! $is_owner) && (! remote_user()) && ($rr['album'] == t('Profile Photos'))) continue; - - if($twist == 'rotright') + + if ($twist == 'rotright') $twist = 'rotleft'; else $twist = 'rotright'; + $ext = $phototypes[$rr['type']]; - if($a->theme['template_engine'] === 'internal') { + if ($a->theme['template_engine'] === 'internal') { $alt_e = template_escape($rr['filename']); $name_e = template_escape($rr['album']); - } - else { + } else { $alt_e = $rr['filename']; $name_e = $rr['album']; } From 66da84d1a94b8f03de2995af884448a7f03e52f8 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 22 Oct 2016 10:21:43 +0000 Subject: [PATCH 11/21] Just some more code adjustments --- include/dba.php | 4 ++-- include/ostatus.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/dba.php b/include/dba.php index 36986ebc7..d97defa4c 100644 --- a/include/dba.php +++ b/include/dba.php @@ -159,9 +159,9 @@ class dba { $a->save_timestamp($stamp1, "database"); - if (strtolower(substr($orig_sql, 0, 6)) != "select") + if (strtolower(substr($orig_sql, 0, 6)) != "select") { $a->save_timestamp($stamp1, "database_write"); - + } if (x($a->config,'system') && x($a->config['system'],'db_log')) { if (($duration > $a->config["system"]["db_loglimit"])) { $duration = round($duration, 3); diff --git a/include/ostatus.php b/include/ostatus.php index 556c81e98..5dcc7d5a7 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -1982,6 +1982,7 @@ class ostatus { intval($authorid), dbesc($check_date), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); /* + // We keep this old query until we are sure that the new one works better $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` LEFT JOIN `item` AS `thritem` ON `thritem`.`uri`=`item`.`thr-parent` AND `thritem`.`uid`=`item`.`uid` From 561f45b83b8e56c52e0b8da650a173448466d49d Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 22 Oct 2016 10:33:18 +0000 Subject: [PATCH 12/21] And again ... --- include/Core/Config.php | 24 ++++++++++++------------ mod/display.php | 20 ++++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/include/Core/Config.php b/include/Core/Config.php index de371eb7f..76a0abe24 100644 --- a/include/Core/Config.php +++ b/include/Core/Config.php @@ -100,8 +100,7 @@ class Config { $a->config[$family][$key] = $val; return $val; - } - else { + } else { $a->config[$family][$key] = '!!'; } return $default_value; @@ -126,19 +125,19 @@ class Config { public static function set($family, $key, $value) { global $a; + $stored = self::get($family, $key); + + if ($stored == $value) { + return true; + } + $a->config[$family][$key] = $value; // manage array value $dbvalue = (is_array($value) ? serialize($value):$value); $dbvalue = (is_bool($dbvalue) ? intval($dbvalue) : $dbvalue); - // The "INSERT" command is very cost intense. It saves performance to do it this way. - $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' ORDER BY `id` DESC LIMIT 1", - dbesc($family), - dbesc($key) - ); - - if (!$ret) { + if (is_null($stored)) { $ret = q("INSERT INTO `config` (`cat`, `k`, `v`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'", dbesc($family), dbesc($key), @@ -152,9 +151,9 @@ class Config { dbesc($key) ); } - if ($ret) + if ($ret) { return $value; - + } return $ret; } @@ -173,8 +172,9 @@ class Config { public static function delete($family, $key) { global $a; - if (x($a->config[$family],$key)) + if (x($a->config[$family],$key)) { unset($a->config[$family][$key]); + } $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s'", dbesc($family), dbesc($key) diff --git a/mod/display.php b/mod/display.php index 52e9b5928..293156cf1 100644 --- a/mod/display.php +++ b/mod/display.php @@ -19,7 +19,7 @@ function display_init(&$a) { $r = qu("SELECT `id`, `parent`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `guid` = '%s' AND `uid` = %d", dbesc($a->argv[1]), local_user()); - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $nick = $a->user["nickname"]; $itemuid = local_user(); } @@ -35,7 +35,7 @@ function display_init(&$a) { AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND NOT `item`.`private` AND NOT `user`.`hidewall` AND `item`.`guid` = '%s'", dbesc($a->argv[1])); - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $nick = $r[0]["nickname"]; $itemuid = $r[0]["uid"]; } @@ -51,7 +51,7 @@ function display_init(&$a) { AND NOT `item`.`private` AND `item`.`uid` = 0 AND `item`.`guid` = '%s'", dbesc($a->argv[1])); } - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { if ($r[0]["id"] != $r[0]["parent"]) { $r = qu("SELECT `id`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` @@ -90,7 +90,7 @@ function display_init(&$a) { WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` AND `contact`.`self` LIMIT 1", dbesc($nickname) ); - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $profiledata = $r[0]; } $profiledata["network"] = NETWORK_DFRN; @@ -128,7 +128,7 @@ function display_fetchauthor($a, $item) { // Skip if it isn't a pure repeated messages // Does it start with a share? - if (!$skip AND strpos($body, "[share") > 0) } + if (!$skip AND strpos($body, "[share") > 0) { $skip = true; } // Does it end with a share? @@ -230,7 +230,7 @@ function display_content(&$a, $update = 0) { $r = qu("SELECT `id` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `guid` = '%s' AND `uid` = %d", dbesc($a->argv[1]), local_user()); - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $item_id = $r[0]["id"]; $nick = $a->user["nickname"]; } @@ -244,7 +244,7 @@ function display_content(&$a, $update = 0) { AND NOT `item`.`private` AND NOT `user`.`hidewall` AND `item`.`guid` = '%s'", dbesc($a->argv[1])); // AND NOT `item`.`private` AND `item`.`wall` - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $item_id = $r[0]["id"]; $nick = $r[0]["nickname"]; } @@ -257,7 +257,7 @@ function display_content(&$a, $update = 0) { AND NOT `item`.`private` AND `item`.`uid` = 0 AND `item`.`guid` = '%s'", dbesc($a->argv[1])); // AND NOT `item`.`private` AND `item`.`wall` - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $item_id = $r[0]["id"]; } } @@ -303,7 +303,7 @@ function display_content(&$a, $update = 0) { intval($contact_id), intval($a->profile['uid']) ); - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $contact = $r[0]; $remote_contact = true; } @@ -319,7 +319,7 @@ function display_content(&$a, $update = 0) { $r = qu("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1", intval($a->profile['uid']) ); - if (dbm::isresult($r)) { + if (dbm::is_result($r)) { $a->page_contact = $r[0]; } $is_owner = ((local_user()) && (local_user() == $a->profile['profile_uid']) ? true : false); From deb2fee2f0863e772ba893cb80645183fb7069ca Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Oct 2016 07:49:21 +0000 Subject: [PATCH 13/21] pconfig: Improved behaviour with already stored values --- include/Core/Config.php | 2 +- include/Core/PConfig.php | 31 ++++++++++++++++--------------- include/api.php | 2 +- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/include/Core/Config.php b/include/Core/Config.php index 76a0abe24..b56edb4c2 100644 --- a/include/Core/Config.php +++ b/include/Core/Config.php @@ -144,7 +144,7 @@ class Config { dbesc($dbvalue), dbesc($dbvalue) ); - } elseif ($ret[0]['v'] != $dbvalue) { + } else { $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s'", dbesc($dbvalue), dbesc($family), diff --git a/include/Core/PConfig.php b/include/Core/PConfig.php index 975210cfd..fc022d628 100644 --- a/include/Core/PConfig.php +++ b/include/Core/PConfig.php @@ -122,22 +122,18 @@ class PConfig { global $a; + $stored = self::get($uid, $family, $key); + + if ($stored == $value) { + return true; + } + // manage array value $dbvalue = (is_array($value) ? serialize($value):$value); $a->config[$uid][$family][$key] = $value; - // The "INSERT" command is very cost intense. It saves performance to do it this way. - $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' ORDER BY `id` DESC LIMIT 1", - intval($uid), - dbesc($family), - dbesc($key) - ); - - // It would be better to use the dbm class. - // My lacking knowdledge in autoloaders prohibits this. - // if (!dbm::is_result($ret)) - if (!$ret) + if (is_null($stored)) { $ret = q("INSERT INTO `pconfig` (`uid`, `cat`, `k`, `v`) VALUES (%d, '%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'", intval($uid), dbesc($family), @@ -145,17 +141,18 @@ class PConfig { dbesc($dbvalue), dbesc($dbvalue) ); - elseif ($ret[0]['v'] != $dbvalue) + } else { $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s'", dbesc($dbvalue), intval($uid), dbesc($family), dbesc($key) ); + } - if ($ret) + if ($ret) { return $value; - + } return $ret; } @@ -175,13 +172,17 @@ class PConfig { public static function delete($uid,$family,$key) { global $a; - if (x($a->config[$uid][$family], $key)) + + if (x($a->config[$uid][$family], $key)) { unset($a->config[$uid][$family][$key]); + } + $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s'", intval($uid), dbesc($family), dbesc($key) ); + return $ret; } } diff --git a/include/api.php b/include/api.php index af7c2ca52..1a6eea88e 100644 --- a/include/api.php +++ b/include/api.php @@ -565,7 +565,7 @@ //AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''", // count public wall messages - $r = q("SELECT COUNT(*) as `count` FROM `item` WHERE `uid` = %d AND wall", + $r = q("SELECT COUNT(*) as `count` FROM `item` WHERE `uid` = %d AND `wall`", intval($uinfo[0]['uid']) ); $countitms = $r[0]['count']; From ee5ada6991e4bf8516026c409587e1ad675547d7 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Oct 2016 21:59:40 +0000 Subject: [PATCH 14/21] We now use memcache if configured and installed. --- boot.php | 4 + doc/htconfig.md | 3 + include/cache.php | 235 ++++++++++++++++++++++++++++++---------- include/dbstructure.php | 1 + include/identity.php | 18 ++- include/items.php | 8 +- include/ostatus.php | 8 +- include/session.php | 76 ++++++++----- include/socgraph.php | 16 ++- include/threads.php | 47 +++++--- mod/item.php | 11 +- mod/photos.php | 18 ++- mod/profile.php | 24 ++-- 13 files changed, 339 insertions(+), 130 deletions(-) diff --git a/boot.php b/boot.php index aa5574e3c..85270e530 100644 --- a/boot.php +++ b/boot.php @@ -127,6 +127,10 @@ define ( 'CACHE_MONTH', 0 ); define ( 'CACHE_WEEK', 1 ); define ( 'CACHE_DAY', 2 ); define ( 'CACHE_HOUR', 3 ); +define ( 'CACHE_HALF_HOUR', 4 ); +define ( 'CACHE_QUARTER_HOUR', 5 ); +define ( 'CACHE_FIVE_MINUTES', 6 ); +define ( 'CACHE_MINUTE', 7 ); /* @}*/ /** diff --git a/doc/htconfig.md b/doc/htconfig.md index fa2623667..602168275 100644 --- a/doc/htconfig.md +++ b/doc/htconfig.md @@ -40,6 +40,9 @@ line to your .htconfig.php: * max_batch_queue - Default value is 1000. * max_processes_backend - Maximum number of concurrent database processes for background tasks. Default value is 5. * max_processes_frontend - Maximum number of concurrent database processes for foreground tasks. Default value is 20. +* memcache (Boolean) - Use memcache. To use memcache the PECL extension "memcache" has to be installed and activated. +* memcache_host - Hostname of the memcache daemon. Default is '127.0.0.1'. +* memcache_port- Portnumberof the memcache daemon. Default is 11211. * no_oembed (Boolean) - Don't use OEmbed to fetch more information about a link. * no_oembed_rich_content (Boolean) - Don't show the rich content (e.g. embedded PDF). * no_smilies (Boolean) - Don't show smilies. diff --git a/include/cache.php b/include/cache.php index d0b0dfafd..45938dddf 100644 --- a/include/cache.php +++ b/include/cache.php @@ -1,72 +1,195 @@ connect($memcache_host, $memcache_port)) { + return false; + } + + return $memcache; + } + + /** + * @brief Return the duration for a given cache level + * + * @param integer $level Cache level + * + * @return integer The cache duration in seconds + */ + private function duration($level) { + switch($level) { + case CACHE_MONTH; + $seconds = 2592000; + break; + case CACHE_WEEK; + $seconds = 604800; + break; + case CACHE_DAY; + $seconds = 86400; + break; + case CACHE_HOUR; + $seconds = 3600; + break; + case CACHE_HALF_HOUR; + $seconds = 1800; + break; + case CACHE_QUARTER_HOUR; + $seconds = 900; + break; + case CACHE_FIVE_MINUTES; + $seconds = 300; + break; + case CACHE_MINUTE; + $seconds = 60; + break; + } + return $seconds; + } + + /** + * @brief Fetch cached data according to the key + * + * @param string $key The key to the cached data + * + * @return mixed Cached $value or "null" if not found + */ + public static function get($key) { + + $memcache = self::memcache(); + if (is_object($memcache)) { + // We fetch with the hostname as key to avoid problems with other applications + $value = $memcache->get(get_app()->get_hostname().":".$key); + if (!is_bool($value)) { + return unserialize($value); + } return null; } - public static function set($key,$value, $duration = CACHE_MONTH) { + // Frequently clear cache + self::clear($duration); - q("REPLACE INTO `cache` (`k`,`v`,`expire_mode`,`updated`) VALUES ('%s','%s',%d,'%s')", - dbesc($key), - dbesc($value), - intval($duration), - dbesc(datetime_convert())); + $r = q("SELECT `v` FROM `cache` WHERE `k`='%s' LIMIT 1", + dbesc($key) + ); + if (count($r)) { + return $r[0]['v']; } - -/* - * - * Leaving this legacy code temporaily to see how REPLACE fares - * as opposed to non-atomic checks when faced with fast moving key duplication. - * As a MySQL extension it isn't portable, but we're not yet very portable. - */ - -/* - * $r = q("SELECT * FROM `cache` WHERE `k`='%s' limit 1", - * dbesc($key) - * ); - * if(count($r)) { - * q("UPDATE `cache` SET `v` = '%s', `updated = '%s' WHERE `k` = '%s'", - * dbesc($value), - * dbesc(datetime_convert()), - * dbesc($key)); - * } - * else { - * q("INSERT INTO `cache` (`k`,`v`,`updated`) VALUES ('%s','%s','%s')", - * dbesc($key), - * dbesc($value), - * dbesc(datetime_convert())); - * } - * } - */ - - - public static function clear(){ - q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC','UTC',"now - 30 days")), intval(CACHE_MONTH)); - - q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC','UTC',"now - 7 days")), intval(CACHE_WEEK)); - - q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC','UTC',"now - 1 days")), intval(CACHE_DAY)); - - q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC','UTC',"now - 1 hours")), intval(CACHE_HOUR)); - } - + return null; } + /** + * @brief Put data in the cache according to the key + * + * @param string $key The key to the cached data + * @param mixed $valie The value that is about to be stored + * @param integer $duration The cache lifespan + */ + public static function set($key, $value, $duration = CACHE_MONTH) { + + // Do we have an installed memcache? Use it instead. + $memcache = self::memcache(); + if (is_object($memcache)) { + // We store with the hostname as key to avoid problems with other applications + $memcache->set(get_app()->get_hostname().":".$key, serialize($value), MEMCACHE_COMPRESSED, self::duration($duration)); + return; + } + + /// @todo store the cache data in the same way like the config data + q("REPLACE INTO `cache` (`k`,`v`,`expire_mode`,`updated`) VALUES ('%s','%s',%d,'%s')", + dbesc($key), + dbesc($value), + intval($duration), + dbesc(datetime_convert())); + } + + /** + * @brief Remove outdated data from the cache + * + * @param integer $maxlevel The maximum cache level that is to be cleared + */ + public static function clear($max_level = CACHE_MONTH) { + + // Clear long lasting cache entries only once a day + if (get_config("system", "cache_cleared_day") < time() - self::duration(CACHE_DAY)) { + if ($max_level == CACHE_MONTH) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 30 days")), intval(CACHE_MONTH)); + } + + if ($max_level <= CACHE_WEEK) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 7 days")), intval(CACHE_WEEK)); + } + + if ($max_level <= CACHE_DAY) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 1 days")), intval(CACHE_DAY)); + } + set_config("system", "cache_cleared_day", time()); + } + + if (($max_level <= CACHE_HOUR) AND (get_config("system", "cache_cleared_hour")) < time() - self::duration(CACHE_HOUR)) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 1 hours")), intval(CACHE_HOUR)); + + set_config("system", "cache_cleared_hour", time()); + } + + if (($max_level <= CACHE_HALF_HOUR) AND (get_config("system", "cache_cleared_half_hour")) < time() - self::duration(CACHE_HALF_HOUR)) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 30 minutes")), intval(CACHE_HALF_HOUR)); + + set_config("system", "cache_cleared_half_hour", time()); + } + + if (($max_level <= CACHE_QUARTER_HOUR) AND (get_config("system", "cache_cleared_hour")) < time() - self::duration(CACHE_QUARTER_HOUR)) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 15 minutes")), intval(CACHE_QUARTER_HOUR)); + + set_config("system", "cache_cleared_quarter_hour", time()); + } + + if (($max_level <= CACHE_FIVE_MINUTES) AND (get_config("system", "cache_cleared_five_minute")) < time() - self::duration(CACHE_FIVE_MINUTES)) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 5 minutes")), intval(CACHE_FIVE_MINUTES)); + + set_config("system", "cache_cleared_five_minute", time()); + } + + if (($max_level <= CACHE_MINUTE) AND (get_config("system", "cache_cleared_minute")) < time() - self::duration(CACHE_MINUTE)) { + q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", + dbesc(datetime_convert('UTC','UTC',"now - 1 minutes")), intval(CACHE_MINUTE)); + + set_config("system", "cache_cleared_minute", time()); + } + } +} diff --git a/include/dbstructure.php b/include/dbstructure.php index b0f90ae24..3d1461532 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -443,6 +443,7 @@ function db_definition($charset) { "indexes" => array( "PRIMARY" => array("k".db_index_suffix($charset)), "updated" => array("updated"), + "expire_mode_updated" => array("expire_mode", "updated"), ) ); $database["challenge"] = array( diff --git a/include/identity.php b/include/identity.php index b3dbea8fc..a30d81cf3 100644 --- a/include/identity.php +++ b/include/identity.php @@ -149,17 +149,23 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) { if($profile) { $profile_int = intval($profile); - $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.* FROM `profile` - INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` - WHERE `user`.`nickname` = '%s' AND `profile`.`id` = %d AND `contact`.`self` = 1 LIMIT 1", + $r = q("SELECT `contact`.`id` AS `contact_id`, `profile`.`uid` AS `profile_uid`, `profile`.*, + `contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.* + FROM `profile` + INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` AND `contact`.`self` + INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` + WHERE `user`.`nickname` = '%s' AND `profile`.`id` = %d LIMIT 1", dbesc($nickname), intval($profile_int) ); } if((!$r) && (!count($r))) { - $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.* FROM `profile` - INNER JOIN `contact` ON `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` - WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` = 1 AND `contact`.`self` = 1 LIMIT 1", + $r = q("SELECT `contact`.`id` AS `contact_id`, `profile`.`uid` AS `profile_uid`, `profile`.*, + `contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.* + FROM `profile` + INNER JOIN `contact` ON `contact`.`uid` = `profile`.`uid` AND `contact`.`self` + INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` + WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` LIMIT 1", dbesc($nickname) ); } diff --git a/include/items.php b/include/items.php index 27c198d89..98927e658 100644 --- a/include/items.php +++ b/include/items.php @@ -770,7 +770,6 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa logger('item_store: ' . print_r($arr,true), LOGGER_DATA); - q("COMMIT;"); q("START TRANSACTION;"); $r = dbq("INSERT INTO `item` (`" @@ -887,13 +886,16 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa create_tags_from_item($current_post); create_files_from_item($current_post); - q("COMMIT"); - // Only check for notifications on start posts if ($arr['parent-uri'] === $arr['uri']) { add_thread($current_post); + q("COMMIT"); + + add_shadow_thread($current_post); } else { update_thread($parent_id); + q("COMMIT"); + add_shadow_entry($arr); } diff --git a/include/ostatus.php b/include/ostatus.php index 5dcc7d5a7..83bc493e3 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -813,7 +813,8 @@ class ostatus { WHERE `term`.`uid` = %d AND `term`.`otype` = %d AND `term`.`type` = %d AND `term`.`url` = '%s'))", intval($uid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), dbesc($conversation_url)); -/* +/* 2016-10-23: The old query will be kept until we are sure that the query above is a good and fast replacement + $parents = q("SELECT `id`, `parent`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `id` IN (SELECT `parent` FROM `item` WHERE `id` IN (SELECT `oid` FROM `term` WHERE `uid` = %d AND `otype` = %d AND `type` = %d AND `url` = '%s'))", @@ -1981,8 +1982,9 @@ class ostatus { intval($owner["uid"]), intval($owner["id"]), intval($authorid), dbesc($check_date), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); -/* - // We keep this old query until we are sure that the new one works better + +/* 2016-10-23: The old query will be kept until we are sure that the query above is a good and fast replacement + $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` LEFT JOIN `item` AS `thritem` ON `thritem`.`uri`=`item`.`thr-parent` AND `thritem`.`uid`=`item`.`uid` diff --git a/include/session.php b/include/session.php index 8f9d64606..c69a40231 100644 --- a/include/session.php +++ b/include/session.php @@ -1,43 +1,62 @@ get(get_app()->get_hostname().":session:".$id); + if (!is_bool($data)) { + return $data; + } + logger("no data for session $id", LOGGER_TRACE); + return ''; + } + + $r = q("SELECT `data` FROM `session` WHERE `sid`= '%s'", dbesc($id)); + + if (dbm::is_result($r)) { $session_exists = true; return $r[0]['data']; } else { logger("no data for session $id", LOGGER_TRACE); } - return ''; -}} -if(! function_exists('ref_session_write')) { -function ref_session_write ($id,$data) { + return ''; +} + +function ref_session_write($id, $data) { global $session_exists, $session_expire; - if(! $id || ! $data) { + if (!$id || !$data) { return false; } $expire = time() + $session_expire; $default_expire = time() + 300; - if($session_exists) { + $memcache = cache::memcache(); + if (is_object($memcache)) { + $memcache->set(get_app()->get_hostname().":session:".$id, $data, MEMCACHE_COMPRESSED, $expire); + return true; + } + + if ($session_exists) { $r = q("UPDATE `session` SET `data` = '%s' WHERE `data` != '%s' AND `sid` = '%s'", @@ -53,24 +72,30 @@ function ref_session_write ($id,$data) { dbesc($id), dbesc($default_expire), dbesc($data)); return true; -}} +} -if(! function_exists('ref_session_close')) { function ref_session_close() { return true; -}} +} + +function ref_session_destroy($id) { + $memcache = cache::memcache(); + + if (is_object($memcache)) { + $memcache->delete(get_app()->get_hostname().":session:".$id); + return true; + } -if(! function_exists('ref_session_destroy')) { -function ref_session_destroy ($id) { q("DELETE FROM `session` WHERE `sid` = '%s'", dbesc($id)); - return true; -}} -if(! function_exists('ref_session_gc')) { + return true; +} + function ref_session_gc($expire) { q("DELETE FROM `session` WHERE `expire` < %d", dbesc(time())); + return true; -}} +} $gc_probability = 50; @@ -78,7 +103,8 @@ ini_set('session.gc_probability', $gc_probability); ini_set('session.use_only_cookies', 1); ini_set('session.cookie_httponly', 1); -if (!get_config('system', 'disable_database_session')) +if (!get_config('system', 'disable_database_session')) { session_set_save_handler('ref_session_open', 'ref_session_close', 'ref_session_read', 'ref_session_write', 'ref_session_destroy', 'ref_session_gc'); +} diff --git a/include/socgraph.php b/include/socgraph.php index a41861d6e..e1b5cdbf9 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -1075,8 +1075,14 @@ function all_friends($uid,$cid,$start = 0, $limit = 80) { function suggestion_query($uid, $start = 0, $limit = 80) { - if(! $uid) + if (!$uid) { return array(); + } + + $list = Cache::get("suggestion_query:".$uid.":".$start.":".$limit); + if (!is_null($list)) { + return $list; + } $network = array(NETWORK_DFRN); @@ -1087,9 +1093,10 @@ function suggestion_query($uid, $start = 0, $limit = 80) { $network[] = NETWORK_OSTATUS; $sql_network = implode("', '", $network); - //$sql_network = "'".$sql_network."', ''"; $sql_network = "'".$sql_network."'"; + /// @todo This query is really slow + // By now we cache the data for five minutes $r = q("SELECT count(glink.gcid) as `total`, gcontact.* from gcontact INNER JOIN `glink` ON `glink`.`gcid` = `gcontact`.`id` where uid = %d and not gcontact.nurl in ( select nurl from contact where uid = %d ) @@ -1108,8 +1115,10 @@ function suggestion_query($uid, $start = 0, $limit = 80) { intval($limit) ); - if(count($r) && count($r) >= ($limit -1)) + if(count($r) && count($r) >= ($limit -1)) { + Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $r, CACHE_FIVE_MINUTES); return $r; + } $r2 = q("SELECT gcontact.* FROM gcontact INNER JOIN `glink` ON `glink`.`gcid` = `gcontact`.`id` @@ -1138,6 +1147,7 @@ function suggestion_query($uid, $start = 0, $limit = 80) { while (sizeof($list) > ($limit)) array_pop($list); + Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $list, CACHE_FIVE_MINUTES); return $list; } diff --git a/include/threads.php b/include/threads.php index 2e02e7ada..a487d6e01 100644 --- a/include/threads.php +++ b/include/threads.php @@ -18,42 +18,61 @@ function add_thread($itemid, $onlyshadow = false) { .implode("', '", array_values($item)) ."')"); - logger("add_thread: Add thread for item ".$itemid." - ".print_r($result, true), LOGGER_DEBUG); + logger("Add thread for item ".$itemid." - ".print_r($result, true), LOGGER_DEBUG); + } +} + +function add_shadow_thread($itemid) { + $items = q("SELECT `uid`, `wall`, `private`, `moderated`, `visible`, `contact-id`, `deleted`, `network` + FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid)); + + if (!dbm::is_result($items)) { + return; } + $item = $items[0]; + // is it already a copy? - if (($itemid == 0) OR ($item['uid'] == 0)) + if (($itemid == 0) OR ($item['uid'] == 0)) { return; + } // Is it a visible public post? - if (!$item["visible"] OR $item["deleted"] OR $item["moderated"] OR $item["private"]) + if (!$item["visible"] OR $item["deleted"] OR $item["moderated"] OR $item["private"]) { return; + } // is it an entry from a connector? Only add an entry for natively connected networks - if (!in_array($item["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) + if (!in_array($item["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) { return; + } // Only do these checks if the post isn't a wall post if (!$item["wall"]) { // Check, if hide-friends is activated - then don't do a shadow entry $r = q("SELECT `hide-friends` FROM `profile` WHERE `is-default` AND `uid` = %d AND NOT `hide-friends`", $item['uid']); - if (!count($r)) + + if (!dbm::is_result($r)) { return; + } + // Check if the contact is hidden or blocked $r = q("SELECT `id` FROM `contact` WHERE NOT `hidden` AND NOT `blocked` AND `id` = %d", $item['contact-id']); - if (!count($r)) + + if (!dbm::is_result($r)) { return; + } } // Only add a shadow, if the profile isn't hidden $r = q("SELECT `uid` FROM `user` where `uid` = %d AND NOT `hidewall`", $item['uid']); - if (!count($r)) + if (!dbm::is_result($r)) { return; + } - $item = q("SELECT * FROM `item` WHERE `id` = %d", - intval($itemid)); + $item = q("SELECT * FROM `item` WHERE `id` = %d", intval($itemid)); if (count($item) AND ($item[0]["allow_cid"] == '') AND ($item[0]["allow_gid"] == '') AND ($item[0]["deny_cid"] == '') AND ($item[0]["deny_gid"] == '')) { @@ -61,7 +80,7 @@ function add_thread($itemid, $onlyshadow = false) { $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1", dbesc($item['uri'])); - if (!$r) { + if (!dbm::is_result($r)) { // Preparing public shadow (removing user specific data) require_once("include/items.php"); require_once("include/Contact.php"); @@ -72,7 +91,7 @@ function add_thread($itemid, $onlyshadow = false) { $item[0]['contact-id'] = get_contact($item[0]['author-link'], 0); $public_shadow = item_store($item[0], false, false, true); - logger("add_thread: Stored public shadow for post ".$itemid." under id ".$public_shadow, LOGGER_DEBUG); + logger("Stored public shadow for thread ".$itemid." under id ".$public_shadow, LOGGER_DEBUG); } } } @@ -193,8 +212,10 @@ function update_threads() { logger("update_threads: fetched messages: ".count($messages)); - while ($message = $db->qfetch()) + while ($message = $db->qfetch()) { add_thread($message["id"]); + add_shadow_thread($message["id"]); + } $db->qclose(); } @@ -227,7 +248,7 @@ function update_shadow_copy() { logger("fetched messages: ".count($messages)); while ($message = $db->qfetch()) - add_thread($message["iid"], true); + add_shadow_thread($message["iid"]); $db->qclose(); } diff --git a/mod/item.php b/mod/item.php index 94ff6b93d..a56dde3c1 100644 --- a/mod/item.php +++ b/mod/item.php @@ -788,7 +788,6 @@ function item_post(&$a) { } else $post_id = 0; - q("COMMIT;"); q("START TRANSACTION;"); $r = q("INSERT INTO `item` (`guid`, `extid`, `uid`,`type`,`wall`,`gravity`, `network`, `contact-id`, @@ -990,12 +989,14 @@ function item_post(&$a) { create_tags_from_item($post_id); create_files_from_item($post_id); - q("COMMIT"); - - if ($post_id == $parent) + if ($post_id == $parent) { add_thread($post_id); - else { + q("COMMIT"); + + add_shadow_thread($post_id); + } else { update_thread($parent, true); + q("COMMIT"); // Insert an item entry for UID=0 for global entries // We have to remove or change some data before that, diff --git a/mod/photos.php b/mod/photos.php index 19d3d1c6c..34e5eb4ba 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -53,12 +53,18 @@ function photos_init(&$a) { $sql_extra = permissions_sql($a->data['user']['uid']); - $albums = qu("SELECT count(distinct `resource-id`) AS `total`, `album` FROM `photo` USE INDEX (`uid_album_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' - $sql_extra GROUP BY `album` ORDER BY `created` DESC", - intval($a->data['user']['uid']), - dbesc('Contact Photos'), - dbesc( t('Contact Photos')) - ); + $albums = Cache::get("photos-albums:".$a->data['user']['uid']); + if (is_null($albums)) { + /// @todo This query needs to be renewed. It is really slow + // At this time we just store the data in the cache + $albums = qu("SELECT count(distinct `resource-id`) AS `total`, `album` FROM `photo` USE INDEX (`uid_album_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' + $sql_extra GROUP BY `album` ORDER BY `created` DESC", + intval($a->data['user']['uid']), + dbesc('Contact Photos'), + dbesc( t('Contact Photos')) + ); + Cache::set("photos-albums:".$a->data['user']['uid'], $albums, CACHE_FIVE_MINUTES); + } $albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true); diff --git a/mod/profile.php b/mod/profile.php index a8a6ad388..279f86352 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -282,16 +282,20 @@ function profile_content(&$a, $update = 0) { $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); $r = q("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network` - FROM `thread` FORCE INDEX (`uid_created`) INNER JOIN `item` ON `item`.`id` = `thread`.`iid` - $sql_post_table INNER JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` - AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - WHERE `thread`.`uid` = %d AND `thread`.`visible` = 1 AND `thread`.`deleted` = 0 - and `thread`.`moderated` = 0 - AND `thread`.`wall` = 1 - $sql_extra $sql_extra2 - ORDER BY `thread`.`created` DESC $pager_sql ", - intval($a->profile['profile_uid']) - + FROM `thread` + STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid` + $sql_post_table + STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id` + AND NOT `contact`.`blocked` AND NOT `contact`.`pending` + WHERE `thread`.`uid` = %d AND `thread`.`visible` + AND `thread`.`contact-id` = %d + AND NOT `thread`.`deleted` + AND NOT `thread`.`moderated` + AND `thread`.`wall` + $sql_extra $sql_extra2 + ORDER BY `thread`.`created` DESC $pager_sql", + intval($a->profile['profile_uid']), + intval($a->profile['contact_id']) ); } From b99f5b576e91bac79abf910aac1bed18312395c0 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Oct 2016 22:12:45 +0000 Subject: [PATCH 15/21] Fixed code structure --- include/Core/Config.php | 2 +- include/cron.php | 22 +++++++++++----------- include/dba.php | 22 +++++++++++++--------- include/ostatus.php | 2 +- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/include/Core/Config.php b/include/Core/Config.php index b56edb4c2..a5eca0570 100644 --- a/include/Core/Config.php +++ b/include/Core/Config.php @@ -134,7 +134,7 @@ class Config { $a->config[$family][$key] = $value; // manage array value - $dbvalue = (is_array($value) ? serialize($value):$value); + $dbvalue = (is_array($value) ? serialize($value) : $value); $dbvalue = (is_bool($dbvalue) ? intval($dbvalue) : $dbvalue); if (is_null($stored)) { diff --git a/include/cron.php b/include/cron.php index 07770a2ee..6dc34224f 100644 --- a/include/cron.php +++ b/include/cron.php @@ -69,15 +69,15 @@ function cron_run(&$argv, &$argc){ // run queue delivery process in the background - proc_run(PRIORITY_NEGLIGIBLE,"include/queue.php"); + proc_run(PRIORITY_NEGLIGIBLE, "include/queue.php"); // run the process to discover global contacts in the background - proc_run(PRIORITY_LOW,"include/discover_poco.php"); + proc_run(PRIORITY_LOW, "include/discover_poco.php"); // run the process to update locally stored global contacts in the background - proc_run(PRIORITY_LOW,"include/discover_poco.php", "checkcontact"); + proc_run(PRIORITY_LOW, "include/discover_poco.php", "checkcontact"); // Expire and remove user entries cron_expire_and_remove_users(); @@ -120,19 +120,19 @@ function cron_run(&$argv, &$argc){ update_contact_birthdays(); - proc_run(PRIORITY_LOW,"include/discover_poco.php", "suggestions"); + proc_run(PRIORITY_LOW, "include/discover_poco.php", "suggestions"); set_config('system','last_expire_day',$d2); - proc_run(PRIORITY_LOW,'include/expire.php'); + proc_run(PRIORITY_LOW, 'include/expire.php'); if (get_config("system", "worker")) { - proc_run(PRIORITY_LOW,'include/dbclean.php', 1); - proc_run(PRIORITY_LOW,'include/dbclean.php', 2); - proc_run(PRIORITY_LOW,'include/dbclean.php', 3); - proc_run(PRIORITY_LOW,'include/dbclean.php', 4); + proc_run(PRIORITY_LOW, 'include/dbclean.php', 1); + proc_run(PRIORITY_LOW, 'include/dbclean.php', 2); + proc_run(PRIORITY_LOW, 'include/dbclean.php', 3); + proc_run(PRIORITY_LOW, 'include/dbclean.php', 4); } else { - proc_run(PRIORITY_LOW,'include/dbclean.php'); + proc_run(PRIORITY_LOW, 'include/dbclean.php'); } } @@ -315,7 +315,7 @@ function cron_poll_contacts($argc, $argv) { logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]); - proc_run(PRIORITY_MEDIUM,'include/onepoll.php',$contact['id']); + proc_run(PRIORITY_MEDIUM, 'include/onepoll.php', $contact['id']); if($interval) @time_sleep_until(microtime(true) + (float) $interval); diff --git a/include/dba.php b/include/dba.php index d97defa4c..17b8a0a12 100644 --- a/include/dba.php +++ b/include/dba.php @@ -34,7 +34,7 @@ class dba { public $connected = false; public $error = false; - function __construct($server,$user,$pass,$db,$install = false) { + function __construct($server, $user, $pass, $db, $install = false) { global $a; $stamp1 = microtime(true); @@ -80,8 +80,9 @@ class dba { } if (!$this->connected) { $this->db = null; - if (!$install) + if (!$install) { system_unavailable(); + } } $a->save_timestamp($stamp1, "network"); @@ -114,8 +115,9 @@ class dba { * @return integer */ public function num_rows() { - if (!$this->result) + if (!$this->result) { return 0; + } if ($this->mysqli) { $return = $this->result->num_rows; @@ -128,8 +130,9 @@ class dba { public function q($sql, $onlyquery = false) { global $a; - if ((!$this->db) || (!$this->connected)) + if (!$this->db || !$this->connected) { return false; + } $this->error = ''; @@ -139,13 +142,13 @@ class dba { } else { $connected = mysql_ping($this->db); } - $connstr = ($connected ? "Connected": "Disonnected"); + $connstr = ($connected ? "Connected" : "Disonnected"); $stamp1 = microtime(true); $orig_sql = $sql; - if (x($a->config,'system') && x($a->config['system'],'db_callstack')) { + if (x($a->config,'system') && x($a->config['system'], 'db_callstack')) { $sql = "/*".$a->callstack()." */ ".$sql; } @@ -255,7 +258,7 @@ class dba { public function qfetch() { $x = false; - if ($this->result) + if ($this->result) { if ($this->mysqli) { if ($this->result->num_rows) $x = $this->result->fetch_array(MYSQLI_ASSOC); @@ -263,17 +266,18 @@ class dba { if (mysql_num_rows($this->result)) $x = mysql_fetch_array($this->result, MYSQL_ASSOC); } - + } return($x); } public function qclose() { - if ($this->result) + if ($this->result) { if ($this->mysqli) { $this->result->free_result(); } else { mysql_free_result($this->result); } + } } public function dbg($dbg) { diff --git a/include/ostatus.php b/include/ostatus.php index 83bc493e3..bcd8fd671 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -810,7 +810,7 @@ class ostatus { `item`.`verb`, `item`.`visible` FROM `term` STRAIGHT_JOIN `item` AS `thritem` ON `thritem`.`parent` = `term`.`oid` STRAIGHT_JOIN `item` ON `item`.`parent` = `thritem`.`parent` - WHERE `term`.`uid` = %d AND `term`.`otype` = %d AND `term`.`type` = %d AND `term`.`url` = '%s'))", + WHERE `term`.`uid` = %d AND `term`.`otype` = %d AND `term`.`type` = %d AND `term`.`url` = '%s'", intval($uid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), dbesc($conversation_url)); /* 2016-10-23: The old query will be kept until we are sure that the query above is a good and fast replacement From 1ade94fd8a824d71c686b15bc2206ed7b066cdfe Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Oct 2016 23:14:35 +0000 Subject: [PATCH 16/21] Some code reformatting --- include/dba.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/include/dba.php b/include/dba.php index 17b8a0a12..56cc6c178 100644 --- a/include/dba.php +++ b/include/dba.php @@ -221,13 +221,14 @@ class dba { if ($result === false) { logger('dba: ' . printable($sql) . ' returned false.' . "\n" . $this->error); - if (file_exists('dbfail.out')) + if (file_exists('dbfail.out')) { file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND); + } } - if (($result === true) || ($result === false)) + if (($result === true) || ($result === false)) { return $result; - + } if ($onlyquery) { $this->result = $result; return true; @@ -250,8 +251,9 @@ class dba { //$a->save_timestamp($stamp1, "database"); - if ($this->debug) + if ($this->debug) { logger('dba: ' . printable(print_r($r, true))); + } return($r); } @@ -318,8 +320,9 @@ if (! function_exists('printable')) { function printable($s) { $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s); $s = str_replace("\x00",'.',$s); - if (x($_SERVER,'SERVER_NAME')) + if (x($_SERVER,'SERVER_NAME')) { $s = escape_tags($s); + } return $s; }} @@ -327,8 +330,9 @@ function printable($s) { if (! function_exists('dbg')) { function dbg($state) { global $db; - if ($db) - $db->dbg($state); + if ($db) { + $db->dbg($state); + } }} if (! function_exists('dbesc')) { From 47b8975bb6f59c09dc28f7d08a87c51fd2e197da Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 23 Oct 2016 23:31:56 +0000 Subject: [PATCH 17/21] poller.php is now working with transactions as well. --- include/poller.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/poller.php b/include/poller.php index bbec43ae7..2e036247e 100644 --- a/include/poller.php +++ b/include/poller.php @@ -98,6 +98,7 @@ function poller_run(&$argv, &$argc){ if (!$upd) { logger("Couldn't update queue entry ".$r[0]["id"]." - skip this execution", LOGGER_DEBUG); + q("COMMIT"); continue; } @@ -105,14 +106,18 @@ function poller_run(&$argv, &$argc){ $id = q("SELECT `pid`, `executed` FROM `workerqueue` WHERE `id` = %d", intval($r[0]["id"])); if (!$id) { logger("Queue item ".$r[0]["id"]." vanished - skip this execution", LOGGER_DEBUG); + q("COMMIT"); continue; } elseif ((strtotime($id[0]["executed"]) <= 0) OR ($id[0]["pid"] == 0)) { - logger("Entry for queue item ".$r[0]["id"]." wasn't stored - we better stop here", LOGGER_DEBUG); - return; + logger("Entry for queue item ".$r[0]["id"]." wasn't stored - skip this execution", LOGGER_DEBUG); + q("COMMIT"); + continue; } elseif ($id[0]["pid"] != $mypid) { logger("Queue item ".$r[0]["id"]." is to be executed by process ".$id[0]["pid"]." and not by me (".$mypid.") - skip this execution", LOGGER_DEBUG); + q("COMMIT"); continue; } + q("COMMIT"); $argv = json_decode($r[0]["parameter"]); @@ -433,6 +438,8 @@ function poller_passing_slow(&$highest_priority) { function poller_worker_process() { + q("START TRANSACTION;"); + // Check if we should pass some low priority process $highest_priority = 0; From 8cab3b55924f084261564636da9211e615bf52e8 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 24 Oct 2016 08:10:27 +0000 Subject: [PATCH 18/21] More transactions, more queries on uncommitted data --- boot.php | 18 ++++++++++++++---- include/Photo.php | 26 ++++++++++++++++++++++++++ include/cron.php | 15 +++++++++++++++ include/items.php | 1 + mod/item.php | 1 + mod/photos.php | 35 ++++++++++------------------------- 6 files changed, 67 insertions(+), 29 deletions(-) diff --git a/boot.php b/boot.php index 85270e530..1de2cb123 100644 --- a/boot.php +++ b/boot.php @@ -1135,23 +1135,33 @@ class App { $this->remove_inactive_processes(); + q("START TRANSACTION"); + $r = q("SELECT `pid` FROM `process` WHERE `pid` = %d", intval(getmypid())); - if(!dbm::is_result($r)) + if(!dbm::is_result($r)) { q("INSERT INTO `process` (`pid`,`command`,`created`) VALUES (%d, '%s', '%s')", intval(getmypid()), dbesc($command), dbesc(datetime_convert())); + } + q("COMMIT"); } /** * @brief Remove inactive processes */ function remove_inactive_processes() { + q("START TRANSACTION"); + $r = q("SELECT `pid` FROM `process`"); - if(dbm::is_result($r)) - foreach ($r AS $process) - if (!posix_kill($process["pid"], 0)) + if(dbm::is_result($r)) { + foreach ($r AS $process) { + if (!posix_kill($process["pid"], 0)) { q("DELETE FROM `process` WHERE `pid` = %d", intval($process["pid"])); + } + } + } + q("COMMIT"); } /** diff --git a/include/Photo.php b/include/Photo.php index d87bce478..3ab374bd0 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -670,6 +670,12 @@ class Photo { dbesc($deny_gid) ); } + + // Update the cached values + if ($album != 'Contact Photos') { + photo_albums($uid, true); + } + return $r; } }} @@ -1059,3 +1065,23 @@ function store_photo($a, $uid, $imagedata = "", $url = "") { return($image); } +function photo_albums($uid, $update = false) { + $sql_extra = permissions_sql($uid); + + $key = "photo_albums:".$uid.":".local_user().":".remote_user(); + $albums = Cache::get($key); + if (is_null($albums) OR $update) { + /// @todo This query needs to be renewed. It is really slow + // At this time we just store the data in the cache + $albums = qu("SELECT count(distinct `resource-id`) AS `total`, `album` + FROM `photo` USE INDEX (`uid_album_created`) + WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra + GROUP BY `album` ORDER BY `created` DESC", + intval($uid), + dbesc('Contact Photos'), + dbesc(t('Contact Photos')) + ); + Cache::set($key, $albums, CACHE_DAY); + } + return $albums; +} diff --git a/include/cron.php b/include/cron.php index 6dc34224f..c03745a44 100644 --- a/include/cron.php +++ b/include/cron.php @@ -134,6 +134,8 @@ function cron_run(&$argv, &$argc){ } else { proc_run(PRIORITY_LOW, 'include/dbclean.php'); } + + cron_update_photo_albums(); } // Clear cache entries @@ -155,6 +157,19 @@ function cron_run(&$argv, &$argc){ return; } +/** + * @brief Update the cached values for the number of photo albums per user + */ +function cron_update_photo_albums() { + $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND NOT `account_removed`"); + if (!dbm::is_result($r)) + return; + + foreach ($r AS $user) { + photo_albums($user['uid'], true); + } +} + /** * @brief Expire and remove user entries */ diff --git a/include/items.php b/include/items.php index 98927e658..1ee048e48 100644 --- a/include/items.php +++ b/include/items.php @@ -770,6 +770,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa logger('item_store: ' . print_r($arr,true), LOGGER_DATA); + q("COMMIT"); q("START TRANSACTION;"); $r = dbq("INSERT INTO `item` (`" diff --git a/mod/item.php b/mod/item.php index a56dde3c1..4b23b219b 100644 --- a/mod/item.php +++ b/mod/item.php @@ -788,6 +788,7 @@ function item_post(&$a) { } else $post_id = 0; + q("COMMIT"); q("START TRANSACTION;"); $r = q("INSERT INTO `item` (`guid`, `extid`, `uid`,`type`,`wall`,`gravity`, `network`, `contact-id`, diff --git a/mod/photos.php b/mod/photos.php index 34e5eb4ba..edaba5a90 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -25,7 +25,7 @@ function photos_init(&$a) { if ($a->argc > 1) { $nick = $a->argv[1]; - $user = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `blocked` = 0 LIMIT 1", + $user = qu("SELECT * FROM `user` WHERE `nickname` = '%s' AND `blocked` = 0 LIMIT 1", dbesc($nick) ); @@ -50,21 +50,7 @@ function photos_init(&$a) { '$pdesc' => (($profile['pdesc'] != "") ? $profile['pdesc'] : ""), )); - - $sql_extra = permissions_sql($a->data['user']['uid']); - - $albums = Cache::get("photos-albums:".$a->data['user']['uid']); - if (is_null($albums)) { - /// @todo This query needs to be renewed. It is really slow - // At this time we just store the data in the cache - $albums = qu("SELECT count(distinct `resource-id`) AS `total`, `album` FROM `photo` USE INDEX (`uid_album_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' - $sql_extra GROUP BY `album` ORDER BY `created` DESC", - intval($a->data['user']['uid']), - dbesc('Contact Photos'), - dbesc( t('Contact Photos')) - ); - Cache::set("photos-albums:".$a->data['user']['uid'], $albums, CACHE_FIVE_MINUTES); - } + $albums = photo_albums($a->data['user']['uid']); $albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true); @@ -159,7 +145,7 @@ function photos_post(&$a) { } if ($cid) { - $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", + $r = qu("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", intval($cid), intval($page_owner_uid) ); @@ -176,7 +162,7 @@ function photos_post(&$a) { killme(); } - $r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` + $r = qu("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` WHERE `user`.`uid` = %d AND `self` = 1 LIMIT 1", intval($page_owner_uid) ); @@ -198,7 +184,7 @@ function photos_post(&$a) { return; // NOTREACHED } - $r = q("SELECT count(*) FROM `photo` WHERE `album` = '%s' AND `uid` = %d", + $r = qu("SELECT count(*) FROM `photo` WHERE `album` = '%s' AND `uid` = %d", dbesc($album), intval($page_owner_uid) ); @@ -1343,7 +1329,7 @@ function photos_content(&$a) { $order = 'DESC'; - $prvnxt = q("SELECT `resource-id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0 + $prvnxt = qu("SELECT `resource-id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0 $sql_extra ORDER BY `created` $order ", dbesc($ph[0]['album']), intval($owner_uid) @@ -1439,7 +1425,7 @@ function photos_content(&$a) { if (count($linked_items)) { $link_item = $linked_items[0]; - $r = q("SELECT COUNT(*) AS `total` + $r = qu("SELECT COUNT(*) AS `total` FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` WHERE `parent-uri` = '%s' AND `uri` != '%s' AND `item`.`deleted` = 0 and `item`.`moderated` = 0 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 @@ -1455,7 +1441,7 @@ function photos_content(&$a) { $a->set_pager_total($r[0]['total']); - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, + $r = qu("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`, `contact`.`rel`, `contact`.`thumb`, `contact`.`self`, `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` @@ -1804,7 +1790,7 @@ function photos_content(&$a) { // Default - show recent photos with upload link (if applicable) //$o = ''; - $r = q("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' + $r = qu("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra GROUP BY `resource-id`", intval($a->data['user']['uid']), dbesc('Contact Photos'), @@ -1815,7 +1801,7 @@ function photos_content(&$a) { $a->set_pager_itemspage(20); } - $r = q("SELECT `resource-id`, `id`, `filename`, type, `album`, max(`scale`) AS `scale` FROM `photo` + $r = qu("SELECT `resource-id`, `id`, `filename`, type, `album`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d", intval($a->data['user']['uid']), @@ -1878,4 +1864,3 @@ function photos_content(&$a) { return $o; } - From 80efc422bf8f87370388ad8e34ea94cf7ae72616 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 25 Oct 2016 05:44:57 +0000 Subject: [PATCH 19/21] Added documentation --- include/Photo.php | 12 +++++++++++- include/dbstructure.php | 1 + include/socgraph.php | 2 +- include/threads.php | 9 +++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/Photo.php b/include/Photo.php index 3ab374bd0..e734fed89 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -1065,6 +1065,16 @@ function store_photo($a, $uid, $imagedata = "", $url = "") { return($image); } +/** + * @brief Fetch the photo albums that are available for a viewer + * + * The query in this function is cost intensive, so it is cached. + * + * @param int $uid User id of the photos + * @param bool $update Update the cache + * + * @return array Returns array of the photo albums + */ function photo_albums($uid, $update = false) { $sql_extra = permissions_sql($uid); @@ -1073,7 +1083,7 @@ function photo_albums($uid, $update = false) { if (is_null($albums) OR $update) { /// @todo This query needs to be renewed. It is really slow // At this time we just store the data in the cache - $albums = qu("SELECT count(distinct `resource-id`) AS `total`, `album` + $albums = qu("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album` FROM `photo` USE INDEX (`uid_album_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra GROUP BY `album` ORDER BY `created` DESC", diff --git a/include/dbstructure.php b/include/dbstructure.php index 3d1461532..3826716c5 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -587,6 +587,7 @@ function db_definition($charset) { ), "indexes" => array( "PRIMARY" => array("id"), + "cmd_item_contact" => array("UNIQUE", "cmd", "item", "contact"), ) ); $database["event"] = array( diff --git a/include/socgraph.php b/include/socgraph.php index e1b5cdbf9..349869c40 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -1115,7 +1115,7 @@ function suggestion_query($uid, $start = 0, $limit = 80) { intval($limit) ); - if(count($r) && count($r) >= ($limit -1)) { + if (count($r) && count($r) >= ($limit -1)) { Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $r, CACHE_FIVE_MINUTES); return $r; } diff --git a/include/threads.php b/include/threads.php index a487d6e01..79340ab2c 100644 --- a/include/threads.php +++ b/include/threads.php @@ -22,6 +22,15 @@ function add_thread($itemid, $onlyshadow = false) { } } +/** + * @brief Add a shadow entry for a given item id + * + * We store every public item entry additionally with the user id "0". + * This is used for the community page and for the search. + * It is planned that in the future we will store public item entries only once. + * + * @param integer $itemid Item ID that should be added + */ function add_shadow_thread($itemid) { $items = q("SELECT `uid`, `wall`, `private`, `moderated`, `visible`, `contact-id`, `deleted`, `network` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid)); From 86adaddca495994968c0ba1ddcb828fbd944a9d8 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 26 Oct 2016 05:57:11 +0000 Subject: [PATCH 20/21] dbclean.php mustn't be stopped via "killme" --- include/dbclean.php | 1 - 1 file changed, 1 deletion(-) diff --git a/include/dbclean.php b/include/dbclean.php index 5b80b084a..f69489109 100644 --- a/include/dbclean.php +++ b/include/dbclean.php @@ -27,7 +27,6 @@ function dbclean_run(&$argv, &$argc) { $stage = 0; } remove_orphans($stage); - killme(); } /** From d78b4e7ffc5338c5256937f27f791cfaf698ab49 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 28 Oct 2016 09:08:13 +0000 Subject: [PATCH 21/21] We are doing uncommitted reads a little bit different. (We avoid commit) --- include/dba.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/dba.php b/include/dba.php index 56cc6c178..082a54bd4 100644 --- a/include/dba.php +++ b/include/dba.php @@ -397,9 +397,9 @@ function qu($sql) { $stmt = @vsprintf($sql,$args); // Disabled warnings if ($stmt === false) logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG); - $db->q("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); + $db->q("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); $retval = $db->q($stmt); - $db->q("COMMIT;"); + $db->q("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;"); return $retval; }