Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Jun 2013 22:55:42 GMT
From:      mattbw@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r253303 - soc2013/mattbw/dummy
Message-ID:  <201306202255.r5KMtg57090890@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mattbw
Date: Thu Jun 20 22:55:42 2013
New Revision: 253303
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253303

Log:
  use query/rquery instead of search; first signs of working

Modified:
  soc2013/mattbw/dummy/Makefile
  soc2013/mattbw/dummy/get-details.c

Modified: soc2013/mattbw/dummy/Makefile
==============================================================================
--- soc2013/mattbw/dummy/Makefile	Thu Jun 20 21:50:04 2013	(r253302)
+++ soc2013/mattbw/dummy/Makefile	Thu Jun 20 22:55:42 2013	(r253303)
@@ -1,8 +1,5 @@
 # $FreeBSD$
 
-# Temporary
-CC=		clang
-
 LIB=		pk_backend_pkgng
 SHLIB_MAJOR=	1
 SRCS=		pk-backend-pkgng.c get-details.c

Modified: soc2013/mattbw/dummy/get-details.c
==============================================================================
--- soc2013/mattbw/dummy/get-details.c	Thu Jun 20 21:50:04 2013	(r253302)
+++ soc2013/mattbw/dummy/get-details.c	Thu Jun 20 22:55:42 2013	(r253303)
@@ -18,6 +18,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#include <string.h>
+
 #include <glib.h>
 #include "pk-backend.h"
 #include "pkg.h"
@@ -30,6 +32,7 @@
 	struct pkg	*match;
 
 	found = FALSE;
+	match = NULL;
 	do {
 		err = pkgdb_it_next(matches, &match, PKG_LOAD_BASIC);
 		if (err == EPKG_OK) {
@@ -50,12 +53,17 @@
 			    PKG_REPONAME, &reponame,
 			    PKG_WWW, &www);
 
-			if (type == PKG_FILE)
+			switch(pkg_type(match)) {
+			case PKG_FILE:
 				data = "local";
-			else if (type == PKG_INSTALLED)
+				break;
+			case PKG_INSTALLED:
 				data = "installed";
-			else
+				break;
+			default:
 				data = reponame;
+				break;
+			}
 
 			if ((id_name == NULL || g_strcmp0(name, id_name) == 0) &&
 			    (id_version == NULL || g_strcmp0(version, id_version) == 0) &&
@@ -81,13 +89,57 @@
 		}
 	} while (err == EPKG_OK && found == FALSE);
 
-	if (found == FALSE)
-		pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "name matches found but no packageid matches");
-		
 	return found;
 }
 
 gboolean
+get_local_details(gchar *name,
+    gchar *version,
+    gchar *arch,
+    PkBackend *backend,
+    struct pkgdb *db)
+{
+	struct pkgdb_it *it;
+	gboolean	success;
+
+	success = FALSE;
+	it = pkgdb_query(db, name, MATCH_EXACT);
+	if (it)
+		success = get_details_check_matches(
+		    it,
+		    name,
+		    version,
+		    arch,
+		    "installed",
+		    backend);
+	return success;
+}
+
+gboolean
+get_remote_details(gchar *name,
+    gchar *version,
+    gchar *arch,
+    gchar *reponame,
+    PkBackend *backend,
+    struct pkgdb *db)
+{
+	struct pkgdb_it *it;
+	gboolean	success;
+
+	success = FALSE;
+	it = pkgdb_rquery(db, name, MATCH_EXACT, reponame);
+	if (it)
+		success = get_details_check_matches(
+		    it,
+		    name,
+		    version,
+		    arch,
+		    reponame,
+		    backend);
+	return success;
+}
+
+gboolean
 get_details_for(gchar *package_id, PkBackend *backend, struct pkgdb *db)
 {
 	gchar	      **parts;
@@ -97,24 +149,58 @@
 
 	parts = pk_package_id_split(package_id);
 	if (parts == NULL) 
-		pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
+		pk_backend_error_code(backend,
+		    PK_ERROR_ENUM_PACKAGE_ID_INVALID,
+		    "invalid package id");
 	else {
 		struct pkgdb_it *packages;
+		/* Parts of the package ID */
+		gchar	*name;
+		gchar	*version;
+		gchar	*arch;
+		gchar	*data;
+
+		name = parts[PK_PACKAGE_ID_NAME];
+		if (name != NULL && strlen(name) == 0)
+			name = NULL;
+
+		version = parts[PK_PACKAGE_ID_VERSION];
+		if (version != NULL && strlen(version) == 0)
+			version = NULL;
+
+		arch = parts[PK_PACKAGE_ID_ARCH];
+		if (arch != NULL && strlen(arch) == 0)
+			arch = NULL;
+
+		data = parts[PK_PACKAGE_ID_DATA];
+		if (data != NULL && strlen(data) == 0)
+			data = NULL;
 
-		packages = pkgdb_search(db, parts[PK_PACKAGE_ID_NAME], MATCH_EXACT, FIELD_NAME, NULL);
 
-		if (packages) {
-			success = get_details_check_matches(packages,
-			    parts[PK_PACKAGE_ID_NAME],
-			    parts[PK_PACKAGE_ID_VERSION],
-			    parts[PK_PACKAGE_ID_ARCH],
-			    parts[PK_PACKAGE_ID_DATA],
-			    backend);
-
-			pkgdb_it_free(packages);
-		} else
-			pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "no name matches");
 
+		/* If the PackageID is for an installed package, do a local query.
+		 * If it is for a specific repo, do a remote query on it.
+		 * And if the PackageID has no repository information at all, 
+		 * check both local and repo-generic remote.
+		 * (TODO: local packages?)
+		 */
+		if (g_strcmp0(data, "installed") == 0)
+			success = get_local_details(name, version, arch, backend, db);
+		else if (data != NULL) /* FIXME: treats 'local' as repo */
+			success = get_remote_details(name, version, arch, data, backend, db);
+		else {
+			/* TODO: ensure this is correct behaviour */
+			success = get_local_details(name, version, arch, backend, db);
+			if (success == FALSE)
+				success = get_remote_details(name, version, arch, data, backend, db);
+		}
+		/* Assume any error is due to not finding packages.
+		 * At time of writing this is true, but may change.
+		 */
+		if (success == FALSE)
+			pk_backend_error_code(backend,
+			    PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
+			    "package not found");
 		g_strfreev(parts);
 	}
 	



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306202255.r5KMtg57090890>