diff options
Diffstat (limited to 'web/lib/pkgfuncs.inc.php')
-rw-r--r-- | web/lib/pkgfuncs.inc.php | 229 |
1 files changed, 153 insertions, 76 deletions
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php index 47b8b6a..e8ac9f7 100644 --- a/web/lib/pkgfuncs.inc.php +++ b/web/lib/pkgfuncs.inc.php @@ -342,7 +342,7 @@ function pkgvotes_from_sid($sid="") { $pkgs = array(); if (!$sid) {return $pkgs;} $dbh = DB::connect(); - $q = "SELECT PackageID "; + $q = "SELECT PackageBaseID "; $q.= "FROM PackageVotes, Users, Sessions "; $q.= "WHERE Users.ID = Sessions.UsersID "; $q.= "AND Users.ID = PackageVotes.UsersID "; @@ -419,9 +419,14 @@ function pkgname_is_blacklisted($name) { function get_package_details($id=0) { $dbh = DB::connect(); - $q = "SELECT Packages.*,Category "; - $q.= "FROM Packages,PackageCategories "; - $q.= "WHERE Packages.CategoryID = PackageCategories.ID "; + $q = "SELECT Packages.*, PackageBases.Name AS BaseName, "; + $q.= "PackageBases.CategoryID, PackageBases.NumVotes, "; + $q.= "PackageBases.OutOfDateTS, PackageBases.SubmittedTS, "; + $q.= "PackageBases.ModifiedTS, PackageBases.SubmitterUID, "; + $q.= "PackageBases.MaintainerUID, PackageCategories.Category "; + $q.= "FROM Packages, PackageBases, PackageCategories "; + $q.= "WHERE PackageBases.ID = Packages.PackageBaseID "; + $q.= "AND PackageBases.CategoryID = PackageCategories.ID "; $q.= "AND Packages.ID = " . intval($id); $result = $dbh->query($q); @@ -565,17 +570,18 @@ function pkg_search_page($SID="") { } $q_select .= "Users.Username AS Maintainer, PackageCategories.Category, - Packages.Name, Packages.Version, Packages.Description, Packages.NumVotes, - Packages.ID, Packages.OutOfDateTS "; + Packages.Name, Packages.Version, Packages.Description, + PackageBases.NumVotes, Packages.ID, PackageBases.OutOfDateTS "; $q_from = "FROM Packages - LEFT JOIN Users ON (Packages.MaintainerUID = Users.ID) + LEFT JOIN PackageBases ON (PackageBases.ID = Packages.PackageBaseID) + LEFT JOIN Users ON (PackageBases.MaintainerUID = Users.ID) LEFT JOIN PackageCategories - ON (Packages.CategoryID = PackageCategories.ID) "; + ON (PackageBases.CategoryID = PackageCategories.ID) "; if ($SID) { /* This is not needed for the total row count query. */ $q_from_extra = "LEFT JOIN PackageVotes - ON (Packages.ID = PackageVotes.PackageID AND PackageVotes.UsersID = $myuid) + ON (PackageBases.ID = PackageVotes.PackageBaseID AND PackageVotes.UsersID = $myuid) LEFT JOIN CommentNotify ON (Packages.ID = CommentNotify.PkgID AND CommentNotify.UserID = $myuid) "; } else { @@ -603,16 +609,16 @@ function pkg_search_page($SID="") { elseif (isset($_GET["SeB"]) && $_GET["SeB"] == "n") { /* Search by name. */ $K = "%" . addcslashes($_GET['K'], '%_') . "%"; - $q_where .= "AND (Name LIKE " . $dbh->quote($K) . ") "; + $q_where .= "AND (Packages.Name LIKE " . $dbh->quote($K) . ") "; } elseif (isset($_GET["SeB"]) && $_GET["SeB"] == "x") { /* Search by name (exact match). */ - $q_where .= "AND (Name = " . $dbh->quote($_GET['K']) . ") "; + $q_where .= "AND (Packages.Name = " . $dbh->quote($_GET['K']) . ") "; } else { /* Search by name and description (default). */ $K = "%" . addcslashes($_GET['K'], '%_') . "%"; - $q_where .= "AND (Name LIKE " . $dbh->quote($K) . " OR "; + $q_where .= "AND (Packages.Name LIKE " . $dbh->quote($K) . " OR "; $q_where .= "Description LIKE " . $dbh->quote($K) . ") "; } } @@ -632,34 +638,35 @@ function pkg_search_page($SID="") { $order = (isset($_GET["SO"]) && $_GET["SO"] == 'd') ? 'DESC' : 'ASC'; - $q_sort = "ORDER BY Name ".$order." "; + $q_sort = "ORDER BY "; $sort_by = isset($_GET["SB"]) ? $_GET["SB"] : ''; switch ($sort_by) { case 'c': - $q_sort = "ORDER BY CategoryID ".$order.", Name ASC "; + $q_sort .= "CategoryID " . $order . ", "; break; case 'v': - $q_sort = "ORDER BY NumVotes ".$order.", Name ASC "; + $q_sort .= "NumVotes " . $order . ", "; break; case 'w': if ($SID) { - $q_sort = "ORDER BY Voted ".$order.", Name ASC "; + $q_sort .= "Voted " . $order . ", "; } break; case 'o': if ($SID) { - $q_sort = "ORDER BY Notify ".$order.", Name ASC "; + $q_sort .= "Notify " . $order . ", "; } break; case 'm': - $q_sort = "ORDER BY Maintainer ".$order.", Name ASC "; + $q_sort .= "Maintainer " . $order . ", "; break; case 'a': - $q_sort = "ORDER BY ModifiedTS ".$order.", Name ASC "; + $q_sort .= "ModifiedTS " . $order . ", "; break; default: break; } + $q_sort .= " Packages.Name " . $order . " "; $q_limit = "LIMIT ".$_GET["PP"]." OFFSET ".$_GET["O"]; @@ -758,6 +765,29 @@ function sanitize_ids($ids) { } /** + * Convert a list of package IDs into a list of corresponding package bases. + * + * @param array|int $ids Array of package IDs to convert + * + * @return array|int List of package base IDs + */ +function pkgbase_from_pkgid($ids) { + $dbh = DB::connect(); + + if (is_array($ids)) { + $q = "SELECT PackageBaseID FROM Packages "; + $q.= "WHERE ID IN (" . implode(",", $ids) . ")"; + $result = $dbh->query($q); + return $result->fetchAll(PDO::FETCH_COLUMN, 0); + } else { + $q = "SELECT PackageBaseID FROM Packages "; + $q.= "WHERE ID = " . $ids; + $result = $dbh->query($q); + return $result->fetch(PDO::FETCH_COLUMN, 0); + } +} + +/** * Flag package(s) as out-of-date * * @global string $AUR_LOCATION The AUR's URL used for notification e-mails @@ -774,15 +804,16 @@ function pkg_flag($atype, $ids) { } $ids = sanitize_ids($ids); + $base_ids = pkgbase_from_pkgid($ids); if (empty($ids)) { return array(false, __("You did not select any packages to flag.")); } $dbh = DB::connect(); - $q = "UPDATE Packages SET"; + $q = "UPDATE PackageBases SET"; $q.= " OutOfDateTS = UNIX_TIMESTAMP()"; - $q.= " WHERE ID IN (" . implode(",", $ids) . ")"; + $q.= " WHERE ID IN (" . implode(",", $base_ids) . ")"; $q.= " AND OutOfDateTS IS NULL"; $affected_pkgs = $dbh->exec($q); @@ -830,15 +861,16 @@ function pkg_unflag($atype, $ids) { } $ids = sanitize_ids($ids); + $base_ids = pkgbase_from_pkgid($ids); if (empty($ids)) { return array(false, __("You did not select any packages to unflag.")); } $dbh = DB::connect(); - $q = "UPDATE Packages SET "; + $q = "UPDATE PackageBases SET "; $q.= "OutOfDateTS = NULL "; - $q.= "WHERE ID IN (" . implode(",", $ids) . ") "; + $q.= "WHERE ID IN (" . implode(",", $base_ids) . ") "; if ($atype != "Trusted User" && $atype != "Developer") { $q.= "AND MaintainerUID = " . uid_from_sid($_COOKIE["AURSID"]); @@ -870,6 +902,7 @@ function pkg_delete ($atype, $ids, $mergepkgid) { } $ids = sanitize_ids($ids); + $base_ids = pkgbase_from_pkgid($ids); if (empty($ids)) { return array(false, __("You did not select any packages to delete.")); } @@ -878,6 +911,7 @@ function pkg_delete ($atype, $ids, $mergepkgid) { if ($mergepkgid) { $mergepkgname = pkgname_from_id($mergepkgid); + $mergepkgbase = pkgbase_from_pkgid($mergepkgid); } /* Send e-mail notifications. */ @@ -931,28 +965,32 @@ function pkg_delete ($atype, $ids, $mergepkgid) { $dbh->exec($q); /* Merge votes */ - foreach ($ids as $pkgid) { + foreach ($base_ids as $base_id) { $q = "UPDATE PackageVotes "; - $q.= "SET PackageID = " . intval($mergepkgid) . " "; - $q.= "WHERE PackageID = " . $pkgid . " "; + $q.= "SET PackageBaseID = " . intval($mergepkgbase) . " "; + $q.= "WHERE PackageBaseID = " . $base_id . " "; $q.= "AND UsersID NOT IN ("; $q.= "SELECT * FROM (SELECT UsersID "; $q.= "FROM PackageVotes "; - $q.= "WHERE PackageID = " . intval($mergepkgid); + $q.= "WHERE PackageBaseID = " . intval($mergepkgbase); $q.= ") temp)"; $dbh->exec($q); } - $q = "UPDATE Packages "; + $q = "UPDATE PackageBases "; $q.= "SET NumVotes = (SELECT COUNT(*) FROM PackageVotes "; - $q.= "WHERE PackageID = " . intval($mergepkgid) . ") "; - $q.= "WHERE ID = " . intval($mergepkgid); + $q.= "WHERE PackageBaseID = " . intval($mergepkgbase) . ") "; + $q.= "WHERE ID = " . intval($mergepkgbase); $dbh->exec($q); } $q = "DELETE FROM Packages WHERE ID IN (" . implode(",", $ids) . ")"; $result = $dbh->exec($q); + /* Deleting a package also removes the corresponding package base. */ + $q = "DELETE FROM PackageBases WHERE ID IN (" . implode(",", $base_ids) . ")"; + $result = $dbh->exec($q); + return array(true, __("The selected packages have been deleted.")); } @@ -974,7 +1012,8 @@ function pkg_adopt ($atype, $ids, $action=true) { } } - $ids = sanitize_ids($ids); + $pkg_ids = sanitize_ids($ids); + $ids = pkgbase_from_pkgid($pkg_ids); if (empty($ids)) { if ($action) { return array(false, __("You did not select any packages to adopt.")); @@ -986,7 +1025,7 @@ function pkg_adopt ($atype, $ids, $action=true) { $dbh = DB::connect(); $field = "MaintainerUID"; - $q = "UPDATE Packages "; + $q = "UPDATE PackageBases "; if ($action) { $user = uid_from_sid($_COOKIE["AURSID"]); @@ -1007,7 +1046,7 @@ function pkg_adopt ($atype, $ids, $action=true) { $dbh->exec($q); if ($action) { - pkg_notify(account_from_sid($_COOKIE["AURSID"]), $ids); + pkg_notify(account_from_sid($_COOKIE["AURSID"]), $pkg_ids); return array(true, __("The selected packages have been adopted.")); } else { return array(true, __("The selected packages have been disowned.")); @@ -1033,6 +1072,7 @@ function pkg_vote ($atype, $ids, $action=true) { } $ids = sanitize_ids($ids); + $base_ids = pkgbase_from_pkgid($ids); if (empty($ids)) { if ($action) { return array(false, __("You did not select any packages to vote for.")); @@ -1046,7 +1086,7 @@ function pkg_vote ($atype, $ids, $action=true) { $uid = uid_from_sid($_COOKIE["AURSID"]); $first = 1; - foreach ($ids as $pid) { + foreach ($base_ids as $pid) { if ($action) { $check = !isset($my_votes[$pid]); } else { @@ -1071,17 +1111,17 @@ function pkg_vote ($atype, $ids, $action=true) { /* Only add votes for packages the user hasn't already voted for. */ $op = $action ? "+" : "-"; - $q = "UPDATE Packages SET NumVotes = NumVotes $op 1 "; + $q = "UPDATE PackageBases SET NumVotes = NumVotes $op 1 "; $q.= "WHERE ID IN ($vote_ids)"; $dbh->exec($q); if ($action) { - $q = "INSERT INTO PackageVotes (UsersID, PackageID) VALUES "; + $q = "INSERT INTO PackageVotes (UsersID, PackageBaseID) VALUES "; $q.= $vote_clauses; } else { $q = "DELETE FROM PackageVotes WHERE UsersID = $uid "; - $q.= "AND PackageID IN ($vote_ids)"; + $q.= "AND PackageBaseID IN ($vote_ids)"; } $dbh->exec($q); @@ -1105,7 +1145,7 @@ function votes_for_pkgname($pkgname) { $q = "SELECT UsersID,Username,Name FROM PackageVotes "; $q.= "LEFT JOIN Users on (UsersID = Users.ID) "; - $q.= "LEFT JOIN Packages on (PackageID = Packages.ID) "; + $q.= "LEFT JOIN Packages on (PackageVotes.PackageBaseID = Packages.PackageBaseID) "; $q.= "WHERE Name = ". $dbh->quote($pkgname) . " "; $q.= "ORDER BY Username"; $result = $dbh->query($q); @@ -1133,8 +1173,10 @@ function votes_for_pkgname($pkgname) { function user_voted($uid, $pkgid) { $dbh = DB::connect(); - $q = "SELECT * FROM PackageVotes WHERE UsersID = ". $dbh->quote($uid); - $q.= " AND PackageID = " . $dbh->quote($pkgid); + $q = "SELECT * FROM PackageVotes, Packages WHERE "; + $q.= "PackageVotes.UsersID = ". $dbh->quote($uid) . " AND "; + $q.= "PackageVotes.PackageBaseID = Packages.PackageBaseID AND "; + $q.= "Packages.ID = " . $dbh->quote($pkgid); $result = $dbh->query($q); if ($result->fetch(PDO::FETCH_NUM)) { @@ -1301,10 +1343,10 @@ function pkg_change_category($pid, $atype) { return array(false, __("Invalid category ID.")); } + $base_id = pkgbase_from_pkgid($pid); + /* Verify package ownership. */ - $q = "SELECT Packages.MaintainerUID "; - $q.= "FROM Packages "; - $q.= "WHERE Packages.ID = ".$pid; + $q = "SELECT MaintainerUID FROM PackageBases WHERE ID = " . $base_id; $result = $dbh->query($q); if ($result) { $row = $result->fetch(PDO::FETCH_ASSOC); @@ -1316,9 +1358,9 @@ function pkg_change_category($pid, $atype) { $uid = uid_from_sid($_COOKIE["AURSID"]); if ($uid == $row["MaintainerUID"] || ($atype == "Developer" || $atype == "Trusted User")) { - $q = "UPDATE Packages "; + $q = "UPDATE PackageBases "; $q.= "SET CategoryID = ".intval($category_id)." "; - $q.= "WHERE ID = ".intval($pid); + $q.= "WHERE ID = ".intval($base_id); $dbh->exec($q); return array(true, __("Package category changed.")); } else { @@ -1335,7 +1377,14 @@ function pkg_change_category($pid, $atype) { */ function pkgdetails_by_pkgname($pkgname) { $dbh = DB::connect(); - $q = "SELECT * FROM Packages WHERE Name = " . $dbh->quote($pkgname); + $q = "SELECT Packages.*, PackageBases.Name AS BaseName, "; + $q.= "PackageBases.CategoryID, PackageBases.NumVotes, "; + $q.= "PackageBases.OutOfDateTS, PackageBases.SubmittedTS, "; + $q.= "PackageBases.ModifiedTS, PackageBases.SubmitterUID, "; + $q.= "PackageBases.MaintainerUID FROM Packages "; + $q.= "INNER JOIN PackageBases "; + $q.= "ON PackageBases.ID = Packages.PackageBaseID WHERE "; + $q.= "Packages.Name = " . $dbh->quote($pkgname); $result = $dbh->query($q); if ($result) { $row = $result->fetch(PDO::FETCH_ASSOC); @@ -1344,30 +1393,62 @@ function pkgdetails_by_pkgname($pkgname) { } /** + * Add package base information to the database + * + * @param string $name Name of the new package base + * @param int $category_id Category for the new package base + * @param int $uid User ID of the package uploader + * + * @return int ID of the new package base + */ +function create_pkgbase($name, $category_id, $uid) { + $dbh = DB::connect(); + $q = sprintf("INSERT INTO PackageBases (Name, CategoryID, " . + "SubmittedTS, ModifiedTS, SubmitterUID, MaintainerUID) " . + "VALUES (%s, %d, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), %d, %d)", + $dbh->quote($name), $category_id, $uid, $uid); + $dbh->exec($q); + return $dbh->lastInsertId(); +} + +/** * Add package information to the database for a specific package * + * @param int $base_id ID of the package base * @param string $pkgname Name of the new package * @param string $license License of the new package * @param string $pkgver Version of the new package - * @param int $category_id Category for the new package * @param string $pkgdesc Description of the new package * @param string $pkgurl Upstream URL for the new package + * + * @return int ID of the new package + */ +function create_pkg($base_id, $pkgname, $license, $pkgver, $pkgdesc, $pkgurl) { + $dbh = DB::connect(); + $q = sprintf("INSERT INTO Packages (PackageBaseID, Name, License, " . + "Version, Description, URL) VALUES (%d, %s, %s, %s, %s, %s)", + $base_id, $dbh->quote($pkgname), $dbh->quote($license), + $dbh->quote($pkgver), $dbh->quote($pkgdesc), + $dbh->quote($pkgurl)); + $dbh->exec($q); + return $dbh->lastInsertId(); +} + +/** + * Update package base information for a specific package base + * + * @param string $name Name of the updated package base + * @param int $base_id The package base ID of the affected package * @param int $uid User ID of the package uploader * * @return void */ -function new_pkgdetails($pkgname, $license, $pkgver, $category_id, $pkgdesc, $pkgurl, $uid) { +function update_pkgbase($base_id, $name, $uid) { $dbh = DB::connect(); - $q = sprintf("INSERT INTO Packages (Name, License, Version, CategoryID, Description, URL, SubmittedTS, ModifiedTS, SubmitterUID, MaintainerUID) VALUES (%s, %s, %s, %d, %s, %s, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), %d, %d)", - $dbh->quote($pkgname), - $dbh->quote($license), - $dbh->quote($pkgver), - $category_id, - $dbh->quote($pkgdesc), - $dbh->quote($pkgurl), - $uid, - $uid); - + $q = sprintf("UPDATE PackageBases SET " . + "Name = %s, ModifiedTS = UNIX_TIMESTAMP(), " . + "MaintainerUID = %d, OutOfDateTS = NULL WHERE ID = %d", + $dbh->quote($name), $uid, $base_id); $dbh->exec($q); } @@ -1384,18 +1465,16 @@ function new_pkgdetails($pkgname, $license, $pkgver, $category_id, $pkgdesc, $pk * * @return void */ -function update_pkgdetails($pkgname, $license, $pkgver, $pkgdesc, $pkgurl, $uid, $pkgid) { +function update_pkg($pkgname, $license, $pkgver, $pkgdesc, $pkgurl, $pkgid) { $dbh = DB::connect(); - /* This is an overwrite of an existing package! */ - $q = sprintf("UPDATE Packages SET ModifiedTS = UNIX_TIMESTAMP(), Name = %s, Version = %s, License = %s, Description = %s, URL = %s, OutOfDateTS = NULL, MaintainerUID = %d WHERE ID = %d", - $dbh->quote($pkgname), - $dbh->quote($pkgver), - $dbh->quote($license), - $dbh->quote($pkgdesc), - $dbh->quote($pkgurl), - $uid, - $pkgid); - + $q = sprintf("UPDATE Packages SET Name = %s, Version = %s, " . + "License = %s, Description = %s, URL = %s WHERE ID = %d", + $dbh->quote($pkgname), + $dbh->quote($pkgver), + $dbh->quote($license), + $dbh->quote($pkgdesc), + $dbh->quote($pkgurl), + $pkgid); $dbh->exec($q); } @@ -1435,19 +1514,17 @@ function add_pkg_src($pkgid, $pkgsrc) { } /** - * Change the category a package belongs to + * Change the category a package base belongs to * - * @param int $pkgid The package ID to change the category for + * @param int $base_id The package base ID to change the category for * @param int $category_id The new category ID for the package * * @return void */ -function update_pkg_category($pkgid, $category_id) { +function update_pkgbase_category($base_id, $category_id) { $dbh = DB::connect(); - $q = sprintf( "UPDATE Packages SET CategoryID = %d WHERE ID = %d", - $category_id, - $pkgid); - + $q = sprintf("UPDATE PackageBases SET CategoryID = %d WHERE ID = %d", + $category_id, $base_id); $dbh->exec($q); } |