[aur-dev] [PATCH 3/6] Store package groups in the database

Lukas Fleischer archlinux at cryptocrack.de
Sat Apr 26 08:54:14 EDT 2014


Signed-off-by: Lukas Fleischer <archlinux at cryptocrack.de>
---
 UPGRADING                | 18 ++++++++++++++++++
 schema/aur-schema.sql    | 21 +++++++++++++++++++++
 web/html/pkgsubmit.php   |  9 ++++++++-
 web/lib/pkgfuncs.inc.php | 43 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 90 insertions(+), 1 deletion(-)

diff --git a/UPGRADING b/UPGRADING
index f523140..814fea1 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -199,6 +199,24 @@ CREATE TABLE PackageRelations (
 ) ENGINE = InnoDB;
 ----
 
+17. Create tables to store package groups:
+
+----
+CREATE TABLE Groups (
+	ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
+	Name VARCHAR(64) NOT NULL,
+	PRIMARY KEY (ID),
+	UNIQUE (Name)
+) ENGINE = InnoDB;
+CREATE TABLE PackageGroups (
+	PackageID INTEGER UNSIGNED NOT NULL,
+	GroupID INTEGER UNSIGNED NOT NULL,
+	PRIMARY KEY (PackageID, GroupID),
+	FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE,
+	FOREIGN KEY (GroupID) REFERENCES Groups(ID) ON DELETE CASCADE
+) ENGINE = InnoDB;
+----
+
 From 2.2.0 to 2.3.0
 -------------------
 
diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql
index c98ba77..ae42fd3 100644
--- a/schema/aur-schema.sql
+++ b/schema/aur-schema.sql
@@ -133,6 +133,27 @@ CREATE TABLE Packages (
 ) ENGINE = InnoDB;
 
 
+-- Information about groups
+--
+CREATE TABLE Groups (
+	ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
+	Name VARCHAR(64) NOT NULL,
+	PRIMARY KEY (ID),
+	UNIQUE (Name)
+) ENGINE = InnoDB;
+
+
+-- Information about package-group-relations
+--
+CREATE TABLE PackageGroups (
+	PackageID INTEGER UNSIGNED NOT NULL,
+	GroupID INTEGER UNSIGNED NOT NULL,
+	PRIMARY KEY (PackageID, GroupID),
+	FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE,
+	FOREIGN KEY (GroupID) REFERENCES Groups(ID) ON DELETE CASCADE
+) ENGINE = InnoDB;
+
+
 -- Define the package dependency types
 --
 CREATE TABLE DependencyTypes (
diff --git a/web/html/pkgsubmit.php b/web/html/pkgsubmit.php
index 3df38d8..107441f 100644
--- a/web/html/pkgsubmit.php
+++ b/web/html/pkgsubmit.php
@@ -151,6 +151,7 @@ if ($uid):
 					}
 				}
 				$section_info = array(
+					'groups' => array(),
 					'depends' => array(),
 					'makedepends' => array(),
 					'checkdepends' => array(),
@@ -169,6 +170,7 @@ if ($uid):
 			case 'license':
 				$section_info[$key] = $value;
 				break;
+			case 'groups':
 			case 'source':
 			case 'depends':
 			case 'makedepends':
@@ -196,7 +198,7 @@ if ($uid):
 			if (!isset($pkgbase_info['pkgbase'])) {
 				$pkgbase_info['pkgbase'] = $pkgbase_info['pkgname'];
 			}
-			foreach (array('source', 'depends', 'makedepends', 'checkdepends', 'optdepends', 'conflicts', 'provides', 'replaces') as $array_opt) {
+			foreach (array('groups', 'source', 'depends', 'makedepends', 'checkdepends', 'optdepends', 'conflicts', 'provides', 'replaces') as $array_opt) {
 				if (empty($pkgbase_info[$array_opt])) {
 					$pkgbase_info[$array_opt] = array();
 				} else {
@@ -357,6 +359,11 @@ if ($uid):
 			foreach ($pkginfo as $pi) {
 				$pkgid = pkg_create($base_id, $pi['pkgname'], $pi['license'], $pi['full-version'], $pi['pkgdesc'], $pi['url']);
 
+				foreach ($pi['groups'] as $grp) {
+					$grpid = pkg_create_group($grp);
+					pkg_add_grp($pkgid, $grpid);
+				}
+
 				foreach (array('depends', 'makedepends', 'checkdepends', 'optdepends') as $deptype) {
 					foreach ($pi[$deptype] as $dep) {
 						$deppkgname = preg_replace("/(<|=|>).*/", "", $dep);
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index a04f525..f80d4b4 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -805,3 +805,46 @@ function pkg_add_src($pkgid, $pkgsrc) {
 
 	$dbh->exec($q);
 }
+
+/**
+ * Creates a new group and returns its ID
+ *
+ * If the groups already exists, the ID of the already existing group is
+ * returned.
+ *
+ * @param string $name The name of the group to create
+ *
+ * @return int The ID of the group
+ */
+function pkg_create_group($name) {
+	$dbh = DB::connect();
+	$q = sprintf("SELECT ID FROM Groups WHERE Name = %s", $dbh->quote($name));
+	$result = $dbh->query($q);
+	if ($result) {
+		$grpid = $result->fetch(PDO::FETCH_COLUMN, 0);
+		if ($grpid > 0) {
+			return $grpid;
+		}
+	}
+
+	$q = sprintf("INSERT INTO Groups (Name) VALUES (%s)", $dbh->quote($name));
+	$dbh->exec($q);
+	return $dbh->lastInsertId();
+}
+
+/**
+ * Add a package to a group
+ *
+ * @param int $pkgid The package ID of the package to add
+ * @param int $grpid The group ID of the group to add the package to
+ *
+ * @return void
+ */
+function pkg_add_grp($pkgid, $grpid) {
+	$dbh = DB::connect();
+	$q = sprintf("INSERT INTO PackageGroups (PackageID, GroupID) VALUES (%d, %d)",
+		$pkgid,
+		$grpid
+	);
+	$dbh->exec($q);
+}
-- 
1.9.2



More information about the aur-dev mailing list