Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Jul 2013 07:12:20 GMT
From:      mattbw@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r254407 - soc2013/mattbw/backend
Message-ID:  <201307080712.r687CKCK068912@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mattbw
Date: Mon Jul  8 07:12:20 2013
New Revision: 254407
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=254407

Log:
  (in-progress) create new datatypes to streamline query target passing

Modified:
  soc2013/mattbw/backend/query.c
  soc2013/mattbw/backend/query.h
  soc2013/mattbw/backend/query_match.c

Modified: soc2013/mattbw/backend/query.c
==============================================================================
--- soc2013/mattbw/backend/query.c	Mon Jul  8 06:12:38 2013	(r254406)
+++ soc2013/mattbw/backend/query.c	Mon Jul  8 07:12:20 2013	(r254407)
@@ -43,10 +43,7 @@
 	gboolean	any_repo;
 	gboolean	local_repo;
 
-	/* Query result routing */
-	emit_ptr	emitter;
-	job_emit_ptr	job_emitter;
-	pkg_jobs_t	job_type;
+	struct query_target *t;
 };
 
 static gboolean match_id_in_it(struct pkgdb_it *it, struct query *q, struct pkg
@@ -129,9 +126,12 @@
 	 * Assume any error is due to not finding packages. At time of
 	 * writing this is true, but may change.
 	 */
-	if (success == TRUE)
-		q->emitter(match_pkg, match_id, q);
-	else
+	if (success == TRUE) {
+		if (q->t->type == QUERY_EMIT)
+			q->t->data.emit.f(match_pkg, match_id, q);
+		else if (q->t->type == QUERY_JOB)
+			query_emit_to_job(match_pkg, match_id, q);
+	} else
 		pk_backend_error_code(q->backend,
 		    PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
 		    "package not found");
@@ -151,12 +151,7 @@
  * It also *finishes* the backend job.
  */
 gboolean
-query_do(PkBackend *backend,
-    unsigned int load_flags,
-    emit_ptr emitter,
-    pkg_jobs_t job_type,
-    job_emit_ptr job_emitter,
-    query_body_ptr body)
+query_do(PkBackend *backend, struct query_target *t, query_body_ptr body)
 {
 	gboolean	no_error_yet;
 	guint		i;
@@ -185,10 +180,7 @@
 		no_error_yet = query_do_single(package_ids[i],
 		    backend,
 		    db,
-		    load_flags,
-		    emitter,
-		    job_type,
-		    job_emitter,
+		    t,
 		    body);
 		pk_backend_set_percentage(backend, ((i * 100) / len));
 	}
@@ -210,24 +202,14 @@
 query_do_single(gchar *package_id,
     PkBackend *backend,
     struct pkgdb *db,
-    unsigned int load_flags,
-    emit_ptr emitter,
-    pkg_jobs_t job_type,
-    job_emit_ptr job_emitter,
+    struct query_target *t,
     query_body_ptr body)
 {
 	gboolean success;
 	struct query *q;
 
 	q = NULL;
-	success = query_init(package_id,
-	    backend,
-	    db,
-	    load_flags,
-	    emitter,
-	    job_type,
-	    job_emitter,
-	    &q);
+	success = query_init(package_id, backend, db, t, &q);
 	if (success)
 	    success = body(q);
 
@@ -255,7 +237,7 @@
 
 	backend = query_backend(q);
 
-	if (pkg_jobs_new(&jobs, q->job_type, q->db) != EPKG_OK) {
+	if (pkg_jobs_new(&jobs, q->t->data.job.type, q->db) != EPKG_OK) {
 		(void)pk_backend_error_code(backend,
 		    PK_ERROR_ENUM_INTERNAL_ERROR,
 		    "could not init pkg_jobs");
@@ -273,7 +255,7 @@
 		    "could not add to job");
 		goto cleanup;
 	}
-	success = q->job_emitter(jobs, q);
+	success = q->t->data.job.f(jobs, q);
 
 cleanup:
 	pkg_jobs_free(jobs);
@@ -287,14 +269,10 @@
 query_init(const gchar *id,
     PkBackend *backend,
     struct pkgdb *db,
-    unsigned int load_flags,
-    emit_ptr emitter,
-    pkg_jobs_t job_type,
-    job_emit_ptr job_emitter,
+    struct query_target *t,
     struct query **q_p)
 {
 	gboolean	success;
-	gboolean	loading_files;
 	struct query   *q;
 
 	q = *q_p;
@@ -304,11 +282,8 @@
 		query_free_contents(q);
 
 	q->backend = backend;
-	q->load_flags = load_flags;
 	q->db = db;
-	q->emitter = emitter;
-	q->job_type = job_type;
-	q->job_emitter = job_emitter;
+	q->t = t;
 
 	success = split_id(id,
 	    &(q->strv),
@@ -341,13 +316,18 @@
 	 * Stop pkg from catching fire if we try to load files from
 	 * non-installed packages.
 	 */
-	loading_files = (load_flags & PKG_LOAD_FILES) ? TRUE : FALSE;
-	if (q->local_repo == FALSE && loading_files) {
-		pk_backend_error_code(backend,
-		    PK_ERROR_ENUM_CANNOT_GET_FILELIST,
-		    "cannot get files for remote package");
-		success = FALSE;
-		goto cleanup;
+	if (q->t->type == QUERY_EMIT) {
+		gboolean	loading_files;
+
+		loading_files = (q->t->data.emit.load_flags &
+		    PKG_LOAD_FILES) ? TRUE : FALSE;
+		if (q->local_repo == FALSE && loading_files) {
+			pk_backend_error_code(backend,
+			    PK_ERROR_ENUM_CANNOT_GET_FILELIST,
+			    "cannot get files for remote package");
+			success = FALSE;
+			goto cleanup;
+		}
 	}
 cleanup:
 	if (success == FALSE) {
@@ -382,7 +362,11 @@
 
 	*match_pkg_p = NULL;
 	*match_id_p = NULL;
-	load_flags = q->load_flags;
+
+	if (q->t->type == QUERY_EMIT)
+		load_flags = q->t->data.emit.load_flags;
+	else
+		load_flags = PKG_LOAD_BASIC;
 
 	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)

Modified: soc2013/mattbw/backend/query.h
==============================================================================
--- soc2013/mattbw/backend/query.h	Mon Jul  8 06:12:38 2013	(r254406)
+++ soc2013/mattbw/backend/query.h	Mon Jul  8 07:12:20 2013	(r254407)
@@ -31,12 +31,31 @@
 typedef gboolean (*job_emit_ptr) (struct pkg_jobs *jobs, struct query *q);
 typedef gboolean (*query_body_ptr) (struct query *q);
 
+enum query_type {
+	QUERY_EMIT,
+	QUERY_JOB
+};
+
+struct query_target {
+	enum query_type type;
+	union {
+		struct {
+			int load_flags;
+			emit_ptr f;
+		} emit;
+		struct {
+			pkg_jobs_t type;
+			job_emit_ptr f;
+		} job;
+	} data;
+};
+
 PkBackend      *query_backend(struct query *q);
-gboolean	query_do(PkBackend *backend, unsigned int load_flags, emit_ptr emitter, pkg_jobs_t job_type, job_emit_ptr job_emitter, query_body_ptr body);
-gboolean	query_do_single(gchar *package_id, PkBackend *backend, struct pkgdb *db, unsigned int load_flags, emit_ptr emitter, pkg_jobs_t job_type, job_emit_ptr job_emitter, query_body_ptr body);
+gboolean	query_do(PkBackend *backend, struct query_target *t, query_body_ptr body);
+gboolean	query_do_single(gchar *package_id, PkBackend *backend, struct pkgdb *db, struct query_target *t, query_body_ptr body);
 gboolean	query_emit_to_job(struct pkg *pkg, const gchar *id, struct query *q);
 gboolean	query_find_match(struct query *q);
-gboolean	query_init(const gchar *id, PkBackend *backend, struct pkgdb *db, unsigned int load_flags, emit_ptr emitter, pkg_jobs_t job_type, job_emit_ptr job_emitter, struct query **q_p);
+gboolean	query_init(const gchar *id, PkBackend *backend, struct pkgdb *db, struct query_target *t, struct query **q_p);
 void		query_free(struct query *q);
 
 #endif				/* !_PKGNG_BACKEND_QUERY_H_ */

Modified: soc2013/mattbw/backend/query_match.c
==============================================================================
--- soc2013/mattbw/backend/query_match.c	Mon Jul  8 06:12:38 2013	(r254406)
+++ soc2013/mattbw/backend/query_match.c	Mon Jul  8 07:12:20 2013	(r254407)
@@ -39,13 +39,13 @@
 query_match_id_to_emitter(PkBackend *backend, unsigned int load_flags,
     emit_ptr emitter)
 {
+	struct query_target t;
 
-	return query_do(backend,
-	    load_flags,
-	    emitter,
-	    PKG_JOBS_INSTALL,	/* <-- does not matter what goes here */
-	    NULL,
-	    query_find_match);
+	t.type = QUERY_EMIT;
+	t.data.emit.load_flags = load_flags;
+	t.data.emit.f = emitter;
+
+	return query_do(backend, &t, query_find_match);
 }
 
 /*
@@ -57,11 +57,11 @@
 query_match_id_to_job(PkBackend *backend, pkg_jobs_t type,
     job_emit_ptr emitter)
 {
+	struct query_target t;
+
+	t.type = QUERY_JOB;
+	t.data.job.type = type;
+	t.data.job.f = emitter;
 
-	return query_do(backend,
-	    PKG_LOAD_BASIC,	/* <-- does not matter what goes here */
-	    query_emit_to_job,
-	    type,
-	    emitter,
-	    query_find_match);
+	return query_do(backend, &t, query_find_match);
 }



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