socsvn commit: r254075 - in soc2013/mattbw/backend: . actions

mattbw at FreeBSD.org mattbw at FreeBSD.org
Fri Jul 5 00:59:10 UTC 2013


Author: mattbw
Date: Fri Jul  5 00:59:10 2013
New Revision: 254075
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=254075

Log:
  (builds, regresses) more work on the query system ready for querying to jobs.

Modified:
  soc2013/mattbw/backend/actions/install-packages.c
  soc2013/mattbw/backend/pk-backend-pkgng.c
  soc2013/mattbw/backend/query.c
  soc2013/mattbw/backend/query.h
  soc2013/mattbw/backend/utils.h

Modified: soc2013/mattbw/backend/actions/install-packages.c
==============================================================================
--- soc2013/mattbw/backend/actions/install-packages.c	Thu Jul  4 23:08:27 2013	(r254074)
+++ soc2013/mattbw/backend/actions/install-packages.c	Fri Jul  5 00:59:10 2013	(r254075)
@@ -22,12 +22,15 @@
 #include "../pk-backend.h"
 #include "pkg.h"
 
+#include "../hash_traverse.h"	/* HASH_FOR */
 #include "../query.h"		/* Package querying */
+#include "../utils.h"		/* INTENTIONALLY_IGNORE */
 
 #include "actions.h"		/* install_packages_thread prototype */
 
 static gboolean	body(struct query *q);
-/*static void	emit(struct pkg *pkg, const gchar *id, PkBackend *backend);*/
+static void	emit(struct pkg *pkg, const gchar *id, struct query *q);
+static void	job(struct pkg_jobs *jobs, struct query *q);
 
 /*
  * The thread that performs an InstallPackages operation. Should be invoked by
@@ -36,6 +39,7 @@
 gboolean
 install_packages_thread(PkBackend *backend)
 {
+
 	return query_for_all_ids(backend, PKG_LOAD_BASIC, body);
 }
 
@@ -45,7 +49,45 @@
 static gboolean
 body(struct query *q)
 {
-	/* TODO: actually install */
-	pk_backend_error_code(query_backend(q), PK_ERROR_ENUM_NOT_SUPPORTED, NULL);
-	return FALSE;
+
+	return query_emit_match(q, emit);
+}
+
+/*
+ * Tries to install the given package.
+ */
+static void
+emit(struct pkg *pkg, const gchar *id, struct query *q)
+{
+
+	INTENTIONALLY_IGNORE(id);
+	return query_emit_to_job(pkg, q, PKG_JOBS_INSTALL, job);
+}
+
+/*
+ * Tries to install the given package.
+ */
+static void
+job(struct pkg_jobs *jobs, struct query *q)
+{
+	int err;
+	PkBackend *backend;
+
+	backend = query_backend(q);
+
+	err = pkg_jobs_solve(jobs);
+	if (err == EPKG_OK) {
+		struct pkg *pkg;
+
+		pkg = NULL;
+		for (HASH_FOR(err, pkg_jobs, jobs, &pkg)) {
+			//pk_backend_package(backend,
+			//	PK_INFO_ENUM_INSTALLING,
+			;	
+
+		}
+	} else
+		pk_backend_error_code(backend,
+			PK_ERROR_ENUM_DEP_RESOLUTION_FAILED,
+			"could not solve the job");
 }

Modified: soc2013/mattbw/backend/pk-backend-pkgng.c
==============================================================================
--- soc2013/mattbw/backend/pk-backend-pkgng.c	Thu Jul  4 23:08:27 2013	(r254074)
+++ soc2013/mattbw/backend/pk-backend-pkgng.c	Fri Jul  5 00:59:10 2013	(r254075)
@@ -29,11 +29,10 @@
 #include "pk-backend.h"
 #include "pkg.h"
 
+#include "utils.h"		/* INTENTIONALLY_IGNORE */
 #include "groups.h"		/* available_groups */
 #include "actions/actions.h"	/* Actions threads */
 
-#define INTENTIONALLY_IGNORE(x)	(void)(x)
-
 /* static bodges */
 static guint	_progress_percentage = 0;
 static gulong	_signal_timeout = 0;

Modified: soc2013/mattbw/backend/query.c
==============================================================================
--- soc2013/mattbw/backend/query.c	Thu Jul  4 23:08:27 2013	(r254074)
+++ soc2013/mattbw/backend/query.c	Fri Jul  5 00:59:10 2013	(r254075)
@@ -46,41 +46,35 @@
 static const char *get_repo_of(struct pkg *pkg);
 static const char *get_repo_of_remote(struct pkg *pkg);
 static gboolean	match(struct query *q, gchar **match_id_p, struct pkg **match_pkg_p);
-static gboolean	try_id_match(struct pkg *pkg, struct query *q, gchar **match_id);
 static gboolean	match_id_in_it(struct pkgdb_it *it, struct query *q, gchar **match_id_p, struct pkg **match_pkg_p);
