summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Fleischer <lfleischer@archlinux.org>2019-10-06 18:59:34 +0200
committerLukas Fleischer <lfleischer@archlinux.org>2019-10-06 22:13:38 +0200
commit1283fe4918adb369432ea2acc378610a3d5142a9 (patch)
tree51e99ed1cccae85823213049fe81a9ab00e43a76
parentef8bad5bbfa208daf3496dccd16c14577ba5607b (diff)
downloadaur-1283fe4918adb369432ea2acc378610a3d5142a9.tar.gz
aur-1283fe4918adb369432ea2acc378610a3d5142a9.tar.xz
Cache package provider and dependency information
The package provider and dependency queries are quite CPU-intensive and usually yield rather small result sets. Cache these values if the global caching mechanism is enabled. Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
-rw-r--r--web/lib/cachefuncs.inc.php17
-rw-r--r--web/lib/pkgfuncs.inc.php40
2 files changed, 28 insertions, 29 deletions
diff --git a/web/lib/cachefuncs.inc.php b/web/lib/cachefuncs.inc.php
index 881ad8f2..b2b96c24 100644
--- a/web/lib/cachefuncs.inc.php
+++ b/web/lib/cachefuncs.inc.php
@@ -79,4 +79,21 @@ function db_cache_value($dbq, $key, $ttl=600) {
return $value;
}
+# Run a simple db query, retrieving and/or caching the result set if APC is
+# available for use. Accepts an optional TTL value (defaults to 600 seconds).
+function db_cache_result($dbq, $key, $fetch_style=PDO::FETCH_NUM, $ttl=600) {
+ $dbh = DB::connect();
+ $status = false;
+ $value = get_cache_value($key, $status);
+ if (!$status) {
+ $result = $dbh->query($dbq);
+ if (!$result) {
+ return false;
+ }
+ $value = $result->fetchAll($fetch_style);
+ set_cache_value($key, $value, $ttl);
+ }
+ return $value;
+}
+
?>
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 00f0cc45..3e4b2a8f 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -222,17 +222,7 @@ function pkg_providers($name) {
$q.= "UNION ";
$q.= "SELECT 0, Name FROM OfficialProviders ";
$q.= "WHERE Provides = " . $dbh->quote($name);
- $result = $dbh->query($q);
-
- if (!$result) {
- return array();
- }
-
- $providers = array();
- while ($row = $result->fetch(PDO::FETCH_NUM)) {
- $providers[] = $row;
- }
- return $providers;
+ return db_cache_result($q, 'providers:' . $name);
}
/**
@@ -244,26 +234,18 @@ function pkg_providers($name) {
* @return array All package dependencies for the package
*/
function pkg_dependencies($pkgid, $limit) {
- $deps = array();
$pkgid = intval($pkgid);
- if ($pkgid > 0) {
- $dbh = DB::connect();
- $q = "SELECT pd.DepName, dt.Name, pd.DepDesc, ";
- $q.= "pd.DepCondition, pd.DepArch, p.ID ";
- $q.= "FROM PackageDepends pd ";
- $q.= "LEFT JOIN Packages p ON pd.DepName = p.Name ";
- $q.= "LEFT JOIN DependencyTypes dt ON dt.ID = pd.DepTypeID ";
- $q.= "WHERE pd.PackageID = ". $pkgid . " ";
- $q.= "ORDER BY pd.DepName LIMIT " . intval($limit);
- $result = $dbh->query($q);
- if (!$result) {
- return array();
- }
- while ($row = $result->fetch(PDO::FETCH_NUM)) {
- $deps[] = $row;
- }
+ if (!$pkgid) {
+ return array();
}
- return $deps;
+ $q = "SELECT pd.DepName, dt.Name, pd.DepDesc, ";
+ $q.= "pd.DepCondition, pd.DepArch, p.ID ";
+ $q.= "FROM PackageDepends pd ";
+ $q.= "LEFT JOIN Packages p ON pd.DepName = p.Name ";
+ $q.= "LEFT JOIN DependencyTypes dt ON dt.ID = pd.DepTypeID ";
+ $q.= "WHERE pd.PackageID = ". $pkgid . " ";
+ $q.= "ORDER BY pd.DepName LIMIT " . intval($limit);
+ return db_cache_result($q, 'dependencies:' . $pkgid);
}
/**