Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add update code to transition to new options schema
Matthew Seaman committed 12 years ago
commit 6cc63fb6b8d29b7718522cc085434d901eb0c4b9
parent d657dee
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 }