+static gboolean	try_id_match(struct pkg *pkg, struct query *q, gchar **match_id);
+static int	jobs_add_pkg(struct pkg_jobs *jobs, match_t type, struct pkg *pkg);
 static void	query_free_contents(struct query *q);
+static void	query_pkg_to_id_through(struct pkg *pkg, gchar **name_p, const gchar **strv);
 
 /* Returns the backend stored inside the struct query. */
-PkBackend *
+PkBackend      *
 query_backend(struct query *q)
 {
 	return (q == NULL ? NULL : q->backend);
 }
 
-static gboolean
-match_id_in_it(struct pkgdb_it *it,
-	       struct query *q,
-	       gchar **match_id_p,
-	       struct pkg **match_pkg_p)
+/* Converts a package to a PackageID. */
+void
+query_pkg_to_id(struct pkg *pkg, gchar **id_p)
 {
-	/* TODO: Filters */
-	gboolean	found;
-	int		err;
-	int		load_flags;
+	const gchar **id_bits;
 
-	found = FALSE;
-	*match_pkg_p = NULL;
-	*match_id_p = NULL;
-	load_flags = q->load_flags;
+	/* Make sure the initial string vector's pointers are all NULL */
+	id_bits = g_new0(const gchar *, 4);
 
-	for (HASH_FOR(err, pkgdb_it_next, it, match_pkg_p, load_flags)) {
-		if (try_id_match(*match_pkg_p, q, match_id_p) == TRUE) {
-			found = TRUE;
-			break;
-		}
-	}
+	/* This is split through an intermediate function so the same code 
+	 * can be used for the ID-checking logic.
+	 */
+	query_pkg_to_id_through(pkg, id_p, id_bits);
 
-	return found;
+	/* AFAIK we don't own any of the strings, so we don't use g_strfreev. */
+	g_free(id_bits);
 }
 
 /* Gets the PackageKit repository name for the package. */
@@ -139,33 +133,82 @@
 }
 
 static gboolean
+match_id_in_it(struct pkgdb_it *it,
+	       struct query *q,
+	       gchar **match_id_p,
+	       struct pkg **match_pkg_p)
+{
+	/* TODO: Filters */
+	gboolean	found;
+	int		err;
+	int		load_flags;
+
+	found = FALSE;
+	*match_pkg_p = NULL;
+	*match_id_p = NULL;
+	load_flags = q->load_flags;
+
+	for (HASH_FOR(err, pkgdb_it_next, it, match_pkg_p, load_flags)) {
+		if (try_id_match(*match_pkg_p, q, match_id_p) == TRUE) {
+			found = TRUE;
+			break;
+		}
+	}
+
+	return found;
+}
+
+static gboolean
 try_id_match(struct pkg *pkg, struct query *q, char **match_id)
 {
-	const char     *p_arch;
-	const char     *p_data;
-	const char     *p_name;
-	const char     *p_version;
+	gboolean cmp;
+	const gchar **pkg_id_bits;
 
-	pkg_get(pkg,
-		PKG_ARCH, &p_arch,
-		PKG_NAME, &p_name,
-		PKG_VERSION, &p_version);
-
-	p_data = get_repo_of(pkg);
-
-	if (*match_id != NULL)
-		g_free(*match_id);
-	*match_id = pk_package_id_build(p_name, p_version, p_arch, p_data);
+	pkg_id_bits = g_new0(const gchar *, 4);
+	query_pkg_to_id_through(pkg, match_id, pkg_id_bits);
 
+	
 	/*
 	 * Succeed if this package's PackageID fields match the original
 	 * PackageID.  Of course, the original ID might have missing fields
 	 * (NULLs), so we treat a comparison involving one as a success.
 	 */
-	return (string_match(q->name, p_name) &&
-		string_match(q->version, p_version) &&
-		string_match(q->arch, p_arch) &&
-		string_match(q->data, p_data)) ? TRUE : FALSE;
+	cmp = (string_match(q->name, pkg_id_bits[0]) &&
+		string_match(q->version, pkg_id_bits[1]) &&
+		string_match(q->arch, pkg_id_bits[2]) &&
+		string_match(q->data, pkg_id_bits[3])) ? TRUE : FALSE;
+	g_free(pkg_id_bits);
+
+	return cmp;
+}
+
+/* Adds a single package to a jobs structure. */
+static int
+jobs_add_pkg(struct pkg_jobs *jobs, match_t type, struct pkg *pkg)
+{
+	char *name;
+
+	pkg_get(pkg, PKG_NAME, &name);
+	return pkg_jobs_add(jobs, type, &name, 1);
+}
+
+/* Converts a package to a PackageID, dumping the intermediate information into
+ * the pointed-to string vector (which must have at least 4 places, and they
+ * should be NULL).
+ */
+static void
+query_pkg_to_id_through(struct pkg *pkg, gchar **id_p, const gchar **strv)
+{
+	pkg_get(pkg,
+		PKG_NAME, strv,
+		PKG_ARCH, strv + 1,
+		PKG_VERSION, strv + 2);
+
+	*(strv + 3) = get_repo_of(pkg);
+
+	if (*id_p != NULL)
+		g_free(*id_p);
+	*id_p = pk_package_id_build(strv[0], strv[1], strv[2], strv[3]);
 }
 
 /*
@@ -235,37 +278,43 @@
 }
 
 /*
- * Performs a package database query against a PackageID, and then adds the
- * matching results to a pkg job.
- * 
- * The round trip through the database seems like a strange idea given that
- * pkg_jobs takes a package name.  At the moment this is done to ensure that
- * the package matches the PackageID fully.
- * 
- * TODO: do something about the redundancy in both this and the emitter variant.
- */
-/*
- * // TODO: salvage something out of this gboolean emit_job(struct pkg *pkg,
- * const gchar *id, struct query *q, pkg_jobs_t type, job_ptr user) {
- * gboolean	success; gchar          *match_id; struct pkg     *match_pkg;
- * struct pkg_jobs *jobs;
- * 
- * success = TRUE; jobs = NULL;
- * 
- * q->load_flags = PKG_LOAD_BASIC; success = match(q, &match_id, &match_pkg); if
- * (success == TRUE && match_id != NULL && match_pkg != NULL) {
- * 
- * // Duplicated because pkg_jobs_add is not const correct. // gchar
- * *name; int		err;
- * 
- * err = pkg_jobs_new(&jobs, type, q->db); if (err != EPKG_OK) {
- * pk_backend_error_code(q->backend, PK_ERROR_ENUM_INTERNAL_ERROR,
- * "pkg_jobs_new failed"); success = FALSE; } else { name =
- * g_strdup(q->name); pkg_jobs_add(jobs, MATCH_EXACT, &name, 1);
- * g_free(name); } pkg_free(match_pkg); g_free(match_id);
- * 
- * return success; }
+ * For adapting an emitter function into one that solves and applies a job.
  */
