Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Merge branch 'pkg-fts'
Vsevolod Stakhov committed 12 years ago
commit 078e3971e9529ad08858bad024ecb6226f01e643
parent 3642a68
6 files changed +78 -9
modified external/Makefile.am
@@ -199,6 +199,7 @@ sqlite_common_cflags= -DHAVE_SQLITE_CONFIG_H \
			-DUSE_PREAD \
			-DSQLITE_THREADSAFE=1 \
			-DSQLITE_TEMP_STORE=3 \
+
			-DSQLITE_ENABLE_FTS4 \
			-DSQLITE_SHELL_DBNAME_PROC=pkgshell_open \
			-Dmain=sqlite3_shell \
			-DNDEBUG
modified libpkg/pkg.h.in
@@ -167,6 +167,10 @@ typedef enum {
	 * The argument is a WHERE clause to use as condition
	 */
	MATCH_CONDITION,
+
	/**
+
	 * Match using FTS search
+
	 */
+
	MATCH_FTS
} match_t;

/**
modified libpkg/pkgdb.c
@@ -7,6 +7,7 @@
 * 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
@@ -72,7 +73,7 @@
*/

#define DB_SCHEMA_MAJOR	0
-
#define DB_SCHEMA_MINOR	22
+
#define DB_SCHEMA_MINOR	23

#define DBVERSION (DB_SCHEMA_MAJOR * 1000 + DB_SCHEMA_MINOR)

@@ -630,6 +631,10 @@ pkgdb_init(sqlite3 *sdb)
	    "UNIQUE(package_id, provide_id)"
	");"

+
	/* FTS search table */
+

+
	"CREATE VIRTUAL TABLE pkg_search USING fts4(id, name, origin);"
+

	/* Mark the end of the array */

	"CREATE INDEX deporigini on deps(origin);"
@@ -649,6 +654,8 @@ pkgdb_init(sqlite3 *sdb)
	"CREATE INDEX pkg_conflicts_pid ON pkg_conflicts(package_id);"
	"CREATE INDEX pkg_conflicts_cid ON pkg_conflicts(conflict_id);"
	"CREATE INDEX pkg_provides_id ON pkg_provides(package_id);"
+
	"CREATE INDEX packages_origin ON packages(origin COLLATE NOCASE);"
+
	"CREATE INDEX packages_name ON packages(name COLLATE NOCASE);"

	"CREATE VIEW pkg_shlibs AS SELECT * FROM pkg_shlibs_required;"
	"CREATE TRIGGER pkg_shlibs_update "
@@ -1510,6 +1517,12 @@ pkgdb_get_pattern_query(const char *pattern, match_t match)
	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);
@@ -1540,6 +1553,9 @@ pkgdb_get_match_how(match_t match)
		/* 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);
@@ -2311,6 +2327,7 @@ typedef enum _sql_prstmt_index {
	CONFLICT,
	PKG_PROVIDE,
	PROVIDE,
+
	FTS_APPEND,
	PRSTMT_LAST,
} sql_prstmt_index;

@@ -2503,10 +2520,16 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
		"VALUES (?1, (SELECT id FROM provides WHERE provide = ?2))",
		"IT",
	},
-
	{
+
	[PROVIDE] = {
		NULL,
		"INSERT OR IGNORE INTO provides(provide) VALUES(?1)",
		"T",
+
	},
+
	[FTS_APPEND] = {
+
		NULL,
+
		"INSERT OR ROLLBACK INTO pkg_search(id, name, origin) "
+
		"VALUES (?1, ?2, ?3);",
+
		"ITT"
	}
	/* PRSTMT_LAST */
};
@@ -2676,6 +2699,11 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete, int forced)

	package_id = sqlite3_last_insert_rowid(s);

+
	if (run_prstmt(FTS_APPEND, package_id, name, origin) != SQLITE_DONE) {
+
		ERROR_SQLITE(s);
+
		goto cleanup;
+
	}
+

	/*
	 * update dep informations on packages that depends on the insert
	 * package
modified libpkg/pkgdb_repo.c
@@ -59,7 +59,7 @@
/* The package repo schema minor revision.
   Minor schema changes don't prevent older pkgng
   versions accessing the repo. */
-
#define REPO_SCHEMA_MINOR 7
+
#define REPO_SCHEMA_MINOR 8

/* REPO_SCHEMA_VERSION=2007 */
#define REPO_SCHEMA_VERSION (REPO_SCHEMA_MAJOR * 1000 + REPO_SCHEMA_MINOR)
@@ -81,6 +81,7 @@ typedef enum _sql_prstmt_index {
	EXISTS,
	VERSION,
	DELETE,
+
	FTS_APPEND,
	PRSTMT_LAST,
} sql_prstmt_index;

