Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Tidy up repodb.h, improve some error messages, debug.
Matthew Seaman committed 13 years ago
commit 5d8482fd10e0f0b86ff5fb932b394ec0ad441daf
parent 0eae8787c03b450660fa713101cf02d986e1b1e8
2 files changed +124 -103
modified libpkg/pkg_repo.c
@@ -1049,12 +1049,19 @@ substitute_into_sql(char *sqlbuf, size_t buflen, const char *fmt,
	char	*f;
	char	*f0;
	char	*tofree;
+
	char	*quoted;
	size_t	 len;
	int	 ret = EPKG_OK;

	tofree = f = strdup(fmt);
	if (tofree == NULL)
-
		return EPKG_FATAL; /* out of memory */
+
		return (EPKG_FATAL); /* out of memory */
+

+
	quoted = sqlite3_mprintf("%Q", replacement);
+
	if (quoted == NULL) {
+
		free(tofree);
+
		return (EPKG_FATAL); /* out of memory */
+
	}

	sqlbuf[0] = '\0';

@@ -1066,8 +1073,11 @@ substitute_into_sql(char *sqlbuf, size_t buflen, const char *fmt,
			break;
		}

+
		if (f == NULL)
+
			break;	/* done */
+

		if (f[0] == 'Q') {
-
			len = strlcat(sqlbuf, replacement, buflen);
+
			len = strlcat(sqlbuf, quoted, buflen);
			f++;	/* Jump the Q */
		} else {
			len = strlcat(sqlbuf, "%", buflen);
@@ -1081,6 +1091,7 @@ substitute_into_sql(char *sqlbuf, size_t buflen, const char *fmt,
	}
	
	free(tofree);
+
	sqlite3_free(quoted); 

	return (ret);
}
@@ -1089,7 +1100,7 @@ substitute_into_sql(char *sqlbuf, size_t buflen, const char *fmt,
static int
apply_repo_change(struct pkgdb *db, const char *database,
		  struct repo_changes *repo_changes, const char *updown,
-
		  int version)
+
		  int version, int *next_version)
{
	struct repo_changes	*change;
	bool			 found = false;
@@ -1104,7 +1115,7 @@ apply_repo_change(struct pkgdb *db, const char *database,
		}
	}
	if (!found) {
-
		pkg_emit_error("Failed to %s \"%s\" repo schema to "
+
		pkg_emit_error("Failed to %s \"%s\" repo schema "
			" version %d (target version %d) "
			"-- change not found", updown, database, version,
			REPO_SCHEMA_VERSION);
@@ -1129,18 +1140,21 @@ apply_repo_change(struct pkgdb *db, const char *database,
	}
	
	/* update repo user_version */
-
	if (ret == EPKG_OK)
-
		ret = set_repo_user_version(db->sqlite, database, version);
+
	if (ret == EPKG_OK) {
+
		*next_version = change->next_version;
+
		ret = set_repo_user_version(db->sqlite, database, *next_version);
+
	}

	/* commit or rollback */
	if (ret == EPKG_OK)
		ret = pkgdb_transaction_commit(db->sqlite, NULL);
	else
-
		ret = pkgdb_transaction_rollback(db->sqlite, NULL);
+
		pkgdb_transaction_rollback(db->sqlite, NULL);

	if (ret == EPKG_OK) {
-
		pkg_emit_notice("Repo %s schema %s to version %d: %s",
-
				database, version, change->message);
+
		pkg_emit_notice("Repo \"%s\" %s schema %d to %d: %s",
+
				database, updown, version,
+
				change->next_version, change->message);
	}

	return (ret);
@@ -1150,13 +1164,14 @@ static int
upgrade_repo_schema(struct pkgdb *db, const char *database, int current_version)
{
	int version;
+
	int next_version;
	int ret = EPKG_OK;

	for (version = current_version;
-
	     version <= REPO_SCHEMA_VERSION;
-
	     version++)  {
+
	     version < REPO_SCHEMA_VERSION;
+
	     version = next_version)  {
		ret = apply_repo_change(db, database, repo_upgrades,
-
					"upgrade", version);
+
					"upgrade", version, &next_version);
		if (ret != EPKG_OK)
			break;
	}
@@ -1167,13 +1182,14 @@ static int
downgrade_repo_schema(struct pkgdb *db, const char *database, int current_version)
{
	int version;
+
	int next_version;
	int ret = EPKG_OK;

-
	for (version = current_version - 1;
-
	     version >= REPO_SCHEMA_VERSION;
-
	     version--)  {
+
	for (version = current_version;
+
	     version > REPO_SCHEMA_VERSION;
+
	     version = next_version)  {
		ret = apply_repo_change(db, database, repo_downgrades,
-
					"downgrade", version);
+
					"downgrade", version, &next_version);
		if (ret != EPKG_OK)
			break;
	}
modified libpkg/private/repodb.h
@@ -3,7 +3,7 @@
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2013 Matthew Seaman <matthew@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:
@@ -13,7 +13,7 @@
 * 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.
@@ -51,78 +51,79 @@ static const char initsql[] = ""
	    "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)"
+
	    "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 "
+
	    "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)"
+
	    "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"
+
	    "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)"
+
	    "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)"
+
	    "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 "
+
	    "id INTEGER PRIMARY KEY,"
+
	    "name TEXT NOT NULL UNIQUE "
	");"
	"CREATE TABLE pkg_shlibs_required ("
-
			"package_id INTEGER NOT NULL REFERENCES packages(id)"
-
		        "  ON DELETE CASCADE ON UPDATE CASCADE,"
-
			"shlib_id INTEGER NOT NULL REFERENCES shlibs(id)"
-
			"  ON DELETE RESTRICT ON UPDATE RESTRICT,"
-
			"UNIQUE(package_id, shlib_id)"
+
	    "package_id INTEGER NOT NULL REFERENCES packages(id)"
+
	    "  ON DELETE CASCADE ON UPDATE CASCADE,"
+
	    "shlib_id INTEGER NOT NULL REFERENCES shlibs(id)"
+
	    "  ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
	    "UNIQUE(package_id, shlib_id)"
	");"
	"CREATE TABLE pkg_shlibs_provided ("
-
			"package_id INTEGER NOT NULL REFERENCES packages(id)"
-
		        "  ON DELETE CASCADE ON UPDATE CASCADE,"
-
			"shlib_id INTEGER NOT NULL REFERENCES shlibs(id)"
-
			"  ON DELETE RESTRICT ON UPDATE RESTRICT,"
-
			"UNIQUE(package_id, shlib_id)"
+
	    "package_id INTEGER NOT NULL REFERENCES packages(id)"
+
	    "  ON DELETE CASCADE ON UPDATE CASCADE,"
+
	    "shlib_id INTEGER NOT NULL REFERENCES shlibs(id)"
+
	    "  ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
	    "UNIQUE(package_id, shlib_id)"
	");"
	"CREATE TABLE abstract ("
-
                        "abstract_id INTEGER PRIMARY KEY,"
-
                        "abstract TEXT NOT NULL UNIQUE"
+
	    "abstract_id INTEGER PRIMARY KEY,"
+
	    "abstract TEXT NOT NULL UNIQUE"
	");"
	"CREATE TABLE pkg_abstract ("
-
                        "package_id INTERGER REFERENCES packages(id)"
-
                        " ON DELETE CASCADE ON UPDATE RESTRICT,"
-
                        "key_id INTEGER NOT NULL REFERENCES abstract(abstract_id)"
-
                        " ON DELETE CASCADE ON UPDATE RESTRICT,"
-
		        "value_id INTEGER NOT NULL REFERENCES abstract(abstract_id)"
-
		        " ON DELETE CASCADE ON UPDATE RESTRICT,"
-
		        "UNIQUE (package_id, key_id, value_id)"
+
	    "package_id INTERGER REFERENCES packages(id)"
+
	    " ON DELETE CASCADE ON UPDATE RESTRICT,"
+
	    "key_id INTEGER NOT NULL REFERENCES abstract(abstract_id)"
+
	    " ON DELETE CASCADE ON UPDATE RESTRICT,"
+
	    "value_id INTEGER NOT NULL REFERENCES abstract(abstract_id)"
+
	    " ON DELETE CASCADE ON UPDATE RESTRICT,"
+
	    "UNIQUE (package_id, key_id, value_id)"
	");"
	"PRAGMA user_version=%d;"
	;

struct repo_changes {
-
	int version;		/* The repo schema version this changes to */
+
	int version;		/* The repo schema this change applies to */
+
	int next_version;	/* The repo schema this change creates */
	const char *message;
	const char *sql;
};
@@ -130,82 +131,86 @@ struct repo_changes {
/* How to upgrade an older repo to match what the current system
   expects */
static struct repo_changes repo_upgrades[] = {
-
	{2002,
-
	 "Modify shlibs to add \'provided\' as well as \'required\': Use \'pkg create -Ba\' to initialise shlibs provided if desired",
+
	{2001,
+
	 2002,
+
	 "Modify shlib tracking to add \'provided\' capability",
	 "CREATE TABLE %Q.pkg_shlibs_required ("
-
		"package_id INTEGER NOT NULL REFERENCES %Q.packages(id)"
-
			" ON DELETE CASCADE ON UPDATE CASCADE,"
-
		"shlib_id INTEGER NOT NULL REFERENCES %Q.shlibs(id)"
-
			" ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"package_id INTEGER NOT NULL REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"shlib_id INTEGER NOT NULL REFERENCES shlibs(id)"
+
		" ON DELETE RESTRICT ON UPDATE RESTRICT,"
		"UNIQUE (package_id, shlib_id)"
	 ");"
	 "CREATE TABLE %Q.pkg_shlibs_provided ("
-
		"package_id INTEGER NOT NULL REFERENCES %Q.packages(id)"
-
			" ON DELETE CASCADE ON UPDATE CASCADE,"
-
		"shlib_id INTEGER NOT NULL REFERENCES %Q.shlibs(id)"
-
			" ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"package_id INTEGER NOT NULL REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"shlib_id INTEGER NOT NULL REFERENCES shlibs(id)"
+
		" ON DELETE RESTRICT ON UPDATE RESTRICT,"
		"UNIQUE (package_id, shlib_id)"
	 ");"
	 "INSERT INTO %Q.pkg_shlibs_required (package_id, shlib_id)"
-
	 	" SELECT package_id, shlib_id FROM %Q.pkg_shlibs;"
+
		" SELECT package_id, shlib_id FROM %Q.pkg_shlibs;"
	 "DROP TABLE %Q.pkg_shlibs;"
	},
-
	{2003,
-
	 "Add abstract metadata", 
+
	{2002,
+
	 2003,
+
	 "Add abstract metadata capability",
	 "CREATE TABLE %Q.abstract ("
-
                "abstract_id INTEGER PRIMARY KEY,"
-
                "abstract TEXT NOT NULL UNIQUE"
+
		"abstract_id INTEGER PRIMARY KEY,"
+
		"abstract TEXT NOT NULL UNIQUE"
	 ");"
	 "CREATE TABLE %Q.pkg_abstract ("
-
                "package_id INTERGER REFERENCES %Q.packages(id)"
-
                      " ON DELETE CASCADE ON UPDATE RESTRICT,"
-
                "key_id INTEGER NOT NULL REFERENCES %Q.abstract(abstract_id)"
-
                      " ON DELETE CASCADE ON UPDATE RESTRICT,"
-
		"value_id INTEGER NOT NULL REFERENCES %Q.abstract(abstract_id)"
-
		      " ON DELETE CASCADE ON UPDATE RESTRICT"
+
		"package_id INTERGER REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE RESTRICT,"
+
		"key_id INTEGER NOT NULL REFERENCES abstract(abstract_id)"
+
		" ON DELETE CASCADE ON UPDATE RESTRICT,"
+
		"value_id INTEGER NOT NULL REFERENCES abstract(abstract_id)"
+
		" ON DELETE CASCADE ON UPDATE RESTRICT"
	 ");"
	},

	/* Mark the end of the array */
-
	{ -1, NULL, NULL, },
+
	{ -1, -1, NULL, NULL, },

};

/* How to downgrade a newer repo to match what the current system
   expects */
static struct repo_changes repo_downgrades[] = {
-
	{2002,
-
	 "New abstract metadata", 
+
	{2003,
+
	 2002,
+
	 "Drop abstract metadata",
	 "DROP TABLE %Q.pkg_abstract;"
	 "DROP TABLE %Q.abstract;"
	},
-
	{2001,
-
	 "Update shlibs add provided as well as required",
+
	{2002,
+
	 2001,
+
	 "Drop \'shlibs provided\' but retain \'shlibs required\'",
	 "CREATE TABLE %Q.pkg_shlibs_required ("
-
		"package_id INTEGER NOT NULL REFERENCES %Q.packages(id)"
-
			" ON DELETE CASCADE ON UPDATE CASCADE,"
-
		"shlib_id INTEGER NOT NULL REFERENCES %Q.shlibs(id)"
-
			" ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"package_id INTEGER NOT NULL REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"shlib_id INTEGER NOT NULL REFERENCES shlibs(id)"
+
		" ON DELETE RESTRICT ON UPDATE RESTRICT,"
		"UNIQUE (package_id, shlib_id)"
	 ");"
	 "CREATE TABLE %Q.pkg_shlibs ("
-
                "package_id INTEGER REFERENCES %Q.packages(id)"
-
	                " ON DELETE CASCADE ON UPDATE CASCADE,"
-
                "shlib_id INTEGER REFERENCES %Q.shlibs(id)"
-
                        " ON DELETE RESTRICT ON UPDATE RESTRICT,"
-
	        "PRIMARY KEY (package_id, shlib_id)"
+
		"package_id INTEGER REFERENCES packages(id)"
+
		" ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"shlib_id INTEGER REFERENCES shlibs(id)"
+
		" ON DELETE RESTRICT ON UPDATE RESTRICT,"
+
		"PRIMARY KEY (package_id, shlib_id)"
	 ");"
	 "INSERT INTO %Q.pkg_shlibs (package_id, shlib_id)"
-
	        " SELECT package_id, shlib_id FROM %Q.pkg_shlibs_required;"
+
		" SELECT package_id, shlib_id FROM %Q.pkg_shlibs_required;"
	 "DELETE FROM %Q.shlibs WHERE id NOT IN"
-
	        " (SELECT shlib_id FROM %Q.pkg_shlibs);"
+
		" (SELECT shlib_id FROM %Q.pkg_shlibs);"
	 "DROP TABLE %Q.pkg_shlibs_provided;"
	 "DROP TABLE %Q.pkg_shlibs_required;"
	},


	/* Mark the end of the array */
-
	{ -1, NULL, NULL, },
+
	{ -1, -1, NULL, NULL, },

};