Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Add update code to transition to new options schema
Matthew Seaman committed 12 years ago
commit 6cc63fb6b8d29b7718522cc085434d901eb0c4b9
parent d657deebe1a679c0e6d6c58743b5e3a71227b9f3
1 file changed +76 -0
modified libpkg/private/db_upgrades.h
@@ -458,6 +458,82 @@ static struct db_upgrades {
                         " (SELECT DISTINCT script_id FROM pkg_script);"
	"END;"
	},
+
	{21,
+
	"CREATE TABLE option ("
+
		"option_id INTEGER PRIMARY KEY,"
+
		"option TEXT NOT NULL UNIQUE"
+
	");"
+
	"CREATE TABLE option_desc ("
+
		"option_desc_id INTEGER PRIMARY KEY,"
+
		"option_desc TEXT NOT NULL UNIQUE"
+
	");"
+
	"CREATE TABLE pkg_option ("
+
		"package_id INTEGER NOT NULL REFERENCES packages(id) "
+
			"ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"option_id INTEGER NOT NULL REFERENCES option(option_id) "
+
			"ON DELETE RESTRICT ON UPDATE CASCADE,"
+
		"value TEXT NOT NULL,"
+
		"PRIMARY KEY(package_id, option_id)"
+
	");"
+
	"CREATE TABLE pkg_option_desc ("
+
		"package_id INTEGER NOT NULL REFERENCES packages(id) "
+
			"ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"option_id INTEGER NOT NULL REFERENCES option(option_id) "
+
			"ON DELETE RESTRICT ON UPDATE CASCADE,"
+
		"option_desc_id INTEGER NOT NULL "
+
			"REFERENCES option_desc(option_desc_id) "
+
			"ON DELETE RESTRICT ON UPDATE CASCADE,"
+
		"PRIMARY KEY(package_id, option_id)"
+
	");"
+
	"CREATE TABLE pkg_option_default ("
+
		"package_id INTEGER NOT NULL REFERENCES packages(id) "
+
			"ON DELETE CASCADE ON UPDATE CASCADE,"
+
		"option_id INTEGER NOT NULL REFERENCES option(option_id) "
+
			"ON DELETE RESTRICT ON UPDATE CASCADE,"
+
		"default TEXT NOT NULL,"
+
		"PRIMARY KEY(package_id, option_id)"
+
	");"
+
	"INSERT INTO option(option) "
+
		"SELECT DISTINCT option FROM options;"
+
	"INSERT INTO pkg_option(package_id, option_id, value) "
+
		"SELECT package_id, option_id, value "
+
		"FROM options oo JOIN option o ON (oo.option = o.option);"
+
	"DROP TABLE options;"
+
	"CREATE VIEW options AS "
+
		"SELECT package_id, option, value "
+
		"FROM pkg_option JOIN option USING(option_id);"
+
	"CREATE TRIGGER options_update "
+
		"INSTEAD OF UPDATE ON options "
+
	"FOR EACH ROW BEGIN "
+
		"UPDATE pkg_option "
+
		"SET value = new.value "
+
		"WHERE package_id = old.package_id AND "
+
			"option_id = ( SELECT option_id FROM option "
+
				      "WHERE option = old.option );"
+
	"END;"
+
	"CREATE TRIGGER options_insert "
+
		"INSTEAD OF INSERT ON options "
+
	"FOR EACH ROW BEGIN "
+
		"INSERT OR IGNORE INTO option(option) "
+
		"VALUES(new.option);"
+
		"INSERT INTO pkg_option(package_id, option_id, value) "
+
		"VALUES (new.package_id, "
+
			"(SELECT option_id FROM option "
+
			"WHERE option = new.option), "
+
			"new.value);"
+
	"END;"
+
	"CREATE TRIGGER options_delete "
+
		"INSTEAD OF DELETE ON options "
+
	"FOR EACH ROW BEGIN "
+
		"DELETE FROM pkg_option "
+
		"WHERE package_id = old.package_id AND "
+
			"option_id = ( SELECT option_id FROM option "
+
					"WHERE option = old.option );"
+
		"DELETE FROM option "
+
		"WHERE option_id NOT IN "
+
			"( SELECT DISTINCT option_id FROM pkg_option );"
+
	"END;"
+
	},

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