Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
pkg repo only create the database in 2001 (aka 1.0) format
Baptiste Daroussin committed 12 years ago
commit 234bf5f3f93ec2accf0ceeac78a1e67f1df5f93a
parent 144ac38714b9923be715bc04a77f11fd9389fd45
5 files changed +121 -20
modified libpkg/pkg_repo.c
@@ -244,10 +244,10 @@ pkg_create_repo(char *path, bool force, bool filelist,

	pack_extract(repopack, repo_db_file, repodb);

-
	if ((retcode = pkgdb_repo_open(repodb, force, &sqlite)) != EPKG_OK)
+
	if ((retcode = pkgdb_repo_open(repodb, force, &sqlite, true)) != EPKG_OK)
		goto cleanup;

-
	if ((retcode = pkgdb_repo_init(sqlite)) != EPKG_OK)
+
	if ((retcode = pkgdb_repo_init(sqlite, true)) != EPKG_OK)
		goto cleanup;

	thd_data.root_path = path;
@@ -329,7 +329,7 @@ pkg_create_repo(char *path, bool force, bool filelist,
		LL_PREPEND(dlist, cur_dig);

		retcode = pkgdb_repo_add_package(r->pkg, r->path, sqlite,
-
				manifest_digest, false);
+
				manifest_digest, false, true);
		if (retcode == EPKG_END) {
			continue;
		}
modified libpkg/pkgdb_repo.c
@@ -66,6 +66,7 @@

typedef enum _sql_prstmt_index {
	PKG = 0,
+
	PKG2001,
	DEPS,
	CAT1,
	CAT2,
@@ -74,6 +75,7 @@ typedef enum _sql_prstmt_index {
	OPTS,
	SHLIB1,
	SHLIB_REQD,
+
	SHLIB2001,
	SHLIB_PROV,
	ANNOTATE1,
	ANNOTATE2,
@@ -93,6 +95,15 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
		"VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15)",
		"TTTTTTTTTIIITTT",
	},
+
	[PKG2001] = {
+
		NULL,
+
		"INSERT INTO packages ("
+
		"origin, name, version, comment, desc, arch, maintainer, www, "
+
		"prefix, pkgsize, flatsize, licenselogic, cksum, path"
+
		")"
+
		"VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14)",
+
		"TTTTTTTTTIIITT",
+
	},
	[DEPS] = {
		NULL,
		"INSERT INTO deps (origin, name, version, package_id) "
@@ -138,6 +149,12 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
		"VALUES (?1, (SELECT id FROM shlibs WHERE name = ?2))",
		"IT",
	},
+
	[SHLIB2001] = {
+
		NULL,
+
		"INSERT OR ROLLBACK INTO pkg_shlibs(package_id, shlib_id) "
+
		"VALUES (?1, (SELECT id FROM shlibs WHERE name = ?2))",
+
		"IT",
+
	},
	[SHLIB_PROV] = {
		NULL,
		"INSERT OR ROLLBACK INTO pkg_shlibs_provided(package_id, shlib_id) "
@@ -176,6 +193,7 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
	/* PRSTMT_LAST */
};

+

static void
file_exists(sqlite3_context *ctx, int argc, sqlite3_value **argv)
{
@@ -231,21 +249,25 @@ get_repo_user_version(sqlite3 *sqlite, const char *database, int *reposcver)
}

static int
-
initialize_prepared_statements(sqlite3 *sqlite)
+
initialize_prepared_statements(sqlite3 *sqlite, bool legacy)
{
	sql_prstmt_index i, last;
	int ret;

	last = PRSTMT_LAST;

-
	for (i = 0; i < last; i++)
-
	{
+
	for (i = 0; i < last; i++) {
+
		if (legacy && (i == PKG || i == SHLIB_REQD || (i > SHLIB2001 && i < EXISTS)))
+
			continue;
+
		if (!legacy && (i == PKG2001 || i == SHLIB2001))
+
			continue;
		ret = sqlite3_prepare_v2(sqlite, SQL(i), -1, &STMT(i), NULL);
		if (ret != SQLITE_OK) {
			ERROR_SQLITE(sqlite);
			return (EPKG_FATAL);
		}
	}
+

	return (EPKG_OK);
}

@@ -303,7 +325,7 @@ finalize_prepared_statements(void)
}

int
-
pkgdb_repo_open(const char *repodb, bool force, sqlite3 **sqlite)
+
pkgdb_repo_open(const char *repodb, bool force, sqlite3 **sqlite, bool legacy)
{
	bool incremental = false;
	bool db_not_open;
@@ -332,6 +354,8 @@ pkgdb_repo_open(const char *repodb, bool force, sqlite3 **sqlite)
		retcode = get_repo_user_version(*sqlite, "main", &reposcver);
		if (retcode != EPKG_OK)
			return (EPKG_FATAL);
+
		if (legacy)
+
			break;
		if (force || reposcver != REPO_SCHEMA_VERSION) {
			if (reposcver != REPO_SCHEMA_VERSION)
				pkg_emit_error("re-creating repo to upgrade schema version "
@@ -348,7 +372,7 @@ pkgdb_repo_open(const char *repodb, bool force, sqlite3 **sqlite)
	    file_exists, NULL, NULL);

	if (!incremental) {
-
		retcode = sql_exec(*sqlite, initsql, REPO_SCHEMA_VERSION);
+
		retcode = sql_exec(*sqlite, legacy ? initsql_legacy : initsql, REPO_SCHEMA_VERSION);
		if (retcode != EPKG_OK)
			return (retcode);
	}
@@ -357,7 +381,7 @@ pkgdb_repo_open(const char *repodb, bool force, sqlite3 **sqlite)
}

int
-
pkgdb_repo_init(sqlite3 *sqlite)
+
pkgdb_repo_init(sqlite3 *sqlite, bool legacy)
{
	int retcode = EPKG_OK;

@@ -373,7 +397,7 @@ pkgdb_repo_init(sqlite3 *sqlite)
	if (retcode != EPKG_OK)
		return (retcode);

-
	retcode = initialize_prepared_statements(sqlite);
+
	retcode = initialize_prepared_statements(sqlite, legacy);
	if (retcode != EPKG_OK)
		return (retcode);

@@ -457,7 +481,7 @@ pkgdb_repo_cksum_exists(sqlite3 *sqlite, const char *cksum)

int
pkgdb_repo_add_package(struct pkg *pkg, const char *pkg_path,
-
		sqlite3 *sqlite, const char *manifest_digest, bool forced)
+
		sqlite3 *sqlite, const char *manifest_digest, bool forced, bool legacy)
{
	const char *name, *version, *origin, *comment, *desc;
	const char *arch, *maintainer, *www, *prefix, *sum, *rpath;
@@ -480,8 +504,10 @@ pkgdb_repo_add_package(struct pkg *pkg, const char *pkg_path,
			    PKG_LICENSE_LOGIC, &licenselogic, PKG_CKSUM, &sum,
			    PKG_PKGSIZE, &pkgsize, PKG_REPOPATH, &rpath);

+
	/* setup the legacy version */
+

try_again:
-
	if ((ret = run_prepared_statement(PKG, origin, name, version,
+
	if ((ret = run_prepared_statement(legacy ? PKG2001 : PKG, origin, name, version,
			comment, desc, arch, maintainer, www, prefix,
			pkgsize, flatsize, (int64_t)licenselogic, sum,
			rpath, manifest_digest)) != SQLITE_DONE) {
@@ -563,7 +589,7 @@ try_again:

		ret = run_prepared_statement(SHLIB1, shlib_name);
		if (ret == SQLITE_DONE)
-
			ret = run_prepared_statement(SHLIB_REQD, package_id,
+
			ret = run_prepared_statement(legacy ? SHLIB2001 : SHLIB_REQD, package_id,
					shlib_name);
		if (ret != SQLITE_DONE) {
			ERROR_SQLITE(sqlite);
@@ -571,6 +597,9 @@ try_again:
		}
	}

+
	if (legacy)
+
		return (EPKG_OK);
+

	shlib = NULL;
	while (pkg_shlibs_provided(pkg, &shlib) == EPKG_OK) {
		const char *shlib_name = pkg_shlib_name(shlib);
@@ -591,7 +620,7 @@ try_again:
		const char *note_val = pkg_annotation_value(note);

		ret = run_prepared_statement(ANNOTATE1, note_tag);
-
		if (ret == SQLITE_DONE) 
+
		if (ret == SQLITE_DONE)
			ret = run_prepared_statement(ANNOTATE1, note_val);
		if (ret == SQLITE_DONE)
			ret = run_prepared_statement(ANNOTATE2, package_id,
modified libpkg/private/pkgdb.h
@@ -77,14 +77,14 @@ void pkgshell_open(const char **r);
 * @param sqlite destination db pointer
 * @return EPKG_OK if succeed
 */
-
int pkgdb_repo_open(const char *repodb, bool force, sqlite3 **sqlite);
+
int pkgdb_repo_open(const char *repodb, bool force, sqlite3 **sqlite, bool legacy);

/**
 * Init repository for pkgdb_repo* functions
 * @param sqlite sqlite object
 * @return EPKG_OK if succeed
 */
-
int pkgdb_repo_init(sqlite3 *sqlite);
+
int pkgdb_repo_init(sqlite3 *sqlite, bool legacy);

/**
 * Close repodb and commit/rollback transaction started
@@ -113,7 +113,7 @@ int pkgdb_repo_cksum_exists(sqlite3 *sqlite, const char *cksum);
 * inserted one, EPKG_FATAL if error occurred
 */
int pkgdb_repo_add_package(struct pkg *pkg, const char *pkg_path,
-
		sqlite3 *sqlite, const char *manifest_digest, bool forced);
+
		sqlite3 *sqlite, const char *manifest_digest, bool forced, bool legacy);

/**
 * Remove specified pkg from repo
modified libpkg/private/repodb.h
@@ -38,6 +38,78 @@ static const char repo_filesite_archive[] = "filesite";
static const char repo_digests_file[] = "digests";
static const char repo_digests_archive[] = "digests";

+
static const char initsql_legacy[] = ""
+
	"CREATE TABLE packages ("
+
		"id INTEGER PRIMARY KEY,"
+
		"origin TEXT UNIQUE,"
+
		"name TEXT NOT NULL,"
+
		"version TEXT NOT NULL,"
+
		"comment TEXT NOT NULL,"
+
		"desc TEXT NOT NULL,"
+
		"osversion TEXT,"
+
		"arch TEXT NOT NULL,"
+
		"maintainer TEXT NOT NULL,"
+
		"www TEXT,"
+
		"prefix TEXT NOT NULL,"
+
		"pkgsize INTEGER NOT NULL,"
+
		"flatsize INTEGER NOT NULL,"
+
		"licenselogic INTEGER NOT NULL,"
+
		"cksum TEXT NOT NULL,"
+
		/* relative path to the package in the repository */
+
		"path TEXT NOT NULL,"
+
		"pkg_format_version INTEGER"
+
	");"
+
	"CREATE TABLE deps ("
+
		"origin TEXT,"
+
		"name TEXT,"
+
		"version TEXT,"
+
		"package_id INTEGER REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"UNIQUE(package_id, origin)"
+
	");"
+
	"CREATE TABLE categories ("
+
		"id INTEGER PRIMARY KEY, "
+
		"name TEXT NOT NULL UNIQUE "
+
	");"
+
		"CREATE TABLE pkg_categories ("
+
		"package_id INTEGER REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"category_id INTEGER REFERENCES categories(id)"
+
		" ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"UNIQUE(package_id, category_id)"
+
	");"
+
	"CREATE TABLE licenses ("
+
		"id INTEGER PRIMARY KEY,"
+
		"name TEXT NOT NULL UNIQUE"
+
	");"
+
	"CREATE TABLE pkg_licenses ("
+
		"package_id INTEGER REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"license_id INTEGER REFERENCES licenses(id)"
+
		" ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"UNIQUE(package_id, license_id)"
+
	");"
+
	"CREATE TABLE options ("
+
		"package_id INTEGER REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"option TEXT,"
+
		"value TEXT,"
+
		"UNIQUE (package_id, option)"
+
	");"
+
	"CREATE TABLE shlibs ("
+
		"id INTEGER PRIMARY KEY,"
+
		"name TEXT NOT NULL UNIQUE "
+
	");"
+
	"CREATE TABLE pkg_shlibs ("
+
		"package_id INTEGER REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"shlib_id INTEGER REFERENCES shlibs(id)"
+
		" ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"UNIQUE(package_id, shlib_id)"
+
	");"
+
	"PRAGMA user_version=2001;"
+
	;
+

static const char initsql[] = ""
	"CREATE TABLE packages ("
	    "id INTEGER PRIMARY KEY,"
modified libpkg/update.c
@@ -398,7 +398,7 @@ pkg_add_from_manifest(FILE *f, const char *origin, long offset,
		goto cleanup;
	}

-
	rc = pkgdb_repo_add_package(pkg, NULL, sqlite, manifest_digest, true);
+
	rc = pkgdb_repo_add_package(pkg, NULL, sqlite, manifest_digest, true, false);

cleanup:
	pkg_free(pkg);
@@ -445,11 +445,11 @@ pkg_update_incremental(const char *name, struct pkg_repo *repo, time_t *mtime)
	const char *myarch;
	struct pkg_manifest_key *keys = NULL;

-
	if ((rc = pkgdb_repo_open(name, false, &sqlite)) != EPKG_OK) {
+
	if ((rc = pkgdb_repo_open(name, false, &sqlite, false)) != EPKG_OK) {
		return (EPKG_FATAL);
	}

-
	if ((rc = pkgdb_repo_init(sqlite)) != EPKG_OK)
+
	if ((rc = pkgdb_repo_init(sqlite, false)) != EPKG_OK)
		goto cleanup;

	if ((rc = pkg_register_repo(repo, sqlite)) != EPKG_OK)