Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
pkg repo only create the database in 2001 (aka 1.0) format
Baptiste Daroussin committed 12 years ago
commit 234bf5f3f93ec2accf0ceeac78a1e67f1df5f93a
parent 144ac38
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)