socsvn commit: r253829 - in soc2013/mattbw/backend: . actions
mattbw at FreeBSD.org
mattbw at FreeBSD.org
Tue Jul 2 06:17:33 UTC 2013
Author: mattbw
Date: Tue Jul 2 06:17:32 2013
New Revision: 253829
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253829
Log:
(still segfaults) we don't need a separate job match if we allow the database to be retrieved from the emitter
Modified:
soc2013/mattbw/backend/actions/get-details.c
soc2013/mattbw/backend/actions/get-files.c
soc2013/mattbw/backend/actions/install-packages.c
soc2013/mattbw/backend/pk-backend-pkgng.c
soc2013/mattbw/backend/query.c
soc2013/mattbw/backend/query.h
Modified: soc2013/mattbw/backend/actions/get-details.c
==============================================================================
--- soc2013/mattbw/backend/actions/get-details.c Tue Jul 2 04:45:51 2013 (r253828)
+++ soc2013/mattbw/backend/actions/get-details.c Tue Jul 2 06:17:32 2013 (r253829)
@@ -30,8 +30,8 @@
static const int LOAD_FLAGS = PKG_LOAD_BASIC | PKG_LOAD_LICENSES;
-static void emit_pkg(struct pkg *pkg, const gchar *id, PkBackend *backend);
-static gboolean get_for(const gchar *id, PkBackend *backend, struct pkgdb *db);
+static gboolean body(struct query *q);
+static void emit(struct pkg *pkg, const gchar *id, struct query *q);
/*
* The thread that performs a GetDetails operation. Should be invoked by the
@@ -40,7 +40,7 @@
gboolean
get_details_thread(PkBackend *backend)
{
- return iterate_ids(backend, get_for);
+ return query_for_all_ids(backend, LOAD_FLAGS, body);
}
/*
@@ -48,16 +48,16 @@
* found.
*/
static gboolean
-get_for(const gchar *id, PkBackend *backend, struct pkgdb *db)
+body(struct query *q)
{
- return query_emit_match(id, backend, db, LOAD_FLAGS, emit_pkg);
+ return query_emit_match(q, emit);
}
/*
* Emits the given package's details. To be used as an iterating function.
*/
static void
-emit_pkg(struct pkg *pkg, const gchar *id, PkBackend *backend)
+emit(struct pkg *pkg, const gchar *id, struct query *q)
{
const char *description;
const char *origin;
@@ -71,7 +71,7 @@
PKG_ORIGIN, &origin,
PKG_WWW, &www);
- pk_backend_details(backend,
+ pk_backend_details(query_backend(q),
id,
license_name_from_pkg(pkg),
group_from_origin(origin),
Modified: soc2013/mattbw/backend/actions/get-files.c
==============================================================================
--- soc2013/mattbw/backend/actions/get-files.c Tue Jul 2 04:45:51 2013 (r253828)
+++ soc2013/mattbw/backend/actions/get-files.c Tue Jul 2 06:17:32 2013 (r253829)
@@ -32,24 +32,34 @@
static const int FILE_NAME_STEP = 10;
static const int LOAD_FLAGS = PKG_LOAD_BASIC | PKG_LOAD_FILES;
-static void emit_pkg(struct pkg *pkg, const gchar *id, PkBackend *backend);
-static gboolean get_for(const gchar *id, PkBackend *backend, struct pkgdb *db);
+static gboolean body(struct query *q);
+static void emit(struct pkg *pkg, const gchar *id, struct query *q);
/*
* The thread that performs a GetDetails operation. Should be invoked by the
- * pk_backend_get_files hook.
+ * pk_backend_get_details hook.
*/
gboolean
get_files_thread(PkBackend *backend)
{
- return iterate_ids(backend, get_for);
+ return query_for_all_ids(backend, LOAD_FLAGS, body);
+}
+
+/*
+ * Look up and emit package details for the given PackageID, if it can be
+ * found.
+ */
+static gboolean
+body(struct query *q)
+{
+ return query_emit_match(q, emit);
}
/*
* Emits the given package's files. To be used as an iterating function.
*/
static void
-emit_pkg(struct pkg *pkg, const gchar *id, PkBackend *backend)
+emit(struct pkg *pkg, const gchar *id, struct query *q)
{
struct pkg_file *file;
int err;
@@ -81,16 +91,6 @@
joined_filenames = g_strjoinv(";", filenames);
g_strfreev(filenames);
- pk_backend_files(backend, id, joined_filenames);
+ pk_backend_files(query_backend(q), id, joined_filenames);
g_free(joined_filenames);
}
-
-/*
- * Look up and emit package files for the given PackageID, if it can be
- * found.
- */
-gboolean
-get_for(const gchar *id, PkBackend *backend, struct pkgdb *db)
-{
- return query_emit_match(id, backend, db, LOAD_FLAGS, emit_pkg);
-}
Modified: soc2013/mattbw/backend/actions/install-packages.c
==============================================================================
--- soc2013/mattbw/backend/actions/install-packages.c Tue Jul 2 04:45:51 2013 (r253828)
+++ soc2013/mattbw/backend/actions/install-packages.c Tue Jul 2 06:17:32 2013 (r253829)
@@ -26,7 +26,8 @@
#include "actions.h" /* install_packages_thread prototype */
-static gboolean get_for(const gchar *id, PkBackend *backend, struct pkgdb *db);
+static gboolean body(struct query *q);
+/*static void emit(struct pkg *pkg, const gchar *id, PkBackend *backend);*/
/*
* The thread that performs an InstallPackages operation. Should be invoked by
@@ -35,29 +36,16 @@
gboolean
install_packages_thread(PkBackend *backend)
{
- return iterate_ids(backend, get_for);
+ return query_for_all_ids(backend, PKG_LOAD_BASIC, body);
}
/*
* Look up and attempt to install the given PackageID, if it can be found.
*/
static gboolean
-get_for(const gchar *id, PkBackend *backend, struct pkgdb *db)
+body(struct query *q)
{
- struct pkg_jobs *jobs;
- int err;
-
- jobs = NULL;
- err = pkg_jobs_new(&jobs, PKG_JOBS_INSTALL, db);
-
- if (err != EPKG_OK)
- pk_backend_error_code(backend,
- PK_ERROR_ENUM_INTERNAL_ERROR,
- "pkg_jobs_new failed");
- else
- err = query_job_match(id, backend, db, jobs);
-
/* TODO: actually install */
- pk_backend_error_code(backend, PK_ERROR_ENUM_NOT_SUPPORTED, NULL);
- return err;
+ pk_backend_error_code(query_backend(q), PK_ERROR_ENUM_NOT_SUPPORTED, NULL);
+ return FALSE;
}
Modified: soc2013/mattbw/backend/pk-backend-pkgng.c
==============================================================================
--- soc2013/mattbw/backend/pk-backend-pkgng.c Tue Jul 2 04:45:51 2013 (r253828)
+++ soc2013/mattbw/backend/pk-backend-pkgng.c Tue Jul 2 06:17:32 2013 (r253829)
@@ -45,9 +45,7 @@
static gboolean _updated_powertop = FALSE;
static gboolean _has_signature = FALSE;
static gboolean _use_eula = FALSE;
-static gboolean _use_media = FALSE;
static gboolean _use_gpg = FALSE;
-static gboolean _use_trusted = TRUE;
static gboolean _use_distro_upgrade = FALSE;
static PkBitfield _filters = 0;
static GSocket *_socket = NULL;
@@ -357,43 +355,6 @@
_signal_timeout = g_timeout_add(1000, pk_backend_get_updates_timeout, backend);
}
-static gboolean
-pk_backend_install_timeout(gpointer data)
-{
- PkBackend *backend = (PkBackend *)data;
- guint sub_percent;
-
- if (_progress_percentage == 100) {
- pk_backend_finished(backend);
- return FALSE;
- }
- if (_progress_percentage == 30) {
- pk_backend_set_allow_cancel(backend, FALSE);
- pk_backend_package(backend, PK_INFO_ENUM_INSTALLING,
- "gtkhtml2;2.19.1-4.fc8;i386;fedora",
- "An HTML widget for GTK+ 2.0");
- pk_backend_set_status(backend, PK_STATUS_ENUM_INSTALL);
- }
- if (_progress_percentage == 50) {
- pk_backend_package(backend, PK_INFO_ENUM_INSTALLING,
- "gtkhtml2-devel;2.19.1-0.fc8;i386;fedora",
- "Devel files for gtkhtml");
- /* this duplicate package should be ignored */
- pk_backend_package(backend, PK_INFO_ENUM_INSTALLING,
- "gtkhtml2-devel;2.19.1-0.fc8;i386;fedora", NULL);
- pk_backend_set_status(backend, PK_STATUS_ENUM_INSTALL);
- }
- if (_progress_percentage > 30 && _progress_percentage < 50) {
- sub_percent = ((gfloat) (_progress_percentage - 30.0) / 20.0) * 100.0;
- pk_backend_set_sub_percentage(backend, sub_percent);
- } else {
- pk_backend_set_sub_percentage(backend, PK_BACKEND_PERCENTAGE_INVALID);
- }
- _progress_percentage += 1;
- pk_backend_set_percentage(backend, _progress_percentage);
- return TRUE;
-}
-
/**
* pk_backend_install_packages:
*/
@@ -401,6 +362,7 @@
pk_backend_install_packages(PkBackend *backend, gboolean only_trusted, gchar **package_ids)
{
INTENTIONALLY_IGNORE(only_trusted);
+ INTENTIONALLY_IGNORE(package_ids);
pk_backend_set_status(backend, PK_STATUS_ENUM_QUERY);
pk_backend_set_percentage(backend, PK_BACKEND_PERCENTAGE_INVALID);
Modified: soc2013/mattbw/backend/query.c
==============================================================================
--- soc2013/mattbw/backend/query.c Tue Jul 2 04:45:51 2013 (r253828)
+++ soc2013/mattbw/backend/query.c Tue Jul 2 06:17:32 2013 (r253829)
@@ -43,15 +43,23 @@
gboolean local_repo;
};
-
static const char *get_repo_of(struct pkg *pkg);
static const char *get_repo_of_remote(struct pkg *pkg);
-static gboolean try_id_match(struct pkg *pkg, struct query *state, gchar **match_id);
-static gboolean match(struct query *state, gchar **match_id_p, struct pkg **match_pkg_p);
+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 void query_free_contents(struct query *q);
+
+/* Returns the backend stored inside the struct query. */
+PkBackend *
+query_backend(struct query *q)
+{
+ return (q == NULL ? NULL : q->backend);
+}
-gboolean
+static gboolean
match_id_in_it(struct pkgdb_it *it,
- struct query *state,
+ struct query *q,
gchar **match_id_p,
struct pkg **match_pkg_p)
{
@@ -63,10 +71,10 @@
found = FALSE;
*match_pkg_p = NULL;
*match_id_p = NULL;
- load_flags = state->load_flags;
+ 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, state, match_id_p) == TRUE) {
+ if (try_id_match(*match_pkg_p, q, match_id_p) == TRUE) {
found = TRUE;
break;
}
@@ -131,7 +139,7 @@
}
static gboolean
-try_id_match(struct pkg *pkg, struct query *state, char **match_id)
+try_id_match(struct pkg *pkg, struct query *q, char **match_id)
{
const char *p_arch;
const char *p_data;
@@ -154,38 +162,46 @@
* PackageID. Of course, the original ID might have missing fields
* (NULLs), so we treat a comparison involving one as a success.
*/
- return (string_match(state->name, p_name) &&
- string_match(state->version, p_version) &&
- string_match(state->arch, p_arch) &&
- string_match(state->data, p_data)) ? TRUE : FALSE;
+ 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;
}
/*
- * Iterates over a set of PackageIDs provided for this job with a function.
+ * Iterates a query function over all PackageIDs provided for this job.
*
- * This provides each iterating function call with an open database connection
- * and updates the percentage after each iteration.
+ * This provides each iterating function call with a query structure ready to
+ * run and updates the percentage after each iteration.
*
* It also *finishes* the backend job.
*/
gboolean
-iterate_ids(PkBackend *backend, ids_func_ptr iterate_f)
+query_for_all_ids(PkBackend *backend, int load_flags, query_body_ptr body)
{
gboolean no_error_yet;
gchar **package_ids;
guint len;
guint i;
struct pkgdb *db;
+ struct query *q;
package_ids = pk_backend_get_strv(backend, "package_ids");
len = g_strv_length(package_ids);
db = NULL;
+ q = NULL;
no_error_yet = open_remote_db(&db, backend);
pk_backend_set_percentage(backend, 0);
for (i = 0; i < len && no_error_yet; i++) {
- no_error_yet = iterate_f(package_ids[i], backend, db);
+ no_error_yet = query_init(package_ids[i],
+ backend,
+ db,
+ load_flags,
+ &q);
+ if (no_error_yet == TRUE)
+ no_error_yet = body(q);
pk_backend_set_percentage(backend, ((i * 100) / len));
}
pkgdb_close(db);
@@ -200,15 +216,15 @@
* matching result to an emitter function.
*/
gboolean
-query_emit_match(struct query *state, int load_flags, emit_ptr emitter)
+query_emit_match(struct query *q, emit_ptr emitter)
{
gboolean success;
gchar *match_id;
struct pkg *match_pkg;
- success = match(state, &match_id, &match_pkg);
+ success = match(q, &match_id, &match_pkg);
if (success == TRUE && match_id != NULL && match_pkg != NULL)
- emitter(match_pkg, match_id, state->backend);
+ emitter(match_pkg, match_id, q);
pkg_free(match_pkg);
g_free(match_id);
@@ -226,28 +242,28 @@
*
* TODO: do something about the redundancy in both this and the emitter variant.
*/
-gboolean
-query_job_match(struct query *state, struct pkg_jobs *jobs)
-{
- gboolean success;
- gchar *match_id;
- struct pkg *match_pkg;
-
- state->load_flags = PKG_LOAD_BASIC;
- success = match(state, &match_id, &match_pkg);
- if (success == TRUE && match_id != NULL && match_pkg != NULL) {
- gchar *name[1];
-
- name[0] = NULL;
- pkg_get(match_pkg, PKG_NAME, &(name[0]));
-
- pkg_jobs_add(jobs, MATCH_EXACT, name, 1);
- }
- pkg_free(match_pkg);
- g_free(match_id);
-
- return success;
-}
+/*
+ * // 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; }
+ */
/*
* Performs a package database query against a (potentially partial)
@@ -256,7 +272,7 @@
* The exact type of query depends on the repository given.
*/
static gboolean
-match(struct query *state, gchar **match_id_p, struct pkg **match_pkg_p)
+match(struct query *q, gchar **match_id_p, struct pkg **match_pkg_p)
{
gboolean success;
gboolean try_local;
@@ -265,42 +281,42 @@
struct pkgdb_it *it;
success = FALSE;
- db = state->db;
+ db = q->db;
/*
* If we're not given a specific repository in the PackageID, we want
* to try searching locally first and then remotely; otherwise which
* database we query depends on the repository we have been given.
*/
- if (state->any_repo == TRUE)
+ if (q->any_repo == TRUE)
try_local = try_remote = TRUE;
else {
- try_local = (state->local_repo == TRUE);
- try_remote = (state->local_repo == FALSE);
+ try_local = (q->local_repo == TRUE);
+ try_remote = (q->local_repo == FALSE);
}
/* Try a local search first, if applicable. */
if (try_local == TRUE)
- it = pkgdb_query(db, state->name, MATCH_EXACT);
+ it = pkgdb_query(db, q->name, MATCH_EXACT);
else
it = NULL;
if (it != NULL)
- success = match_id_in_it(it, state, match_id_p, match_pkg_p);
+ success = match_id_in_it(it, q, match_id_p, match_pkg_p);
/* Next, try a remote search, again only if applicable. */
if (success == FALSE && (try_remote == TRUE))
- it = pkgdb_rquery(db, state->name, MATCH_EXACT, state->data);
+ it = pkgdb_rquery(db, q->name, MATCH_EXACT, q->data);
else
it = NULL;
if (it != NULL)
- success = match_id_in_it(it, state, match_id_p, match_pkg_p);
+ success = match_id_in_it(it, q, match_id_p, match_pkg_p);
/*
* 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(state->backend,
+ pk_backend_error_code(q->backend,
PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
"package not found");
@@ -309,43 +325,47 @@
/* Creates a struct query for the given backend and target ID. */
gboolean
-query_init(const gchar *id, PkBackend *backend, int load_flags,
- struct query **state_p)
+query_init(const gchar *id,
+ PkBackend *backend,
+ struct pkgdb *db,
+ int load_flags,
+ struct query **q_p)
{
gboolean success;
gboolean loading_files;
- struct query *state;
+ struct query *q;
- state = *state_p;
- if (state == NULL)
- state = g_new0(struct query, 1);
+ q = *q_p;
+ if (q == NULL)
+ q = g_new0(struct query, 1);
+ else
+ query_free_contents(q);
- state->backend = backend;
- state->load_flags = load_flags;
+ q->backend = backend;
+ q->load_flags = load_flags;
+ q->db = db;
+
+ success = split_id(id,
+ &(q->strv),
+ &(q->name),
+ &(q->version),
+ &(q->arch),
+ &(q->data));
+ if (success == FALSE)
+ pk_backend_error_code(backend,
+ PK_ERROR_ENUM_PACKAGE_ID_INVALID,
+ "invalid package id");
- success = open_remote_db(&(state->db), backend);
- if (success == TRUE) {
- success = split_id(id,
- &(state->strv),
- &(state->name),
- &(state->version),
- &(state->arch),
- &(state->data));
- if (success == FALSE)
- pk_backend_error_code(backend,
- PK_ERROR_ENUM_PACKAGE_ID_INVALID,
- "invalid package id");
- }
/*
* Check the repository to make sure it's sane, and populate the repo
* type flags in the state for later consumption.
*/
if (success == TRUE) {
- if (state->data != NULL)
- state->any_repo = TRUE;
- else if (strcmp(state->data, "installed") == 0)
- state->local_repo = TRUE;
- else if (pkg_repo_find_ident(state->data) != NULL) {
+ if (q->data != NULL)
+ q->any_repo = TRUE;
+ else if (strcmp(q->data, "installed") == 0)
+ q->local_repo = TRUE;
+ else if (pkg_repo_find_ident(q->data) != NULL) {
pk_backend_error_code(backend,
PK_ERROR_ENUM_PACKAGE_ID_INVALID,
"no such repository");
@@ -357,29 +377,34 @@
* non-installed packages.
*/
loading_files = (load_flags & PKG_LOAD_FILES) ? TRUE : FALSE;
- if (success == TRUE && state->local_repo == FALSE && loading_files) {
+ if (success == TRUE && 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;
}
if (success == FALSE) {
- query_free(state);
- state = NULL;
+ query_free(q);
+ q = NULL;
}
- *state_p = state;
+ *q_p = q;
return success;
}
void
-query_free(struct query *state)
+query_free(struct query *q)
{
- if (state != NULL) {
- if (state->db != NULL)
- pkgdb_close(state->db);
- if (state->strv != NULL)
- g_strfreev(state->strv);
- /* This should free the other split ID pointer targets. */
- g_free(state);
+ if (q != NULL) {
+ query_free_contents(q);
+ g_free(q);
}
}
+
+static void
+query_free_contents(struct query *q)
+{
+ /* The database is owned by the creator and is not freed. */
+ /* This should free the other split ID pointer targets. */
+ if (q->strv != NULL)
+ g_strfreev(q->strv);
+}
Modified: soc2013/mattbw/backend/query.h
==============================================================================
--- soc2013/mattbw/backend/query.h Tue Jul 2 04:45:51 2013 (r253828)
+++ soc2013/mattbw/backend/query.h Tue Jul 2 06:17:32 2013 (r253829)
@@ -25,19 +25,16 @@
#include "pk-backend.h"
#include "pkg.h"
-typedef void (*emit_ptr) (struct pkg *pkg,
- const gchar *id,
- PkBackend *backend);
-typedef gboolean (*ids_func_ptr) (const gchar *id, PkBackend *backend, struct pkgdb *db);
-
struct query;
-gboolean query_emit_match(struct query *state, int load_flags, emit_ptr emitter);
-gboolean query_job_match(struct query *state, struct pkg_jobs *jobs);
-gboolean iterate_ids(PkBackend *backend, ids_func_ptr iterate_f);
+typedef void (*emit_ptr) (struct pkg *pkg, const gchar *id, struct query *q);
+typedef gboolean (*query_body_ptr) (struct query *q);
+
-/* Creates a struct query for the given backend and target ID. */
-gboolean query_init(const gchar *id, PkBackend *backend, int load_flags, struct query **state_p);
-void query_free(struct query *state);
+PkBackend *query_backend(struct query *q);
+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_free(struct query *q);
#endif /* !_PKGNG_BACKEND_QUERY_H_ */
More information about the svn-soc-all
mailing list