Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Split query functions to a separate file.
Vsevolod Stakhov committed 11 years ago
commit 07a7468b987ba350ffc3f8dce0aa77cd0d158871
parent cb100b6
5 files changed +63 -288
modified libpkg/Makefile.am
@@ -42,6 +42,7 @@ libpkg_la_SOURCES= pkg.c \
			pkg_version.c \
			pkgdb.c \
			pkgdb_iterator.c \
+
			pkgdb_query.c \
			pkgdb_repo.c \
			rcscripts.c \
			rsa.c \
modified libpkg/pkgdb.c
@@ -82,8 +82,6 @@ static void pkgdb_split_uid(sqlite3_context *, int, sqlite3_value **);
static void pkgdb_split_version(sqlite3_context *, int, sqlite3_value **);
static void pkgdb_regex_delete(void *);
static int pkgdb_upgrade(struct pkgdb *);
-
static void populate_pkg(sqlite3_stmt *stmt, struct pkg *pkg);
-
static void pkgdb_detach_remotes(sqlite3 *);
static int sqlcmd_init(sqlite3 *db, __unused const char **err,
    __unused const void *noused);
static int prstmt_initialize(struct pkgdb *db);
@@ -1175,273 +1173,6 @@ pkgdb_case_sensitive(void)
	return (_case_sensitive_flag);
}

-
const char *
-
pkgdb_get_pattern_query(const char *pattern, match_t match)
-
{
-
	char		*checkorigin = NULL;
-
	char		*checkuid = NULL;
-
	const char	*comp = NULL;
-

-
	if (pattern != NULL) {
-
		checkuid = strchr(pattern, '~');
-
		if (checkuid == NULL)
-
			checkorigin = strchr(pattern, '/');
-
	}
-

-
	switch (match) {
-
	case MATCH_ALL:
-
		comp = "";
-
		break;
-
	case MATCH_EXACT:
-
		if (pkgdb_case_sensitive()) {
-
			if (checkuid == NULL) {
-
				if (checkorigin == NULL)
-
					comp = " WHERE name = ?1 "
-
					    "OR (name = SPLIT_VERSION('name', ?1) AND "
-
					    " version = SPLIT_VERSION('version', ?1))";
-
				else
-
					comp = " WHERE origin = ?1";
-
			} else {
-
				comp = " WHERE name = SPLIT_UID('name', ?1) AND "
-
						"origin = SPLIT_UID('origin', ?1)";
-
			}
-
		} else {
-
			if (checkuid == NULL) {
-
				if (checkorigin == NULL)
-
					comp = " WHERE name = ?1 COLLATE NOCASE "
-
							"OR (name = SPLIT_VERSION('name', ?1) COLLATE NOCASE AND "
-
							" version = SPLIT_VERSION('version', ?1))";
-
				else
-
					comp = " WHERE origin = ?1 COLLATE NOCASE";
-
			} else {
-
				comp = " WHERE name = SPLIT_UID('name', ?1) COLLATE NOCASE AND "
-
						"origin = SPLIT_UID('origin', ?1) COLLATE NOCASE";
-
			}
-
		}
-
		break;
-
	case MATCH_GLOB:
-
		if (checkuid == NULL) {
-
			if (checkorigin == NULL)
-
				comp = " WHERE name GLOB ?1 "
-
					"OR (name GLOB SPLIT_VERSION('name', ?1) AND "
-
					" version GLOB SPLIT_VERSION('version', ?1))";
-
			else
-
				comp = " WHERE origin GLOB ?1";
-
		} else {
-
			comp = " WHERE name = SPLIT_UID('name', ?1) AND "
-
					"origin = SPLIT_UID('origin', ?1)";
-
		}
-
		break;
-
	case MATCH_REGEX:
-
		if (checkuid == NULL) {
-
			if (checkorigin == NULL)
-
				comp = " WHERE name REGEXP ?1 "
-
				    "OR name || '-' || version REGEXP ?1";
-
			else
-
				comp = " WHERE origin REGEXP ?1";
-
		} else {
-
			comp = " WHERE name = SPLIT_UID('name', ?1) AND "
-
					"origin = SPLIT_UID('origin', ?1)";
-
		}
-
		break;
-
	case MATCH_CONDITION:
-
		comp = pattern;
-
		break;
-
	case MATCH_FTS:
-
		if (checkorigin == NULL)
-
			comp = " WHERE id IN (SELECT id FROM pkg_search WHERE name MATCH ?1)";
-
		else
-
			comp = " WHERE id IN (SELECT id FROM pkg_search WHERE origin MATCH ?1)";
-
		break;
-
	}
-

-
	return (comp);
-
}
-

