Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Factor out the script text column into a new table: 'script'
Matthew Seaman committed 12 years ago
commit b5a535e93d7e28d15eb90ec7655417863e043682
parent df4d8c3
2 files changed +64 -4
modified libpkg/pkgdb.c
@@ -71,7 +71,7 @@
*/

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

#define DBVERSION (DB_SCHEMA_MAJOR * 1000 + DB_SCHEMA_MINOR)

@@ -483,15 +483,20 @@ pkgdb_init(sqlite3 *sdb)
	");"
	"CREATE TABLE mtree ("
		"id INTEGER PRIMARY KEY,"
-
		"content TEXT UNIQUE"
+
		"content TEXT NOT NULL UNIQUE"
	");"
-
	"CREATE TABLE scripts ("
+
	"CREATE TABLE package_script ("
		"package_id INTEGER REFERENCES packages(id) ON DELETE CASCADE"
			" ON UPDATE CASCADE,"
-
		"script TEXT,"
		"type INTEGER,"
+
		"script_id INTEGER REFERENCES script(script_id)"
+
                        " ON DELETE RESTRICT ON UPDATE CASCADE,"
		"PRIMARY KEY (package_id, type)"
	");"
+
        "CREATE TABLE script ("
+
                "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,"
modified libpkg/private/db_upgrades.h
@@ -402,6 +402,61 @@ static struct db_upgrades {
		"FROM oldpkgs;"
	"DROP TABLE oldpkgs;"
	},
+
	{20,
+
        "CREATE TABLE pkg_script ("
+
		"package_id INTEGER REFERENCES packages(id) ON DELETE CASCADE"
+
			" ON UPDATE CASCADE,"
+
		"type INTEGER,"
+
		"script_id INTEGER REFERENCES script(script_id)"
+
                        " ON DELETE RESTRICT ON UPDATE CASCADE,"
+
		"PRIMARY KEY (package_id, type)"
+
	");"
+
        "CREATE TABLE script ("
+
                "script_id INTEGER PRIMARY KEY,"
+
                "script TEXT NOT NULL UNIQUE"
+
        ");"
+
	"INSERT INTO script(script)"
+
                " SELECT DISTINCT script FROM scripts;"
+
        "INSERT INTO pkg_script(package_id,type,script_id)"
+
                " SELECT package_id, type, script_id FROM"
+
                " script s JOIN scripts ss ON (s.script = ss.script);"
+
        "DROP TABLE scripts;"
+
	"CREATE VIEW scripts AS SELECT package_id, script, type"
+
                " FROM pkg_script ps JOIN script s"
+
                " ON (ps.script_id = s.script_id);"
+
        "CREATE TRIGGER scripts_update"
+
                " INSTEAD OF UPDATE ON scripts "
+
        "FOR EACH ROW BEGIN"
+
                " INSERT OR IGNORE INTO script(script)"
+
                " VALUES(new.script);"
+
	        " UPDATE pkg_script"
+
                " SET package_id = new.package_id,"
+
                        " type = new.type,"
+
	                " script_id = ( SELECT script_id"
+
	                " FROM script WHERE script = new.script )"
+
                " WHERE package_id = old.package_id"
+
                        " AND type = old.type;"
+
         "END;"
+
         "CREATE TRIGGER scripts_insert"
+
                " INSTEAD OR INSERT ON scripts "
+
         "FOR EACH ROW BEGIN"
+
                " INSERT OR IGNORE INTO script(script)"
+
                " VALUES(new.script);"
+
	        " INSERT INTO pkg_script(package_id, type, script_id) "
+
	        " SELECT new.package_id, new.type, s.script_id"
+
                " FROM script s WHERE new.script = s.script;"
+
	 "END;"
+
	 "CREATE TRIGGER scripts_delete"
+
	        " INSTEAD OF DELETE ON scripts "
+
         "FOR EACH ROW BEGIN"
+
                " DELETE FROM pkg_script"
+
                " WHERE package_id = old.package_id"
+
                " AND type = old.type;"
+
                " DELETE FROM script"
+
                " WHERE script_id NOT IN"
+
                         " (SELECT DISTINCT script_id FROM pkg_script);"
+
	 "END;"
+
	},

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