From owner-svn-soc-all@FreeBSD.ORG Thu Jun 20 22:55:43 2013 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 7457A5F1 for ; Thu, 20 Jun 2013 22:55:43 +0000 (UTC) (envelope-from mattbw@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::16:124]) by mx1.freebsd.org (Postfix) with ESMTP id 63D561B5D for ; Thu, 20 Jun 2013 22:55:43 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.7/8.14.7) with ESMTP id r5KMtgnq090893 for ; Thu, 20 Jun 2013 22:55:42 GMT (envelope-from mattbw@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.7/8.14.6/Submit) id r5KMtg57090890 for svn-soc-all@FreeBSD.org; Thu, 20 Jun 2013 22:55:42 GMT (envelope-from mattbw@FreeBSD.org) Date: Thu, 20 Jun 2013 22:55:42 GMT Message-Id: <201306202255.r5KMtg57090890@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mattbw@FreeBSD.org using -f From: mattbw@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r253303 - soc2013/mattbw/dummy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Jun 2013 22:55:43 -0000 Author: mattbw Date: Thu Jun 20 22:55:42 2013 New Revision: 253303 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253303 Log: use query/rquery instead of search; first signs of working Modified: soc2013/mattbw/dummy/Makefile soc2013/mattbw/dummy/get-details.c Modified: soc2013/mattbw/dummy/Makefile ============================================================================== --- soc2013/mattbw/dummy/Makefile Thu Jun 20 21:50:04 2013 (r253302) +++ soc2013/mattbw/dummy/Makefile Thu Jun 20 22:55:42 2013 (r253303) @@ -1,8 +1,5 @@ # $FreeBSD$ -# Temporary -CC= clang - LIB= pk_backend_pkgng SHLIB_MAJOR= 1 SRCS= pk-backend-pkgng.c get-details.c Modified: soc2013/mattbw/dummy/get-details.c ============================================================================== --- soc2013/mattbw/dummy/get-details.c Thu Jun 20 21:50:04 2013 (r253302) +++ soc2013/mattbw/dummy/get-details.c Thu Jun 20 22:55:42 2013 (r253303) @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include + #include #include "pk-backend.h" #include "pkg.h" @@ -30,6 +32,7 @@ struct pkg *match; found = FALSE; + match = NULL; do { err = pkgdb_it_next(matches, &match, PKG_LOAD_BASIC); if (err == EPKG_OK) { @@ -50,12 +53,17 @@ PKG_REPONAME, &reponame, PKG_WWW, &www); - if (type == PKG_FILE) + switch(pkg_type(match)) { + case PKG_FILE: data = "local"; - else if (type == PKG_INSTALLED) + break; + case PKG_INSTALLED: data = "installed"; - else + break; + default: data = reponame; + break; + } if ((id_name == NULL || g_strcmp0(name, id_name) == 0) && (id_version == NULL || g_strcmp0(version, id_version) == 0) && @@ -81,13 +89,57 @@ } } while (err == EPKG_OK && found == FALSE); - if (found == FALSE) - pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "name matches found but no packageid matches"); - return found; } gboolean +get_local_details(gchar *name, + gchar *version, + gchar *arch, + PkBackend *backend, + struct pkgdb *db) +{ + struct pkgdb_it *it; + gboolean success; + + success = FALSE; + it = pkgdb_query(db, name, MATCH_EXACT); + if (it) + success = get_details_check_matches( + it, + name, + version, + arch, + "installed", + backend); + return success; +} + +gboolean +get_remote_details(gchar *name, + gchar *version, + gchar *arch, + gchar *reponame, + PkBackend *backend, + struct pkgdb *db) +{ + struct pkgdb_it *it; + gboolean success; + + success = FALSE; + it = pkgdb_rquery(db, name, MATCH_EXACT, reponame); + if (it) + success = get_details_check_matches( + it, + name, + version, + arch, + reponame, + backend); + return success; +} + +gboolean get_details_for(gchar *package_id, PkBackend *backend, struct pkgdb *db) { gchar **parts; @@ -97,24 +149,58 @@ parts = pk_package_id_split(package_id); if (parts == NULL) - pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id"); + pk_backend_error_code(backend, + PK_ERROR_ENUM_PACKAGE_ID_INVALID, + "invalid package id"); else { struct pkgdb_it *packages; + /* Parts of the package ID */ + gchar *name; + gchar *version; + gchar *arch; + gchar *data; + + name = parts[PK_PACKAGE_ID_NAME]; + if (name != NULL && strlen(name) == 0) + name = NULL; + + version = parts[PK_PACKAGE_ID_VERSION]; + if (version != NULL && strlen(version) == 0) + version = NULL; + + arch = parts[PK_PACKAGE_ID_ARCH]; + if (arch != NULL && strlen(arch) == 0) + arch = NULL; + + data = parts[PK_PACKAGE_ID_DATA]; + if (data != NULL && strlen(data) == 0) + data = NULL; - packages = pkgdb_search(db, parts[PK_PACKAGE_ID_NAME], MATCH_EXACT, FIELD_NAME, NULL); - if (packages) { - success = get_details_check_matches(packages, - parts[PK_PACKAGE_ID_NAME], - parts[PK_PACKAGE_ID_VERSION], - parts[PK_PACKAGE_ID_ARCH], - parts[PK_PACKAGE_ID_DATA], - backend); - - pkgdb_it_free(packages); - } else - pk_backend_error_code(backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "no name matches"); + /* If the PackageID is for an installed package, do a local query. + * If it is for a specific repo, do a remote query on it. + * And if the PackageID has no repository information at all, + * check both local and repo-generic remote. + * (TODO: local packages?) + */ + if (g_strcmp0(data, "installed") == 0) + success = get_local_details(name, version, arch, backend, db); + else if (data != NULL) /* FIXME: treats 'local' as repo */ + success = get_remote_details(name, version, arch, data, backend, db); + else { + /* TODO: ensure this is correct behaviour */ + success = get_local_details(name, version, arch, backend, db); + if (success == FALSE) + success = get_remote_details(name, version, arch, data, backend, db); + } + /* 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(backend, + PK_ERROR_ENUM_PACKAGE_NOT_FOUND, + "package not found"); g_strfreev(parts); }