-
static const char *
-
pkgdb_get_match_how(match_t match)
-
{
-
	const char	*how = NULL;
-

-
	switch (match) {
-
	case MATCH_ALL:
-
		how = NULL;
-
		break;
-
	case MATCH_EXACT:
-
		if (pkgdb_case_sensitive())
-
			how = "%s = ?1";
-
		else
-
			how = "%s = ?1 COLLATE NOCASE";			
-
		break;
-
	case MATCH_GLOB:
-
		how = "%s GLOB ?1";
-
		break;
-
	case MATCH_REGEX:
-
		how = "%s REGEXP ?1";
-
		break;
-
	case MATCH_CONDITION:
-
		/* Should not be called by pkgdb_get_match_how(). */
-
		assert(0);
-
		break;
-
	case MATCH_FTS:
-
		how = "id IN (SELECT id FROM pkg_search WHERE %s MATCH ?1)";
-
		break;
-
	}
-

-
	return (how);
-
}
-

-
struct pkgdb_it *
-
pkgdb_query(struct pkgdb *db, const char *pattern, match_t match)
-
{
-
	char		 sql[BUFSIZ];
-
	sqlite3_stmt	*stmt;
-
	const char	*comp = NULL;
-

-
	assert(db != NULL);
-
	assert(match == MATCH_ALL || (pattern != NULL && pattern[0] != '\0'));
-

-
	comp = pkgdb_get_pattern_query(pattern, match);
-

-
	sqlite3_snprintf(sizeof(sql), sql,
-
			"SELECT id, origin, name, name || '~' || origin as uniqueid, "
-
				"version, comment, desc, "
-
				"message, arch, maintainer, www, "
-
				"prefix, flatsize, licenselogic, automatic, "
-
				"locked, time, manifestdigest "
-
			"FROM packages AS p%s "
-
			"ORDER BY p.name;", comp);
-

-
	pkg_debug(4, "Pkgdb: running '%s'", sql);
-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql);
-
		return (NULL);
-
	}
-

-
	if (match != MATCH_ALL && match != MATCH_CONDITION)
-
		sqlite3_bind_text(stmt, 1, pattern, -1, SQLITE_TRANSIENT);
-

-
	return (pkgdb_it_new_sqlite(db, stmt, PKG_INSTALLED, PKGDB_IT_FLAG_ONCE));
-
}
-

-
struct pkgdb_it *
-
pkgdb_query_which(struct pkgdb *db, const char *path, bool glob)
-
{
-
	sqlite3_stmt	*stmt;
-
	char	sql[BUFSIZ];
-

-

-
	assert(db != NULL);
-
	sqlite3_snprintf(sizeof(sql), sql,
-
			"SELECT p.id, p.origin, p.name, p.name || '~' || p.origin as uniqueid, "
-
			"p.version, p.comment, p.desc, "
-
			"p.message, p.arch, p.maintainer, p.www, "
-
			"p.prefix, p.flatsize, p.time "
-
			"FROM packages AS p "
-
			"LEFT JOIN files AS f ON p.id = f.package_id "
-
			"WHERE f.path %s ?1 GROUP BY p.id;", glob ? "GLOB" : "=");
-

-
	pkg_debug(4, "Pkgdb: running '%s'", sql);
-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql);
-
		return (NULL);
-
	}
-

-
	sqlite3_bind_text(stmt, 1, path, -1, SQLITE_TRANSIENT);
-

-
	return (pkgdb_it_new_sqlite(db, stmt, PKG_INSTALLED, PKGDB_IT_FLAG_ONCE));
-
}
-

-
struct pkgdb_it *
-
pkgdb_query_shlib_required(struct pkgdb *db, const char *shlib)
-
{
-
	sqlite3_stmt	*stmt;
-
	const char	 sql[] = ""
-
		"SELECT p.id, p.origin, p.name, p.name || '~' || p.origin as uniqueid, "
-
			"p.version, p.comment, p.desc, "
-
			"p.message, p.arch, p.maintainer, p.www, "
-
			"p.prefix, p.flatsize, p.time "
-
			"FROM packages AS p, pkg_shlibs_required AS ps, shlibs AS s "
-
			"WHERE p.id = ps.package_id "
-
				"AND ps.shlib_id = s.id "
-
				"AND s.name = ?1;";
-

-
	assert(db != NULL);
-

-
	pkg_debug(4, "Pkgdb: running '%s'", sql);
-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql);
-
		return (NULL);
-
	}
-

-
	sqlite3_bind_text(stmt, 1, shlib, -1, SQLITE_TRANSIENT);
-

-
	return (pkgdb_it_new_sqlite(db, stmt, PKG_INSTALLED, PKGDB_IT_FLAG_ONCE));
-
}
-

-
struct pkgdb_it *
-
pkgdb_query_shlib_provided(struct pkgdb *db, const char *shlib)
-
{
-
	sqlite3_stmt	*stmt;
-
	const char	 sql[] = ""
-
		"SELECT p.id, p.origin, p.name, p.name || '~' || p.origin as uniqueid, "
-
			"p.version, p.comment, p.desc, "
-
			"p.message, p.arch, p.maintainer, p.www, "
-
			"p.prefix, p.flatsize, p.time "
-
			"FROM packages AS p, pkg_shlibs_provided AS ps, shlibs AS s "
-
			"WHERE p.id = ps.package_id "
-
				"AND ps.shlib_id = s.id "
-
				"AND s.name = ?1;";
-

-
	assert(db != NULL);
-

-
	pkg_debug(4, "Pkgdb: running '%s'", sql);
-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql);
-
		return (NULL);
