socsvn commit: r253477 - in soc2013/mattbw/backend: . actions
mattbw at FreeBSD.org
mattbw at FreeBSD.org
Tue Jun 25 05:47:16 UTC 2013
Author: mattbw
Date: Tue Jun 25 05:47:16 2013
New Revision: 253477
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253477
Log:
make generic package iterator handler ready for other get-xyz jobs.
Added:
soc2013/mattbw/backend/iterate.c
soc2013/mattbw/backend/iterate.h
Modified:
soc2013/mattbw/backend/Makefile
soc2013/mattbw/backend/actions/get-details.c
Modified: soc2013/mattbw/backend/Makefile
==============================================================================
--- soc2013/mattbw/backend/Makefile Tue Jun 25 04:44:42 2013 (r253476)
+++ soc2013/mattbw/backend/Makefile Tue Jun 25 05:47:16 2013 (r253477)
@@ -2,7 +2,7 @@
LIB= pk_backend_pkgng
SHLIB_MAJOR= 1
-SRCS= pk-backend-pkgng.c groups.c db.c licenses.c
+SRCS= pk-backend-pkgng.c groups.c db.c licenses.c iterate.c
SRCS+= actions/get-details.c
LIBDIR= /usr/local/lib/packagekit-backend
Modified: soc2013/mattbw/backend/actions/get-details.c
==============================================================================
--- soc2013/mattbw/backend/actions/get-details.c Tue Jun 25 04:44:42 2013 (r253476)
+++ soc2013/mattbw/backend/actions/get-details.c Tue Jun 25 05:47:16 2013 (r253477)
@@ -19,13 +19,13 @@
*/
#include <string.h>
-
#include <glib.h>
#include "../pk-backend.h"
#include "pkg.h"
#include "../db.h" /* open_remote_db */
#include "../groups.h" /* group_from_origin */
+#include "../iterate.h" /* Package iteration */
#include "../licenses.h" /* license_from_pkg */
#include "get-details.h" /* get_details_thread prototype */
@@ -34,7 +34,7 @@
/* TODO: move out of get-details? */
const char *null_if_empty(const char *in);
-gboolean string_match(const char *left, const char *right);
+
static gboolean
get_details_query(const gchar *name,
const gchar *version,
@@ -56,107 +56,32 @@
/*
- * Checks two strings with strcmp and emits TRUE if they match. If either
- * string is NULL, emit TRUE as well (this is so that missing PackageID
- * elements trigger matches).
+ * Emits the given package's details. To be used as an iterating function.
*/
-gboolean
-string_match(const char *left, const char *right)
-{
- int result;
-
- if (left == NULL || right == NULL)
- result = TRUE;
- else
- result = (strcmp(left, right) == 0 ? TRUE : FALSE);
-
- return result;
-}
-
-/*
- * Go through a database iterator of possible package matches and emit any
- * that match the split PackageID.
- */
-gboolean
-get_details_check_matches(struct pkgdb_it *matches,
- const gchar *id_name,
- const gchar *id_version,
- const gchar *id_arch,
- const gchar *id_data,
- PkBackend *backend)
-{
- gboolean found;
- int err;
- struct pkg *match;
-
- found = FALSE;
- match = NULL;
- do {
- err = pkgdb_it_next(matches, &match, LOAD_FLAGS);
- if (err == EPKG_OK) {
- const char *arch;
- const char *data;
- const char *description;
- const char *name;
- const char *origin;
- const char *reponame;
- const char *version;
- const char *www;
- int64_t flatsize;
-
- pkg_get(match,
- PKG_ARCH, &arch,
- PKG_DESC, &description,
- PKG_FLATSIZE, &flatsize,
- PKG_NAME, &name,
- PKG_ORIGIN, &origin,
- PKG_REPONAME, &reponame,
- PKG_VERSION, &version,
- PKG_WWW, &www);
-
- switch (pkg_type(match)) {
- case PKG_FILE:
- data = "local";
- break;
- case PKG_INSTALLED:
- data = "installed";
- break;
- default:
- data = reponame;
- break;
- }
-
- /*
- * Emit 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.
- */
- if (string_match(name, id_name) &&
- string_match(version, id_version) &&
- string_match(arch, id_arch) &&
- string_match(data, id_data)) {
- gchar *new_id;
-
- found = TRUE;
- new_id = pk_package_id_build(name, version, arch, data);
-
- /* TODO: implement category, size and licence */
- pk_backend_details(backend,
- new_id,
- license_name_from_pkg(match),
- group_from_origin(origin),
- description,
- www,
- flatsize);
-
- g_free(new_id);
- }
- }
- } while (err == EPKG_OK && found == FALSE);
- pkg_free(match);
-
- return found;
+static void
+emit_get_details(struct pkg *pkg,
+ const gchar *id,
+ PkBackend *backend)
+{
+ const char *description;
+ const char *origin;
+ const char *www;
+ int64_t flatsize;
+
+ /* Information not already part of the PackageID */
+ pkg_get(pkg,
+ PKG_DESC, &description,
+ PKG_FLATSIZE, &flatsize,
+ PKG_ORIGIN, &origin,
+ PKG_WWW, &www);
+
+ pk_backend_details(backend,
+ id,
+ license_name_from_pkg(pkg),
+ group_from_origin(origin),
+ description,
+ www,
+ flatsize);
}
/*
@@ -186,12 +111,14 @@
else
it = pkgdb_rquery(db, name, MATCH_EXACT, reponame);
if (it)
- success = get_details_check_matches(it,
- name,
- version,
- arch,
- reponame,
- backend);
+ success = iterate_id_matches(it,
+ backend,
+ name,
+ version,
+ arch,
+ reponame,
+ LOAD_FLAGS,
+ emit_get_details);
return success;
}
Added: soc2013/mattbw/backend/iterate.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2013/mattbw/backend/iterate.c Tue Jun 25 05:47:16 2013 (r253477)
@@ -0,0 +1,132 @@
+/*-
+ * 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 <string.h>
+#include <glib.h>
+#include "pk-backend.h"
+#include "pkg.h"
+
+#include "iterate.h" /* Prototypes */
+
+static gboolean
+try_id_match(struct pkg *pkg, const gchar *name, const gchar *version, const
+ gchar *arch, const gchar *data, gchar **match_id);
+
+static gboolean string_match(const char *left, const char *right);
+
+gboolean
+iterate_id_matches(struct pkgdb_it *iterator,
+ PkBackend *backend,
+ const gchar *name,
+ const gchar *version,
+ const gchar *arch,
+ const gchar *data,
+ int fetch_flags,
+ iterate_f_pointer iterate_f)
+{
+ /* TODO: Filters */
+ gboolean found;
+ int err;
+ struct pkg *pkg;
+ gchar *match_id;
+
+ found = FALSE;
+ pkg = NULL;
+ match_id = NULL;
+ do {
+ err = pkgdb_it_next(iterator, &pkg, fetch_flags);
+
+ if (err == EPKG_OK && try_id_match(pkg,
+ name,
+ version,
+ arch,
+ data,
+ &match_id) == TRUE) {
+ found = TRUE;
+ iterate_f(pkg, match_id, backend);
+ }
+ if (match_id != NULL)
+ g_free(match_id);
+ } while (err == EPKG_OK && found == FALSE);
+ pkg_free(pkg);
+
+ return found;
+}
+
+static gboolean
+try_id_match(struct pkg *pkg, const gchar *name, const gchar *version, const
+ gchar *arch, const gchar *data, gchar **match_id)
+{
+ const char *pkg_arch;
+ const char *pkg_data;
+ const char *pkg_name;
+ const char *pkg_reponame;
+ const char *pkg_version;
+
+ pkg_get(pkg,
+ PKG_ARCH, &pkg_arch,
+ PKG_NAME, &pkg_name,
+ PKG_REPONAME, &pkg_reponame,
+ PKG_VERSION, &pkg_version);
+
+ switch (pkg_type(pkg)) {
+ case PKG_FILE:
+ pkg_data = "local";
+ break;
+ case PKG_INSTALLED:
+ pkg_data = "installed";
+ break;
+ default:
+ pkg_data = pkg_reponame;
+ break;
+ }
+
+ if (*match_id != NULL)
+ g_free(*match_id);
+ *match_id = pk_package_id_build(pkg_name, pkg_version, pkg_arch, pkg_data);
+
+ /*
+ * 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(name, pkg_name) &&
+ string_match(version, pkg_version) &&
+ string_match(arch, pkg_arch) &&
+ string_match(data, pkg_data)) ? TRUE : FALSE;
+}
+
+/*
+ * Checks two strings with strcmp and emits TRUE if they match. If either
+ * string is NULL, emit TRUE as well (this is so that missing PackageID
+ * elements trigger matches).
+ */
+static gboolean
+string_match(const char *left, const char *right)
+{
+ int result;
+
+ if (left == NULL || right == NULL)
+ result = TRUE;
+ else
+ result = (strcmp(left, right) == 0 ? TRUE : FALSE);
+
+ return result;
+}
Added: soc2013/mattbw/backend/iterate.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2013/mattbw/backend/iterate.h Tue Jun 25 05:47:16 2013 (r253477)
@@ -0,0 +1,42 @@
+/*-
+ * 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_ITERATE_H_
+#define _PKGNG_BACKEND_ITERATE_H_
+
+#include <glib.h>
+#include "pk-backend.h"
+#include "pkg.h"
+
+typedef void (*iterate_f_pointer) (struct pkg *pkg,
+ const char *id,
+ PkBackend *backend);
+
+gboolean
+iterate_id_matches(struct pkgdb_it *iterator,
+ PkBackend *backend,
+ const gchar *name,
+ const gchar *version,
+ const gchar *arch,
+ const gchar *data,
+ int fetch_flags,
+ iterate_f_pointer iterate_f);
+
+#endif /* !_PKGNG_BACKEND_ITERATE_H_ */
More information about the svn-soc-all
mailing list