summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/lib/aurjson.class.php29
-rw-r--r--web/lib/pkgfuncs.inc.php34
2 files changed, 39 insertions, 24 deletions
diff --git a/web/lib/aurjson.class.php b/web/lib/aurjson.class.php
index 0ac586fe..86eae22b 100644
--- a/web/lib/aurjson.class.php
+++ b/web/lib/aurjson.class.php
@@ -1,6 +1,7 @@
<?php
include_once("aur.inc.php");
+include_once("pkgfuncs.inc.php");
/*
* This class defines a remote interface for fetching data from the AUR using
@@ -80,7 +81,7 @@ class AurJSON {
if (isset($http_data['v'])) {
$this->version = intval($http_data['v']);
}
- if ($this->version < 1 || $this->version > 5) {
+ if ($this->version < 1 || $this->version > 6) {
return $this->json_error('Invalid version specified.');
}
@@ -140,7 +141,7 @@ class AurJSON {
}
/*
- * Check if an IP needs to be rate limited.
+ * Check if an IP needs to be rate limited.
*
* @param $ip IP of the current request
*
@@ -192,7 +193,7 @@ class AurJSON {
$value = get_cache_value('ratelimit-ws:' . $ip, $status);
if (!$status || ($status && $value < $deletion_time)) {
if (set_cache_value('ratelimit-ws:' . $ip, $time, $window_length) &&
- set_cache_value('ratelimit:' . $ip, 1, $window_length)) {
+ set_cache_value('ratelimit:' . $ip, 1, $window_length)) {
return;
}
} else {
@@ -370,7 +371,7 @@ class AurJSON {
} elseif ($this->version >= 2) {
if ($this->version == 2 || $this->version == 3) {
$fields = implode(',', self::$fields_v2);
- } else if ($this->version == 4 || $this->version == 5) {
+ } else if ($this->version >= 4 && $this->version <= 6) {
$fields = implode(',', self::$fields_v4);
}
$query = "SELECT {$fields} " .
@@ -492,13 +493,21 @@ class AurJSON {
if (strlen($keyword_string) < 2) {
return $this->json_error('Query arg too small.');
}
- $keyword_string = $this->dbh->quote("%" . addcslashes($keyword_string, '%_') . "%");
- if ($search_by === 'name') {
- $where_condition = "(Packages.Name LIKE $keyword_string)";
- } else if ($search_by === 'name-desc') {
- $where_condition = "(Packages.Name LIKE $keyword_string OR ";
- $where_condition .= "Description LIKE $keyword_string)";
+ if ($this->version >= 6 && $search_by === 'name-desc') {
+ $where_condition = construct_keyword_search($this->dbh,
+ $keyword_string, true, false);
+ } else {
+ $keyword_string = $this->dbh->quote(
+ "%" . addcslashes($keyword_string, '%_') . "%");
+
+ if ($search_by === 'name') {
+ $where_condition = "(Packages.Name LIKE $keyword_string)";
+ } else if ($search_by === 'name-desc') {
+ $where_condition = "(Packages.Name LIKE $keyword_string ";
+ $where_condition .= "OR Description LIKE $keyword_string)";
+ }
+
}
} else if ($search_by === 'maintainer') {
if (empty($keyword_string)) {
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 80758005..ac5c8cfe 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -696,8 +696,10 @@ function pkg_search_page($params, $show_headers=true, $SID="") {
$q_where .= "AND (PackageBases.Name LIKE " . $dbh->quote($K) . ") ";
}
elseif (isset($params["SeB"]) && $params["SeB"] == "k") {
- /* Search by keywords. */
- $q_where .= construct_keyword_search($dbh, $params['K'], false);
+ /* Search by name. */
+ $q_where .= "AND (";
+ $q_where .= construct_keyword_search($dbh, $params['K'], false, true);
+ $q_where .= ") ";
}
elseif (isset($params["SeB"]) && $params["SeB"] == "N") {
/* Search by name (exact match). */
@@ -709,7 +711,9 @@ function pkg_search_page($params, $show_headers=true, $SID="") {
}
else {
/* Keyword search (default). */
- $q_where .= construct_keyword_search($dbh, $params['K'], true);
+ $q_where .= "AND (";
+ $q_where .= construct_keyword_search($dbh, $params['K'], true, true);
+ $q_where .= ") ";
}
}
@@ -832,10 +836,11 @@ function pkg_search_page($params, $show_headers=true, $SID="") {
* @param handle $dbh Database handle
* @param string $keywords The search term
* @param bool $namedesc Search name and description fields
+ * @param bool $keyword Search packages with a matching PackageBases.Keyword
*
* @return string WHERE part of the SQL clause
*/
-function construct_keyword_search($dbh, $keywords, $namedesc) {
+function construct_keyword_search($dbh, $keywords, $namedesc, $keyword=false) {
$count = 0;
$where_part = "";
$q_keywords = "";
@@ -860,13 +865,18 @@ function construct_keyword_search($dbh, $keywords, $namedesc) {
$term = "%" . addcslashes($term, '%_') . "%";
$q_keywords .= $op . " (";
+ $q_keywords .= "Packages.Name LIKE " . $dbh->quote($term) . " ";
if ($namedesc) {
- $q_keywords .= "Packages.Name LIKE " . $dbh->quote($term) . " OR ";
- $q_keywords .= "Description LIKE " . $dbh->quote($term) . " OR ";
+ $q_keywords .= "OR Description LIKE " . $dbh->quote($term) . " ";
+ }
+
+ if ($keyword) {
+ $q_keywords .= "OR EXISTS (SELECT * FROM PackageKeywords WHERE ";
+ $q_keywords .= "PackageKeywords.PackageBaseID = Packages.PackageBaseID AND ";
+ $q_keywords .= "PackageKeywords.Keyword LIKE " . $dbh->quote($term) . ")) ";
+ } else {
+ $q_keywords .= ") ";
}
- $q_keywords .= "EXISTS (SELECT * FROM PackageKeywords WHERE ";
- $q_keywords .= "PackageKeywords.PackageBaseID = Packages.PackageBaseID AND ";
- $q_keywords .= "PackageKeywords.Keyword LIKE " . $dbh->quote($term) . ")) ";
$count++;
if ($count >= 20) {
@@ -875,11 +885,7 @@ function construct_keyword_search($dbh, $keywords, $namedesc) {
$op = "AND ";
}
- if (!empty($q_keywords)) {
- $where_part = "AND (" . $q_keywords . ") ";
- }
-
- return $where_part;
+ return $q_keywords;
}
/**