@@ -177,8 +178,15 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
	},
	[DELETE] = {
		NULL,
-
		"DELETE FROM packages WHERE origin=?1",
-
		"T",
+
		"DELETE FROM packages WHERE origin=?1;"
+
		"DELETE FROM pkg_search WHERE origin=?1;",
+
		"TT",
+
	},
+
	[FTS_APPEND] = {
+
		NULL,
+
		"INSERT OR ROLLBACK INTO pkg_search(id, name, origin) "
+
		"VALUES (?1, ?2, ?3);",
+
		"ITT"
	}
	/* PRSTMT_LAST */
};
@@ -426,7 +434,7 @@ maybe_delete_conflicting(const char *origin, const char *version,
					"version %s in repo with package %s for "
					"origin %s", oversion, pkg_path, origin);

-
			if (run_prepared_statement(DELETE, origin) != SQLITE_DONE)
+
			if (run_prepared_statement(DELETE, origin, origin) != SQLITE_DONE)
				return (EPKG_FATAL); /* sqlite error */

			ret = EPKG_OK;	/* conflict cleared */
@@ -441,7 +449,7 @@ maybe_delete_conflicting(const char *origin, const char *version,
		}
	}
	else {
-
		if (run_prepared_statement(DELETE, origin) != SQLITE_DONE)
+
		if (run_prepared_statement(DELETE, origin, origin) != SQLITE_DONE)
			return (EPKG_FATAL); /* sqlite error */

		ret = EPKG_OK;
@@ -514,6 +522,12 @@ try_again:
	}
	package_id = sqlite3_last_insert_rowid(sqlite);

+
	if (run_prepared_statement (FTS_APPEND, package_id,
+
			name, origin) != SQLITE_DONE) {
+
		ERROR_SQLITE(sqlite);
+
		return (EPKG_FATAL);
+
	}
+

	dep = NULL;
	while (pkg_deps(pkg, &dep) == EPKG_OK) {
		if (run_prepared_statement(DEPS,
@@ -613,7 +627,7 @@ try_again:
int
pkgdb_repo_remove_package(const char *origin)
{
-
	if (run_prepared_statement(DELETE, origin) != SQLITE_DONE)
+
	if (run_prepared_statement(DELETE, origin, origin) != SQLITE_DONE)
		return (EPKG_FATAL); /* sqlite error */

	return (EPKG_OK);
modified libpkg/private/db_upgrades.h
@@ -2,7 +2,7 @@
 * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2013 Matthew Seaman <matthew@FreeBSD.org>
-
 * Copyright (c) 2013 Vsevolod Stakhov <vsevolod@FreeBSD.org>
+
 * Copyright (c) 2013-2014 Vsevolod Stakhov <vsevolod@FreeBSD.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
@@ -555,6 +555,12 @@ static struct db_upgrades {
	    "UNIQUE(package_id, provide_id)"
	");"
	},
+
	{23,
+
	"CREATE VIRTUAL TABLE pkg_search USING fts4(id, name, origin);"
+
	"INSERT INTO pkg_search SELECT id, name, origin FROM packages;"
+
	"CREATE INDEX packages_origin ON packages(origin COLLATE NOCASE);"
+
	"CREATE INDEX packages_name ON packages(name COLLATE NOCASE);"
+
	},


	/* Mark the end of the array */
modified libpkg/private/repodb.h
@@ -174,6 +174,11 @@ static const char initsql[] = ""
	    "  ON DELETE RESTRICT ON UPDATE RESTRICT,"
	    "UNIQUE(package_id, provide_id)"
	");"
+
	"CREATE INDEX packages_origin ON packages(origin COLLATE NOCASE);"
+
	"CREATE INDEX packages_name ON packages(name COLLATE NOCASE);"
+
	/* FTS search table */
+
	"CREATE VIRTUAL TABLE pkg_search USING fts4(id, name, origin);"
+

	"PRAGMA user_version=%d;"
	;

@@ -319,6 +324,13 @@ static const struct repo_changes repo_upgrades[] = {
	    "UNIQUE(package_id, provide_id)"
	");"
	},
+
	{2007,
+
	 2008,
+
	 "CREATE VIRTUAL TABLE %Q.pkg_search USING fts4(id, name, origin);"
+
	 "INSERT INTO %Q.pkg_search SELECT id, name, origin FROM %Q.packages;"
+
	 "CREATE INDEX %Q.packages_origin ON %Q.packages(origin COLLATE NOCASE);"
+
	 "CREATE INDEX %Q.packages_name ON %Q.packages(name COLLATE NOCASE);"
+
	},
	/* Mark the end of the array */
	{ -1, -1, NULL, NULL, }

@@ -327,6 +339,10 @@ static const struct repo_changes repo_upgrades[] = {
/* How to downgrade a newer repo to match what the current system
   expects */
static const struct repo_changes repo_downgrades[] = {
+
	{2008,
+
	 2007,
+
	 "DROP TABLE %Q.pkg_search;"
+
	},
	{2007,
	 2006,
	 "Revert conflicts and provides creation",