+void
+query_emit_to_job(struct pkg *pkg,
+		  struct query *q,
+		  pkg_jobs_t type,
+		  job_emit_ptr job_emitter)
+{
+	int		err;
+	struct pkg_jobs *jobs;
+
+	jobs = NULL;
+	err = pkg_jobs_new(&jobs, type, q->db);
+	if (err == EPKG_OK) {
+		err = pkg_jobs_set_repository(jobs, q->data);
+		if (err == EPKG_OK) {
+			err = jobs_add_pkg(jobs, MATCH_EXACT, pkg);
+			if (err == EPKG_OK)
+				job_emitter(jobs, q);
+			else
+				pk_backend_error_code(q->backend,
+					       PK_ERROR_ENUM_INTERNAL_ERROR,
+						    "could not add to job");
+
+		} else
+			pk_backend_error_code(q->backend,
+					      PK_ERROR_ENUM_INTERNAL_ERROR,
+					      "could not set repo");
+
+	} else
+		pk_backend_error_code(q->backend,
+				      PK_ERROR_ENUM_INTERNAL_ERROR,
+				      "could not init pkg_jobs");
+
+	pkg_jobs_free(jobs);
+
+}
 
 /*
  * Performs a package database query against a (potentially partial)

Modified: soc2013/mattbw/backend/query.h
==============================================================================
--- soc2013/mattbw/backend/query.h	Thu Jul  4 23:08:27 2013	(r254074)
+++ soc2013/mattbw/backend/query.h	Fri Jul  5 00:59:10 2013	(r254075)
@@ -28,6 +28,7 @@
 struct query;
 
 typedef void    (*emit_ptr) (struct pkg *pkg, const gchar *id, struct query *q);
+typedef void    (*job_emit_ptr) (struct pkg_jobs *jobs, struct query *q);
 typedef gboolean (*query_body_ptr) (struct query *q);
 
 
@@ -35,6 +36,8 @@
 gboolean	query_emit_match(struct query *q, emit_ptr emitter);
 gboolean	query_for_all_ids(PkBackend *backend, int load_flags, query_body_ptr body);
 gboolean	query_init(const gchar *id, PkBackend *backend, struct pkgdb *db, int load_flags, struct query **q_p);
+void		query_emit_to_job(struct pkg *pkg, struct query *q, pkg_jobs_t type, job_emit_ptr job_emitter);
 void		query_free(struct query *q);
+void		query_pkg_to_id(struct pkg *pkg, gchar **id_p);
 
 #endif				/* !_PKGNG_BACKEND_QUERY_H_ */

Modified: soc2013/mattbw/backend/utils.h
==============================================================================
--- soc2013/mattbw/backend/utils.h	Thu Jul  4 23:08:27 2013	(r254074)
+++ soc2013/mattbw/backend/utils.h	Fri Jul  5 00:59:10 2013	(r254075)
@@ -24,6 +24,8 @@
 
 #include <glib.h>		/* gboolean */
 
+#define INTENTIONALLY_IGNORE(x)	(void)(x)
+
 const char     *null_if_empty(const char *in);
 gboolean
 split_id(const char *id,


More information about the svn-soc-all mailing list