socsvn commit: r254742 - in soc2013/mattbw: . backend backend/actions backend/query
mattbw at FreeBSD.org
mattbw at FreeBSD.org
Sat Jul 13 07:45:26 UTC 2013
Author: mattbw
Date: Sat Jul 13 07:45:25 2013
New Revision: 254742
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=254742
Log:
refactor jobs query code
Added:
soc2013/mattbw/backend/query/jobs.c
soc2013/mattbw/backend/query/jobs.h
Modified:
soc2013/mattbw/ (props changed)
soc2013/mattbw/README
soc2013/mattbw/backend/ (props changed)
soc2013/mattbw/backend/Makefile
soc2013/mattbw/backend/actions/ (props changed)
soc2013/mattbw/backend/actions/install_packages.c
soc2013/mattbw/backend/db.h
soc2013/mattbw/backend/query/ (props changed)
soc2013/mattbw/backend/query/core.c
soc2013/mattbw/backend/query/core.h
Modified: soc2013/mattbw/README
==============================================================================
--- soc2013/mattbw/README Sat Jul 13 04:25:03 2013 (r254741)
+++ soc2013/mattbw/README Sat Jul 13 07:45:25 2013 (r254742)
@@ -17,9 +17,8 @@
- pkgng (currently building against version 1.1.3; higher versions might work)
- FreeBSD (tested with 9.1; should work with higher versions)
-Tested primarily with clang in C99 mode; C89 mode likely will not work and C11
-would not work due to header file problems. GNU extensions probably won't break
-the build.
+Tested primarily with clang in C11 mode; C89 mode likely will not work and C99
+likely would need GNU/clang extensions.
--------------------------------------------------------------------------------
Modified: soc2013/mattbw/backend/Makefile
==============================================================================
--- soc2013/mattbw/backend/Makefile Sat Jul 13 04:25:03 2013 (r254741)
+++ soc2013/mattbw/backend/Makefile Sat Jul 13 07:45:25 2013 (r254742)
@@ -25,6 +25,7 @@
SRCS+= \
query/core.c \
query/do.c \
+ query/jobs.c \
query/match.c
LIBDIR= /usr/local/lib/packagekit-backend
Modified: soc2013/mattbw/backend/actions/install_packages.c
==============================================================================
--- soc2013/mattbw/backend/actions/install_packages.c Sat Jul 13 04:25:03 2013 (r254741)
+++ soc2013/mattbw/backend/actions/install_packages.c Sat Jul 13 07:45:25 2013 (r254742)
@@ -31,7 +31,6 @@
static bool job (struct pkg_jobs *jobs, struct query *q);
static bool sim_job(struct pkg_jobs *jobs, struct query *q);
-static bool solve_job(struct query *q, struct pkg_jobs *jobs);
/*
* The thread that performs an InstallPackages operation. Should be invoked
@@ -78,21 +77,20 @@
backend = query_backend(q);
query_set_percentage(q, 0);
- if (solve_job(q, jobs) == false)
- goto cleanup;
-
pkg_event_register(event_cb, backend);
(void)pk_backend_set_status(backend, PK_STATUS_ENUM_INSTALL);
- if (pkg_jobs_apply(jobs) != EPKG_OK) {
+ if (pkg_jobs_count(jobs) == 0)
+ ERR(backend,
+ PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED,
+ "nothing to do");
+ else if (pkg_jobs_apply(jobs) != EPKG_OK)
ERR(backend,
PK_ERROR_ENUM_PACKAGE_FAILED_TO_INSTALL,
"job failed");
- goto cleanup;
- }
- success = true;
+ else
+ success = true;
-cleanup:
pkg_event_register(NULL, NULL);
query_set_percentage(q, 100);
return success;
@@ -109,12 +107,8 @@
struct pkg *pkg;
backend = query_backend(q);
- success = false;
query_set_percentage(q, 0);
- if (solve_job(q, jobs) == false)
- goto cleanup;
-
(void)pk_backend_set_status(backend, PK_STATUS_ENUM_RUNNING);
pkg = NULL;
while (pkg_jobs(jobs, &pkg) == EPKG_OK)
@@ -124,34 +118,6 @@
success = true;
-cleanup:
query_set_percentage(q, 100);
return success;
}
-
-/*
- * Solves a job and ensures it has packages available.
- */
-static bool
-solve_job(struct query *q, struct pkg_jobs *jobs)
-{
- bool success;
- PkBackend *backend;
-
- success = false;
- backend = query_backend(q);
-
- (void)pk_backend_set_status(backend, PK_STATUS_ENUM_DEP_RESOLVE);
- if (pkg_jobs_solve(jobs) != EPKG_OK)
- ERR(backend,
- PK_ERROR_ENUM_DEP_RESOLUTION_FAILED,
- "could not solve the job");
- else if (pkg_jobs_count(jobs) == 0)
- ERR(backend,
- PK_ERROR_ENUM_INTERNAL_ERROR,
- "job contains no packages");
- else
- success = true;
-
- return success;
-}
Modified: soc2013/mattbw/backend/db.h
==============================================================================
--- soc2013/mattbw/backend/db.h Sat Jul 13 04:25:03 2013 (r254741)
+++ soc2013/mattbw/backend/db.h Sat Jul 13 07:45:25 2013 (r254742)
@@ -1,5 +1,4 @@
/*-
- *
* Copyright (C) 2013 Matt Windsor <mattbw at FreeBSD.org>
*
* Licensed under the GNU General Public License Version 2
Modified: soc2013/mattbw/backend/query/core.c
==============================================================================
--- soc2013/mattbw/backend/query/core.c Sat Jul 13 04:25:03 2013 (r254741)
+++ soc2013/mattbw/backend/query/core.c Sat Jul 13 07:45:25 2013 (r254742)
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include <assert.h> /* assert */
#include <stdbool.h>
#include <string.h>
#include <glib.h>
@@ -29,6 +30,7 @@
#include "../utils.h" /* string_match */
#include "../pkgutils.h" /* pkgutils_... */
#include "core.h" /* Prototypes */
+#include "jobs.h" /* query_jobs...*/
enum repo_type {
REPO_INVALID,
@@ -50,16 +52,26 @@
};
static bool can_remote_iterate(struct query *q);
-static bool emit_to_job(struct pkg *pkg, struct query *q);
-static const gchar *query_repo(struct query *q);
+static bool emit(struct pkg *pkg, const char *match_id, struct query *q);
static enum repo_type type_of_repo_name(const char *name);
static gchar *match_pkg(struct pkg *pkg, struct query *q);
static gchar **init_unpack_source(PkBackend *backend, struct query_source *s);
-static int jobs_add_pkg(struct pkg_jobs *jobs, match_t type, struct pkg *pkg);
-static int jobs_repo_from_query(struct pkg_jobs *jobs, struct query *q);
static struct pkg *match_iterator(struct pkgdb_it *it, struct query *q, gchar **match_id_p);
/*
+ * Returns the backend stored inside the given query.
+ */
+PkBackend *
+query_backend(struct query *q)
+{
+
+ assert (q != NULL);
+ assert (q->backend != NULL);
+
+ return q->backend;
+}
+
+/*
* Runs an assembled query.
*/
bool
@@ -77,6 +89,8 @@
struct pkgdb *db;
struct pkgdb_it *it;
+ assert(q != NULL);
+
success = false;
match = MATCH_EXACT;
match_id = NULL;
@@ -120,12 +134,8 @@
ERR(q->backend,
PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
"package not found");
- else {
- if (q->t->type == QUERY_EMIT)
- success = q->t->emit.f(pkg, match_id, q);
- else if (q->t->type == QUERY_JOB)
- success = emit_to_job(pkg, q);
- }
+ else
+ emit(pkg, match_id, q);
pkg_free(pkg);
g_free(match_id);
@@ -133,12 +143,31 @@
return success;
}
-/* Returns the backend stored inside the struct query. */
-PkBackend *
-query_backend(struct query *q)
+/*
+ * Retrieves the repository for the query, or NULL if none is specified.
+ */
+const char *
+query_repo(struct query *q)
+{
+ const gchar *repo;
+
+ assert(q != NULL);
+
+ repo = q->id_strv[PK_PACKAGE_ID_DATA];
+ return ((repo == NULL || repo[0] == '\0') ? NULL : repo);
+}
+
+/*
+ * Returns the database stored inside the given query.
+ */
+struct pkgdb *
+query_db(struct query *q)
{
- return (q == NULL ? NULL : q->backend);
+ assert(q != NULL);
+ assert(q->db != NULL);
+
+ return q->db;
}
/*
@@ -155,6 +184,11 @@
bool success;
struct query *q;
+ assert(backend != NULL);
+ assert(db != NULL);
+ assert(s != NULL);
+ assert(t != NULL);
+
success = false;
q = calloc(1, sizeof(struct query));
@@ -217,6 +251,8 @@
{
guint scaled_percent;
+ assert(q != NULL);
+
if (percent == PK_BACKEND_PERCENTAGE_INVALID)
scaled_percent = PK_BACKEND_PERCENTAGE_INVALID;
else {
@@ -239,6 +275,8 @@
{
bool sane;
+ assert(q != NULL);
+
/* Innocent until proven guilty */
sane = true;
@@ -257,49 +295,32 @@
}
/*
- * For adapting an emitter function into one that solves and applies a job.
+ * Sends a query result to the appropriate emitter.
*/
static bool
-emit_to_job(struct pkg *pkg, struct query *q)
+emit(struct pkg *pkg, const char *match_id, struct query *q)
{
bool success;
- struct pkg_jobs *jobs;
- PkBackend *backend;
-
- success = false;
- jobs = NULL;
-
- if (q == NULL)
- goto cleanup;
- backend = query_backend(q);
-
- if (pkg_jobs_new(&jobs, q->t->job.type, q->db) != EPKG_OK) {
- ERR(backend,
- PK_ERROR_ENUM_INTERNAL_ERROR,
- "could not init pkg_jobs");
- goto cleanup;
- }
- if (jobs_repo_from_query(jobs, q) != EPKG_OK) {
- ERR(backend,
- PK_ERROR_ENUM_REPO_NOT_FOUND,
- "could not set repo");
- goto cleanup;
- }
- if (jobs_add_pkg(jobs, MATCH_EXACT, pkg) != EPKG_OK) {
- ERR(backend,
- PK_ERROR_ENUM_INTERNAL_ERROR,
- "could not add to job");
- goto cleanup;
+ assert(match_id != NULL);
+ assert(pkg != NULL);
+ assert(q != NULL);
+
+ switch(q->t->type) {
+ case QUERY_EMIT:
+ success = q->t->emit.f(pkg, match_id, q);
+ break;
+ case QUERY_JOB:
+ success = query_jobs_run(q, pkg, q->t->job.type, q->t->job.f);
+ break;
}
- success = q->t->job.f(jobs, q);
-cleanup:
- pkg_jobs_free(jobs);
return success;
}
-/* Finds the type of the given PackageKit repository name. */
+/*
+ * Finds the type of the given PackageKit repository name.
+ */
static enum repo_type
type_of_repo_name(const char *name)
{
@@ -330,6 +351,9 @@
gchar *match_id;
const char **pkg_id_bits;
+ assert(pkg != NULL);
+ assert(q != NULL);
+
pkg_id_bits = calloc(4, sizeof(const char *));
match_id = pkgutils_pkg_to_id_through(pkg, pkg_id_bits);
@@ -361,43 +385,6 @@
return match_id;
}
-/* Retrieves the repository for the query, or NULL if none is specified. */
-static const gchar *
-query_repo(struct query *q)
-{
- const gchar *repo;
-
- repo = q->id_strv[PK_PACKAGE_ID_DATA];
- return ((repo == NULL || repo[0] == '\0') ? NULL : repo);
-}
-
-/* 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;
-
- name = NULL;
- pkg_get(pkg, PKG_NAME, &name);
- return pkg_jobs_add(jobs, type, &name, 1);
-}
-
-/* Sets a jobset to target the repository the given query is looking in. */
-static int
-jobs_repo_from_query(struct pkg_jobs *jobs, struct query *q)
-{
- int err;
- gchar *repo;
-
- repo = q->id_strv[PK_PACKAGE_ID_DATA];
- if (repo == NULL || repo[0] == '\0')
- err = EPKG_OK;
- else
- err = pkg_jobs_set_repository(jobs, repo);
-
- return err;
-}
-
/*
* Tries to find a query-matching package in a database iterator. Returns the
* package if one matches, or NULL; if match_id_p is non-null, its full
@@ -410,10 +397,11 @@
gchar *match_id;
struct pkg *pkg;
- if (q->t->type == QUERY_EMIT)
- load_flags = q->t->emit.load_flags;
- else
- load_flags = PKG_LOAD_BASIC;
+ assert(it != NULL);
+ assert(q != NULL);
+
+ load_flags = (q->t->type == QUERY_EMIT) ?
+ q->t->emit.load_flags : PKG_LOAD_BASIC;
match_id = NULL;
pkg = NULL;
Modified: soc2013/mattbw/backend/query/core.h
==============================================================================
--- soc2013/mattbw/backend/query/core.h Sat Jul 13 04:25:03 2013 (r254741)
+++ soc2013/mattbw/backend/query/core.h Sat Jul 13 07:45:25 2013 (r254742)
@@ -72,9 +72,10 @@
};
PkBackend *query_backend(struct query *q);
-bool query_run (struct query *q);
+bool query_run(struct query *q);
+const char *query_repo(struct query *q);
+struct pkgdb *query_db(struct query *q);
struct query *query_init(PkBackend *backend, struct pkgdb *db, struct query_source *s, struct query_target *t);
void query_free(struct query **q_p);
void query_set_percentage(struct query *q, unsigned char percent);
-
#endif /* !_PKGNG_BACKEND_QUERY_CORE_H_ */
Added: soc2013/mattbw/backend/query/jobs.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2013/mattbw/backend/query/jobs.c Sat Jul 13 07:45:25 2013 (r254742)
@@ -0,0 +1,106 @@
+/*-
+ * Copyright (C) 2013 Matt Windsor <mattbw at FreeBSD.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <assert.h> /* assert */
+#include <stdbool.h> /* bool, true, false */
+#include "../pk-backend.h" /* pk..., Pk... */
+#include "pkg.h" /* pkg... */
+
+#include "../utils.h" /* ERR */
+#include "core.h" /* query_... */
+#include "jobs.h" /* query_jobs_... */
+
+static int add_pkg(struct pkg_jobs *jobs, match_t type, struct pkg *pkg);
+static int repo_from_query(struct pkg_jobs *jobs, struct query *q);
+
+/*
+ * Creates a job of type "type" for the given package, solves it, and sends it
+ * to the emitter function "f" alongside its parent query.
+ */
+bool
+query_jobs_run(struct query *q, struct pkg *pkg, pkg_jobs_t type,
+ job_emit_ptr f)
+{
+ bool success;
+ struct pkg_jobs *jobs;
+ PkBackend *backend;
+
+ assert (q != NULL);
+ assert (pkg != NULL);
+ assert (f != NULL);
+
+ success = false;
+ jobs = NULL;
+
+ backend = query_backend(q);
+
+ if (pkg_jobs_new(&jobs, type, query_db(q)) != EPKG_OK) {
+ ERR(backend,
+ PK_ERROR_ENUM_INTERNAL_ERROR,
+ "could not init pkg_jobs");
+ goto cleanup;
+ }
+ if (repo_from_query(jobs, q) != EPKG_OK) {
+ ERR(backend,
+ PK_ERROR_ENUM_REPO_NOT_FOUND,
+ "could not set repo");
+ goto cleanup;
+ }
+ if (add_pkg(jobs, MATCH_EXACT, pkg) != EPKG_OK) {
+ ERR(backend,
+ PK_ERROR_ENUM_INTERNAL_ERROR,
+ "could not add to job");
+ goto cleanup;
+ }
+ if (pkg_jobs_solve(jobs) != EPKG_OK) {
+ ERR(backend,
+ PK_ERROR_ENUM_DEP_RESOLUTION_FAILED,
+ "could not solve the job");
+ goto cleanup;
+ }
+
+ success = f(jobs, q);
+
+cleanup:
+ pkg_jobs_free(jobs);
+ return success;
+}
+
+/* Adds a single package to a jobs structure. */
+static int
+add_pkg(struct pkg_jobs *jobs, match_t type, struct pkg *pkg)
+{
+ char *name;
+
+ name = NULL;
+ pkg_get(pkg, PKG_NAME, &name);
+ return pkg_jobs_add(jobs, type, &name, 1);
+}
+
+/* Sets a jobset to target the repository the given query is looking in. */
+static int
+repo_from_query(struct pkg_jobs *jobs, struct query *q)
+{
+ const char *repo;
+
+ repo = query_repo(q);
+
+ return (repo == NULL ? EPKG_OK : pkg_jobs_set_repository(jobs, repo));
+}
Added: soc2013/mattbw/backend/query/jobs.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2013/mattbw/backend/query/jobs.h Sat Jul 13 07:45:25 2013 (r254742)
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (C) 2013 Matt Windsor <mattbw at FreeBSD.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _PKGNG_BACKEND_QUERY_JOBS_H_
+#define _PKGNG_BACKEND_QUERY_JOBS_H_
+
+#include "pkg.h" /* struct pkg */
+
+#include "core.h" /* struct query */
+
+bool query_jobs_run(struct query *q, struct pkg *pkg, pkg_jobs_t type, job_emit_ptr f);
+
+#endif /* !_PKGNG_BACKEND_QUERY_JOBS_H_ */
More information about the svn-soc-all
mailing list