socsvn commit: r254407 - soc2013/mattbw/backend
mattbw at FreeBSD.org
mattbw at FreeBSD.org
Mon Jul 8 07:12:21 UTC 2013
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);
}
More information about the svn-soc-all
mailing list