diff options
Diffstat (limited to 'phpBB/includes/search/fulltext_postgres.php')
| -rw-r--r-- | phpBB/includes/search/fulltext_postgres.php | 48 | 
1 files changed, 41 insertions, 7 deletions
diff --git a/phpBB/includes/search/fulltext_postgres.php b/phpBB/includes/search/fulltext_postgres.php index 1475cc31d0..eeb628b18f 100644 --- a/phpBB/includes/search/fulltext_postgres.php +++ b/phpBB/includes/search/fulltext_postgres.php @@ -343,7 +343,7 @@ class phpbb_search_fulltext_postgres extends phpbb_search_base  	* @param	int			$per_page			number of ids each page is supposed to contain  	* @return	boolean|int						total number of results  	*/ -	public function keyword_search($type, $fields, $terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page) +	public function keyword_search($type, $fields, $terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, &$start, $per_page)  	{  		// No keywords? No posts  		if (!$this->search_query) @@ -371,6 +371,11 @@ class phpbb_search_fulltext_postgres extends phpbb_search_base  			implode(',', $author_ary)  		))); +		if ($start < 0) +		{ +			$start = 0; +		} +  		// try reading the results from cache  		$result_count = 0;  		if ($this->obtain_ids($search_key, $result_count, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE) @@ -495,11 +500,6 @@ class phpbb_search_fulltext_postgres extends phpbb_search_base  		$id_ary = array_unique($id_ary); -		if (!sizeof($id_ary)) -		{ -			return false; -		} -  		// if the total result count is not cached yet, retrieve it from the db  		if (!$result_count)  		{ @@ -518,6 +518,21 @@ class phpbb_search_fulltext_postgres extends phpbb_search_base  		$this->db->sql_transaction('commit'); +		if ($start >= $result_count) +		{ +			$start = floor(($result_count - 1) / $per_page) * $per_page; + +			$result = $this->db->sql_query_limit($sql, $this->config['search_block_size'], $start); + +			while ($row = $this->db->sql_fetchrow($result)) +			{ +				$id_ary[] = $row[$field]; +			} +			$this->db->sql_freeresult($result); + +			$id_ary = array_unique($id_ary); +		} +  		// store the ids, from start on then delete anything that isn't on the current page because we only need ids for one page  		$this->save_ids($search_key, implode(' ', $this->split_words), $author_ary, $result_count, $id_ary, $start, $sort_dir);  		$id_ary = array_slice($id_ary, 0, (int) $per_page); @@ -544,7 +559,7 @@ class phpbb_search_fulltext_postgres extends phpbb_search_base  	* @param	int			$per_page			number of ids each page is supposed to contain  	* @return	boolean|int						total number of results  	*/ -	public function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page) +	public function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, &$start, $per_page)  	{  		// No author? No posts  		if (!sizeof($author_ary)) @@ -568,6 +583,11 @@ class phpbb_search_fulltext_postgres extends phpbb_search_base  			$author_name,  		))); +		if ($start < 0) +		{ +			$start = 0; +		} +  		// try reading the results from cache  		$result_count = 0;  		if ($this->obtain_ids($search_key, $result_count, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE) @@ -710,6 +730,20 @@ class phpbb_search_fulltext_postgres extends phpbb_search_base  		$this->db->sql_transaction('commit'); +		if ($start >= $result_count) +		{ +			$start = floor(($result_count - 1) / $per_page) * $per_page; + +			$result = $this->db->sql_query_limit($sql, $this->config['search_block_size'], $start); +			while ($row = $this->db->sql_fetchrow($result)) +			{ +				$id_ary[] = (int) $row[$field]; +			} +			$this->db->sql_freeresult($result); + +			$id_ary = array_unique($id_ary); +		} +  		if (sizeof($id_ary))  		{  			$this->save_ids($search_key, '', $author_ary, $result_count, $id_ary, $start, $sort_dir);  | 
