Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Revamp schema for storing options:
Matthew Seaman committed 12 years ago
commit d657deebe1a679c0e6d6c58743b5e3a71227b9f3
parent bdf0903
1 file changed +69 -7
modified libpkg/pkgdb.c
@@ -71,7 +71,7 @@
*/

#define DB_SCHEMA_MAJOR	0
-
#define DB_SCHEMA_MINOR	20
+
#define DB_SCHEMA_MINOR	21

#define DBVERSION (DB_SCHEMA_MAJOR * 1000 + DB_SCHEMA_MINOR)

@@ -499,12 +499,39 @@ pkgdb_init(sqlite3 *sdb)
                "script_id INTEGER PRIMARY KEY,"
                "script TEXT NOT NULL UNIQUE"
        ");"
-
	"CREATE TABLE options ("
-
		"package_id INTEGER REFERENCES packages(id) ON DELETE CASCADE"
-
			" ON UPDATE CASCADE,"
-
		"option TEXT,"
-
		"value TEXT,"
-
		"PRIMARY KEY (package_id,option)"
+
	"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)"
	");"
	"CREATE TABLE deps ("
		"origin TEXT NOT NULL,"
@@ -686,6 +713,41 @@ pkgdb_init(sqlite3 *sdb)
                         " (SELECT DISTINCT script_id FROM pkg_script);"
	"END;"

+
	"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;"
+

	"PRAGMA user_version = %d;"
	"COMMIT;"
	;