function thread_search($thread_search, $selected_array = array()) { if (!($db = db::get())) { return false; } if (!($table_prefix = get_table_prefix())) { return false; } $results_array = array(); $fidlist = folder_get_available(); $thread_search = $db->escape(str_replace("%", "", $thread_search)); $selected_array = array_filter($selected_array, 'is_numeric'); $sql = "SELECT DISTINCT THREAD.TID, TRIM(CONCAT_WS(' ', COALESCE(FOLDER.PREFIX, ''), THREAD.TITLE)) AS TITLE "; $sql .= "FROM `{$table_prefix}THREAD` THREAD LEFT JOIN `{$table_prefix}FOLDER` FOLDER "; $sql .= "ON (FOLDER.FID = THREAD.FID) WHERE THREAD.TITLE LIKE '{$thread_search}%' "; $sql .= "AND THREAD.FID IN ({$fidlist}) "; if (sizeof($selected_array) > 0) { $selected = implode(', ', $selected_array); $sql .= "AND THREAD.TID NOT IN ({$selected}) "; } $sql .= "LIMIT 10"; if (!($result = $db->query($sql))) { return false; } $sql = "SELECT FOUND_ROWS() AS ROW_COUNT"; if (!($result_count = $db->query($sql))) { return false; } list($results_count) = $result_count->fetch_row(); if ($result->num_rows == 0) { return false; } while ($thread_data = $result->fetch_assoc()) { $results_array[$thread_data['TID']] = $thread_data; } return array('results_count' => $results_count, 'results_array' => $results_array); }
function stats_get_longest_thread() { if (!($db = db::get())) { return false; } if (!($table_prefix = get_table_prefix())) { return false; } // Get the folders the user can see. $folders = folder_get_available(); // Find the longest thread. $sql = "SELECT MAX(LENGTH) FROM `{$table_prefix}THREAD` "; $sql .= "WHERE FID IN ({$folders})"; if (!($result = $db->query($sql))) { return false; } list($highest_thread_count) = $result->fetch_row(); $sql = "SELECT THREAD.TID, THREAD.LENGTH, "; $sql .= "TRIM(CONCAT_WS(' ', COALESCE(FOLDER.PREFIX, ''), THREAD.TITLE)) AS TITLE "; $sql .= "FROM `{$table_prefix}THREAD` THREAD LEFT JOIN `{$table_prefix}FOLDER` FOLDER "; $sql .= "ON (FOLDER.FID = THREAD.FID) WHERE THREAD.LENGTH = '{$highest_thread_count}' "; $sql .= "AND THREAD.DELETED = 'N' LIMIT 0, 1"; if (!($result = $db->query($sql))) { return false; } if ($result->num_rows == 0) { return false; } return $result->fetch_assoc(); }
function folders_search_user_subscriptions($folder_search, $interest_type = FOLDER_NOINTEREST, $page = 1) { if (!($db = db::get())) { return false; } if (!isset($_SESSION['UID']) || !is_numeric($_SESSION['UID'])) { return false; } if (!is_numeric($page)) { $page = 1; } if (!is_numeric($interest_type)) { $interest_type = FOLDER_NOINTEREST; } $offset = calculate_page_offset($page, 20); if (!($table_prefix = get_table_prefix())) { return false; } $folder_search = $db->escape($folder_search); $folder_subscriptions_array = array(); $folders = folder_get_available(); if ($interest_type != FOLDER_NOINTEREST) { $sql = "SELECT SQL_CALC_FOUND_ROWS FOLDER.FID, FOLDER.TITLE, "; $sql .= "USER_FOLDER.INTEREST FROM `{$table_prefix}FOLDER` FOLDER "; $sql .= "LEFT JOIN `{$table_prefix}USER_FOLDER` USER_FOLDER "; $sql .= "ON (USER_FOLDER.FID = FOLDER.FID AND USER_FOLDER.UID = '{$_SESSION['UID']}') "; $sql .= "WHERE USER_FOLDER.INTEREST = '{$interest_type}' "; $sql .= "AND FOLDER.TITLE LIKE '{$folder_search}%' "; $sql .= "AND FOLDER.FID IN ({$folders}) "; $sql .= "ORDER BY FOLDER.POSITION DESC "; $sql .= "LIMIT {$offset}, 20"; } else { $sql = "SELECT SQL_CALC_FOUND_ROWS FOLDER.FID, FOLDER.TITLE, "; $sql .= "USER_FOLDER.INTEREST FROM `{$table_prefix}FOLDER` FOLDER "; $sql .= "LEFT JOIN `{$table_prefix}USER_FOLDER` USER_FOLDER "; $sql .= "ON (USER_FOLDER.FID = FOLDER.FID AND USER_FOLDER.UID = '{$_SESSION['UID']}') "; $sql .= "WHERE FOLDER.FID IN ({$folders}) "; $sql .= "AND FOLDER.TITLE LIKE '{$folder_search}%' "; $sql .= "ORDER BY FOLDER.POSITION DESC "; $sql .= "LIMIT {$offset}, 20"; } if (!($result = $db->query($sql))) { return false; } $sql = "SELECT FOUND_ROWS() AS ROW_COUNT"; if (!($result_count = $db->query($sql))) { return false; } list($folder_subscriptions_count) = $result_count->fetch_row(); if ($result->num_rows == 0 && $folder_subscriptions_count > 0 && $page > 1) { return folders_search_user_subscriptions($folder_search, $interest_type, $page - 1); } while (($folder_data_array = $result->fetch_assoc()) !== null) { $folder_subscriptions_array[] = $folder_data_array; } return array('folder_count' => $folder_subscriptions_count, 'folder_array' => $folder_subscriptions_array); }
function threads_any_unread() { if (!($db = db::get())) { return false; } if (!isset($_SESSION['UID']) || !is_numeric($_SESSION['UID'])) { return false; } if (!($table_prefix = get_table_prefix())) { return false; } $fidlist = folder_get_available(); $user_ignored = USER_IGNORED; $user_ignored_completely = USER_IGNORED_COMPLETELY; if (($unread_cutoff_datetime = forum_get_unread_cutoff_datetime()) === false) { return false; } $sql = "SELECT COUNT(THREAD.TID) AS UNREAD_THREAD_COUNT "; $sql .= "FROM `{$table_prefix}THREAD` THREAD "; $sql .= "LEFT JOIN `{$table_prefix}USER_THREAD` USER_THREAD "; $sql .= "ON (THREAD.TID = USER_THREAD.TID AND USER_THREAD.UID = '{$_SESSION['UID']}') "; $sql .= "LEFT JOIN `{$table_prefix}USER_PEER` USER_PEER ON "; $sql .= "(USER_PEER.UID = '{$_SESSION['UID']}' AND USER_PEER.PEER_UID = THREAD.BY_UID) "; $sql .= "LEFT JOIN `{$table_prefix}USER_FOLDER` USER_FOLDER ON "; $sql .= "(USER_FOLDER.FID = THREAD.FID AND USER_FOLDER.UID = '{$_SESSION['UID']}') "; $sql .= "WHERE THREAD.FID in ({$fidlist}) AND THREAD.DELETED = 'N' "; $sql .= "AND ((USER_PEER.RELATIONSHIP & {$user_ignored_completely}) = 0 "; $sql .= "OR USER_PEER.RELATIONSHIP IS NULL) "; $sql .= "AND ((USER_PEER.RELATIONSHIP & {$user_ignored}) = 0 "; $sql .= "OR USER_PEER.RELATIONSHIP IS NULL OR THREAD.LENGTH > 1) "; $sql .= "AND (USER_THREAD.LAST_READ < THREAD.LENGTH OR USER_THREAD.LAST_READ IS NULL) "; $sql .= "AND THREAD.MODIFIED >= CAST('{$unread_cutoff_datetime}' AS DATETIME) "; $sql .= "AND (USER_THREAD.INTEREST IS NULL OR USER_THREAD.INTEREST > -1) "; $sql .= "AND (USER_FOLDER.INTEREST IS NULL OR USER_FOLDER.INTEREST > -1)"; if (!($result = $db->query($sql))) { return false; } list($unread_thread_count) = $result->fetch_row(); return $unread_thread_count > 0; }
function messages_get_most_recent_unread($uid, $fid = false) { if (!($db = db::get())) { return false; } if (is_numeric($fid)) { $fidlist = $fid; } else { $fidlist = folder_get_available(); } if (!is_numeric($uid)) { return false; } if (!($table_prefix = get_table_prefix())) { return false; } if (($unread_cutoff_datetime = forum_get_unread_cutoff_datetime()) === false) { return false; } $unread_cutoff_timestamp = threads_get_unread_cutoff(); $user_ignored_completely = USER_IGNORED_COMPLETELY; $user_ignored = USER_IGNORED; $sql = "SELECT THREAD.TID, UNIX_TIMESTAMP(THREAD.MODIFIED) AS MODIFIED, "; $sql .= "THREAD.LENGTH, USER_THREAD.LAST_READ, USER_PEER.RELATIONSHIP, "; $sql .= "THREAD.UNREAD_PID FROM `{$table_prefix}THREAD` THREAD "; $sql .= "LEFT JOIN `{$table_prefix}USER_PEER` USER_PEER ON "; $sql .= "(USER_PEER.UID = '{$uid}' AND USER_PEER.PEER_UID = THREAD.BY_UID) "; $sql .= "LEFT JOIN `{$table_prefix}USER_THREAD` USER_THREAD "; $sql .= "ON (USER_THREAD.TID = THREAD.TID AND USER_THREAD.UID = '{$uid}') "; $sql .= "LEFT JOIN `{$table_prefix}USER_FOLDER` USER_FOLDER "; $sql .= "ON (USER_FOLDER.FID = THREAD.FID AND USER_FOLDER.UID = '{$uid}') "; $sql .= "WHERE THREAD.FID in ({$fidlist}) AND THREAD.DELETED = 'N' "; $sql .= "AND THREAD.LENGTH > 0 AND (USER_PEER.RELATIONSHIP IS NULL "; $sql .= "OR (USER_PEER.RELATIONSHIP & {$user_ignored_completely}) = 0) "; $sql .= "AND ((USER_PEER.RELATIONSHIP & {$user_ignored}) = 0 "; $sql .= "OR USER_PEER.RELATIONSHIP IS NULL OR THREAD.LENGTH > 1) "; $sql .= "AND (USER_THREAD.LAST_READ < THREAD.LENGTH OR USER_THREAD.LAST_READ IS NULL) "; $sql .= "AND THREAD.MODIFIED > CAST('{$unread_cutoff_datetime}' AS DATETIME) "; $sql .= "AND (USER_THREAD.INTEREST IS NULL OR USER_THREAD.INTEREST > -1) "; $sql .= "AND (USER_FOLDER.INTEREST IS NULL OR USER_FOLDER.INTEREST > -1) "; $sql .= "ORDER BY THREAD.MODIFIED DESC LIMIT 0, 1"; if (!($result = $db->query($sql))) { return false; } if ($result->num_rows == 0) { return false; } $message_data = $result->fetch_assoc(); if (!session::logged_in()) { return "{$message_data['TID']}.1"; } else { if (!isset($message_data['LAST_READ']) || !is_numeric($message_data['LAST_READ'])) { $message_data['LAST_READ'] = 1; if (isset($message_data['MODIFIED']) && $unread_cutoff_timestamp !== false && $message_data['MODIFIED'] < $unread_cutoff_timestamp) { $message_data['LAST_READ'] = $message_data['LENGTH']; } else { if (isset($message_data['UNREAD_PID']) && is_numeric($message_data['UNREAD_PID'])) { $message_data['LAST_READ'] = $message_data['UNREAD_PID']; } } return "{$message_data['TID']}.{$message_data['LAST_READ']}"; } else { if ($message_data['LAST_READ'] < $message_data['LENGTH']) { $message_data['LAST_READ']++; } return "{$message_data['TID']}.{$message_data['LAST_READ']}"; } } }