-
	}
-

-
	sqlite3_bind_text(stmt, 1, shlib, -1, SQLITE_TRANSIENT);
-

-
	return (pkgdb_it_new_sqlite(db, stmt, PKG_INSTALLED, PKGDB_IT_FLAG_ONCE));
-
}
-

-
int
-
pkgdb_is_dir_used(struct pkgdb *db, const char *dir, int64_t *res)
-
{
-
	sqlite3_stmt	*stmt;
-
	int		 ret;
-
	const char	 sql[] = ""
-
		"SELECT count(package_id) FROM pkg_directories, directories "
-
		"WHERE directory_id = directories.id AND directories.path = ?1;";
-

-
	assert(db != NULL);
-

-
	pkg_debug(4, "Pkgdb: running '%s'", sql);
-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql);
-
		return (EPKG_FATAL);
-
	}
-

-
	sqlite3_bind_text(stmt, 1, dir, -1, SQLITE_TRANSIENT);
-

-
	ret = sqlite3_step(stmt);
-

-
	if (ret == SQLITE_ROW)
-
		*res = sqlite3_column_int64(stmt, 0);
-

-
	sqlite3_finalize(stmt);
-

-
	if (ret != SQLITE_ROW) {
-
		ERROR_SQLITE(db->sqlite, sql);
-
		return (EPKG_FATAL);
-
	}
-

-
	return (EPKG_OK);
-

-
}
-

-

typedef enum _sql_prstmt_index {
	MTREE = 0,
	PKG,
modified libpkg/pkgdb_iterator.c
@@ -1,24 +1,35 @@
-
/* Copyright (c) 2014, Vsevolod Stakhov
+
/*-
+
 * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
+
 * Copyright (c) 2011 Will Andrews <will@FreeBSD.org>
+
 * Copyright (c) 2011 Philippe Pepiot <phil@philpep.org>
+
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
+
 * Copyright (c) 2012-2013 Matthew Seaman <matthew@FreeBSD.org>
+
 * Copyright (c) 2012 Bryan Drewery <bryan@shatow.net>
+
 * Copyright (c) 2013 Gerald Pfeifer <gerald@pfeifer.com>
+
 * Copyright (c) 2013-2014 Vsevolod Stakhov <vsevolod@FreeBSD.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
-
 * modification, are permitted provided that the following conditions are met:
-
 *       * Redistributions of source code must retain the above copyright
-
 *         notice, this list of conditions and the following disclaimer.
-
 *       * Redistributions in binary form must reproduce the above copyright
-
 *         notice, this list of conditions and the following disclaimer in the
-
 *         documentation and/or other materials provided with the distribution.
+
 * modification, are permitted provided that the following conditions
+
 * are met:
+
 * 1. Redistributions of source code must retain the above copyright
+
 *    notice, this list of conditions and the following disclaimer
+
 *    in this position and unchanged.
+
 * 2. Redistributions in binary form must reproduce the above copyright
+
 *    notice, this list of conditions and the following disclaimer in the
+
 *    documentation and/or other materials provided with the distribution.
 *
-
 * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
-
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-
 * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
-
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <assert.h>
added libpkg/pkgdb_query.c
@@ -0,0 +1,34 @@
+
/*-
+
 * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
+
 * Copyright (c) 2011 Will Andrews <will@FreeBSD.org>
+
 * Copyright (c) 2011 Philippe Pepiot <phil@philpep.org>
+
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
+
 * Copyright (c) 2012-2013 Matthew Seaman <matthew@FreeBSD.org>
+
 * Copyright (c) 2012 Bryan Drewery <bryan@shatow.net>
+
 * Copyright (c) 2013 Gerald Pfeifer <gerald@pfeifer.com>
+
 * Copyright (c) 2013-2014 Vsevolod Stakhov <vsevolod@FreeBSD.org>
+
 * All rights reserved.
+
 *
+
 * Redistribution and use in source and binary forms, with or without
+
 * modification, are permitted provided that the following conditions
+
 * are met:
+
 * 1. Redistributions of source code must retain the above copyright
+
 *    notice, this list of conditions and the following disclaimer
+
 *    in this position and unchanged.
+
 * 2. Redistributions in binary form must reproduce the above copyright
+
 *    notice, this list of conditions and the following disclaimer in the
+
 *    documentation and/or other materials provided with the distribution.
+
 *
+
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 */
+

modified libpkg/private/pkg.h
@@ -541,8 +541,6 @@ const char* packing_format_to_string(pkg_formats format);
int pkg_delete_files(struct pkg *pkg, unsigned force);
int pkg_delete_dirs(struct pkgdb *db, struct pkg *pkg, bool force);

-
int pkgdb_is_dir_used(struct pkgdb *db, const char *dir, int64_t *res);
-

int pkg_conflicts_request_resolve(struct pkg_jobs *j);
int pkg_conflicts_append_pkg(struct pkg *p, struct pkg_jobs *j);
int pkg_conflicts_integrity_check(struct pkg_jobs *j);