' + + Zotero.getString('install.quickStartGuide.message.thanks') + + '
'; + var sql = "INSERT INTO itemNotes VALUES (2, 1, ?, ?)"; + Zotero.DB.query(sql, [welcomeMsg, welcomeTitle]); */ } Zotero.DB.commitTransaction(); @@ -2547,6 +2766,20 @@ Zotero.Schema = new function(){ } } + if (i==68) { + Zotero.DB.query("DROP TRIGGER IF EXISTS fkd_itemData_fieldID_fields_fieldID"); + Zotero.DB.query("DROP TRIGGER IF EXISTS fku_fields_fieldID_itemData_fieldID"); + Zotero.DB.query("UPDATE savedSearchConditions SET condition='itemType', value=(SELECT typeName FROM itemTypes WHERE itemTypeID=value) WHERE condition='itemTypeID'"); + + Zotero.DB.query("CREATE TABLE customItemTypes (\n customItemTypeID INTEGER PRIMARY KEY,\n typeName TEXT,\n label TEXT,\n display INT DEFAULT 1,\n icon TEXT\n)"); + Zotero.DB.query("CREATE TABLE customFields (\n customFieldID INTEGER PRIMARY KEY,\n fieldName TEXT,\n label TEXT\n)"); + Zotero.DB.query("CREATE TABLE customItemTypeFields (\n customItemTypeID INT NOT NULL,\n fieldID INT,\n customFieldID INT,\n hide INT NOT NULL,\n orderIndex INT NOT NULL,\n PRIMARY KEY (customItemTypeID, orderIndex),\n FOREIGN KEY (customItemTypeID) REFERENCES customItemTypes(customItemTypeID),\n FOREIGN KEY (fieldID) REFERENCES fields(fieldID),\n FOREIGN KEY (customFieldID) REFERENCES customFields(customFieldID)\n)"); + Zotero.DB.query("CREATE INDEX customItemTypeFields_fieldID ON customItemTypeFields(fieldID)"); + Zotero.DB.query("CREATE INDEX customItemTypeFields_customFieldID ON customItemTypeFields(customFieldID)"); + Zotero.DB.query("CREATE TABLE customBaseFieldMappings (\n customItemTypeID INT,\n baseFieldID INT,\n customFieldID INT,\n PRIMARY KEY (customItemTypeID, baseFieldID, customFieldID),\n FOREIGN KEY (customItemTypeID) REFERENCES customItemTypes(customItemTypeID),\n FOREIGN KEY (baseFieldID) REFERENCES fields(fieldID),\n FOREIGN KEY (customFieldID) REFERENCES fields(customFieldID)\n);\nCREATE INDEX customBaseFieldMappings_baseFieldID ON customBaseFieldMappings(baseFieldID)"); + Zotero.DB.query("CREATE INDEX customBaseFieldMappings_customFieldID ON customBaseFieldMappings(customFieldID)"); + } + Zotero.wait(); } diff --git a/chrome/content/zotero/xpcom/search.js b/chrome/content/zotero/xpcom/search.js index a32e3c7f0..ce3a28f78 100644 --- a/chrome/content/zotero/xpcom/search.js +++ b/chrome/content/zotero/xpcom/search.js @@ -219,6 +219,14 @@ Zotero.Search.prototype.load = function() { continue; } + // Convert itemTypeID to itemType + // + // TEMP: This can be removed at some point + if (condition == 'itemTypeID') { + condition = 'itemType'; + conditions[i].value = Zotero.ItemTypes.getName(conditions[i].value); + } + this._conditions[conditions[i]['searchConditionID']] = { id: conditions[i]['searchConditionID'], condition: condition, @@ -1202,6 +1210,11 @@ Zotero.Search.prototype._buildQuery = function(){ skipOperators = true; break; + case 'itemType': + condSQL += "itemTypeID IN (SELECT itemTypeID FROM itemTypesCombined WHERE "; + openParens++; + break; + case 'fileTypeID': var ftSQL = 'SELECT mimeType FROM fileTypeMimeTypes ' + 'WHERE fileTypeID IN (' @@ -1314,35 +1327,7 @@ Zotero.Search.prototype._buildQuery = function(){ if (parseDate){ var go = false; - // Allow 'today' or localized 'today' - var lc = (condition.value + '').toLowerCase(); - if (lc == 'yesterday' || lc == Zotero.getString('date.yesterday')) { - var dateparts = Zotero.Date.strToDate( - Zotero.Date.dateToSQL( - new Date(new Date().getTime() - 86400000), true - ) - ); - dateparts.part = null; - } - else if (lc == 'today' || lc == Zotero.getString('date.today')) { - var dateparts = Zotero.Date.strToDate( - Zotero.Date.dateToSQL( - new Date(), true - ) - ); - dateparts.part = null; - } - else if (lc == 'tomorrow' || lc == Zotero.getString('date.tomorrow')) { - var dateparts = Zotero.Date.strToDate( - Zotero.Date.dateToSQL( - new Date(new Date().getTime() + 86400000), true - ) - ); - dateparts.part = null; - } - else { - var dateparts = Zotero.Date.strToDate(condition.value); - } + var dateparts = Zotero.Date.strToDate(condition.value); // Search on SQL date -- underscore is // single-character wildcard @@ -1847,7 +1832,7 @@ Zotero.SearchConditions = new function(){ }, noLoad: true }, - + // // Standard conditions @@ -1900,6 +1885,7 @@ Zotero.SearchConditions = new function(){ field: 'dateModified' }, + // Deprecated { name: 'itemTypeID', operators: { @@ -1907,7 +1893,18 @@ Zotero.SearchConditions = new function(){ isNot: true }, table: 'items', - field: 'itemTypeID' + field: 'itemTypeID', + special: true + }, + + { + name: 'itemType', + operators: { + is: true, + isNot: true + }, + table: 'items', + field: 'typeName' }, { @@ -1998,7 +1995,7 @@ Zotero.SearchConditions = new function(){ }, table: 'itemData', field: 'value', - aliases: Zotero.DB.columnQuery("SELECT fieldName FROM fields " + + aliases: Zotero.DB.columnQuery("SELECT fieldName FROM fieldsCombined " + "WHERE fieldName NOT IN ('accessDate', 'date', 'pages', " + "'section','seriesNumber','issue')"), template: true // mark for special handling @@ -2015,7 +2012,7 @@ Zotero.SearchConditions = new function(){ }, table: 'itemData', field: 'value', - aliases: ['accessDate', 'date'], + aliases: ['accessDate', 'date', 'dateDue', 'accepted'], // TEMP - NSF template: true // mark for special handling }, @@ -2087,6 +2084,14 @@ Zotero.SearchConditions = new function(){ _conditions[conditions[i]['name']] = conditions[i]; if (conditions[i]['aliases']) { for (var j in conditions[i]['aliases']) { + // TEMP - NSF + switch (conditions[i]['aliases'][j]) { + case 'dateDue': + case 'accepted': + if (!Zotero.ItemTypes.getID('nsfReviewer')) { + continue; + } + } _conditions[conditions[i]['aliases'][j]] = conditions[i]; } } @@ -2190,11 +2195,16 @@ Zotero.SearchConditions = new function(){ function getLocalizedName(str) { + // TEMP + if (str == 'itemType') { + str = 'itemTypeID'; + } + try { return Zotero.getString('searchConditions.' + str) } catch (e) { - return Zotero.getString('itemFields.' + str); + return Zotero.ItemFields.getLocalizedString(null, str); } } @@ -2244,4 +2254,11 @@ Zotero.SearchConditions = new function(){ return [condition, mode]; } + + + this.reload = function () { + _initialized = false; + _conditions = {}; + _standardConditions = []; + } } diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index fbbb18a72..2a4c06c40 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -358,7 +358,7 @@ var Zotero = new function(){ // If no userdata upgrade, still might need to process system/scrapers else { try { - Zotero.Schema.updateSchema(); + var updated = Zotero.Schema.updateSchema(); } catch (e) { if (typeof e == 'string' && e.match('newer than SQL file')) { @@ -381,6 +381,11 @@ var Zotero = new function(){ Zotero.DB.startDummyStatement(); Zotero.Schema.updateFromRepository(); + // Populate combined tables for custom types and fields -- this is likely temporary + if (!upgraded && !updated) { + Zotero.Schema.updateCustomTables(); + } + // Initialize integration web server Zotero.Integration.init(); @@ -1794,6 +1799,18 @@ Zotero.Date = new function(){ var _dayRe = null; function strToDate(string) { + // Parse 'yesterday'/'today'/'tomorrow' + var lc = (string + '').toLowerCase(); + if (lc == 'yesterday' || lc == Zotero.getString('date.yesterday')) { + string = Zotero.Date.dateToSQL(new Date(new Date().getTime() - 86400000)).substr(0, 10); + } + else if (lc == 'today' || lc == Zotero.getString('date.today')) { + string = Zotero.Date.dateToSQL(new Date()).substr(0, 10); + } + else if (lc == 'tomorrow' || lc == Zotero.getString('date.tomorrow')) { + string = Zotero.Date.dateToSQL(new Date(new Date().getTime() + 86400000)).substr(0, 10); + } + var date = new Object(); // skip empty things diff --git a/chrome/skin/default/zotero/report_user.png b/chrome/skin/default/zotero/report_user.png new file mode 100644 index 000000000..7766edd74 Binary files /dev/null and b/chrome/skin/default/zotero/report_user.png differ diff --git a/system.sql b/system.sql index 971342f43..43d378184 100644 --- a/system.sql +++ b/system.sql @@ -1,4 +1,4 @@ --- 25 +-- 26 -- Copyright (c) 2009 Center for History and New Media -- George Mason University, Fairfax, Virginia, USA @@ -33,6 +33,16 @@ CREATE TABLE itemTypes ( display INT DEFAULT 1 -- 0 == hide, 1 == display, 2 == primary ); +-- Populated at startup from itemTypes and customItemTypes +DROP TABLE IF EXISTS itemTypesCombined; +CREATE TABLE itemTypesCombined ( + itemTypeID INT NOT NULL, + typeName TEXT NOT NULL, + display INT DEFAULT 1 NOT NULL, + custom INT NOT NULL, + PRIMARY KEY (itemTypeID) +); + -- Describes various types of fields and their format restrictions, -- and indicates whether data should be stored as strings or integers -- @@ -53,6 +63,17 @@ CREATE TABLE fields ( FOREIGN KEY (fieldFormatID) REFERENCES fieldFormats(fieldFormatID) ); +-- Populated at startup from fields and customFields +DROP TABLE IF EXISTS fieldsCombined; +CREATE TABLE fieldsCombined ( + fieldID INT NOT NULL, + fieldName TEXT NOT NULL, + label TEXT, + fieldFormatID INT, + custom INT NOT NULL, + PRIMARY KEY (fieldID) +); + -- Defines valid fields for each itemType, their display order, and their default visibility DROP TABLE IF EXISTS itemTypeFields; CREATE TABLE itemTypeFields ( @@ -60,10 +81,24 @@ CREATE TABLE itemTypeFields ( fieldID INT, hide INT, orderIndex INT, - PRIMARY KEY (itemTypeID, fieldID), + PRIMARY KEY (itemTypeID, orderIndex), + UNIQUE (itemTypeID, fieldID), FOREIGN KEY (itemTypeID) REFERENCES itemTypes(itemTypeID), FOREIGN KEY (fieldID) REFERENCES fields(fieldID) ); +CREATE INDEX itemTypeFields_fieldID ON itemTypeFields(fieldID); + +-- Populated at startup from itemTypeFields and customItemTypeFields +DROP TABLE IF EXISTS itemTypeFieldsCombined; +CREATE TABLE itemTypeFieldsCombined ( + itemTypeID INT NOT NULL, + fieldID INT NOT NULL, + hide INT, + orderIndex INT NOT NULL, + PRIMARY KEY (itemTypeID, orderIndex), + UNIQUE (itemTypeID, fieldID) +); +CREATE INDEX itemTypeFieldsCombined_fieldID ON itemTypeFieldsCombined(fieldID); -- Maps base fields to type-specific fields (e.g. publisher to label in audioRecording) DROP TABLE IF EXISTS baseFieldMappings; @@ -72,18 +107,29 @@ CREATE TABLE baseFieldMappings ( baseFieldID INT, fieldID INT, PRIMARY KEY (itemTypeID, baseFieldID, fieldID), + FOREIGN KEY (itemTypeID) REFERENCES itemTypes(itemTypeID), FOREIGN KEY (baseFieldID) REFERENCES fields(fieldID), FOREIGN KEY (fieldID) REFERENCES fields(fieldID) ); -DROP INDEX IF EXISTS baseFieldMappings_baseFieldID; CREATE INDEX baseFieldMappings_baseFieldID ON baseFieldMappings(baseFieldID); +CREATE INDEX baseFieldMappings_fieldID ON baseFieldMappings(fieldID); + +-- Populated at startup from baseFieldMappings and customBaseFieldMappings +DROP TABLE IF EXISTS baseFieldMappingsCombined; +CREATE TABLE baseFieldMappingsCombined ( + itemTypeID INT, + baseFieldID INT, + fieldID INT, + PRIMARY KEY (itemTypeID, baseFieldID, fieldID) +); +CREATE INDEX baseFieldMappingsCombined_baseFieldID ON baseFieldMappingsCombined(baseFieldID); +CREATE INDEX baseFieldMappingsCombined_fieldID ON baseFieldMappingsCombined(fieldID); DROP TABLE IF EXISTS charsets; CREATE TABLE charsets ( charsetID INTEGER PRIMARY KEY, charset TEXT UNIQUE ); -DROP INDEX IF EXISTS charsets_charset; CREATE INDEX charsets_charset ON charsets(charset); DROP TABLE IF EXISTS fileTypes; @@ -91,7 +137,6 @@ CREATE TABLE fileTypes ( fileTypeID INTEGER PRIMARY KEY, fileType TEXT UNIQUE ); -DROP INDEX IF EXISTS fileTypes_fileType; CREATE INDEX fileTypes_fileType ON fileTypes(fileType); DROP TABLE IF EXISTS fileTypeMimeTypes; @@ -101,7 +146,6 @@ CREATE TABLE fileTypeMimeTypes ( PRIMARY KEY (fileTypeID, mimeType), FOREIGN KEY (fileTypeID) REFERENCES fileTypes(fileTypeID) ); -DROP INDEX IF EXISTS fileTypeMimeTypes_mimeType; CREATE INDEX fileTypeMimeTypes_mimeType ON fileTypeMimeTypes(mimeType); -- Defines the possible creator types (contributor, editor, author) @@ -120,7 +164,8 @@ CREATE TABLE itemTypeCreatorTypes ( FOREIGN KEY (itemTypeID) REFERENCES itemTypes(itemTypeID), FOREIGN KEY (creatorTypeID) REFERENCES creatorTypes(creatorTypeID) ); - +CREATE INDEX itemTypeCreatorTypes_creatorTypeID ON itemTypeCreatorTypes(creatorTypeID); + DROP TABLE IF EXISTS syncObjectTypes; CREATE TABLE syncObjectTypes ( syncObjectTypeID INTEGER PRIMARY KEY, @@ -142,7 +187,6 @@ CREATE TABLE transactions ( context TEXT, action TEXT ); -DROP INDEX IF EXISTS transactions_transactionSetID; CREATE INDEX transactions_transactionSetID ON transactions(transactionSetID); DROP TABLE IF EXISTS transactionLog; diff --git a/triggers.sql b/triggers.sql index 0a2434ba4..6cd9581e3 100644 --- a/triggers.sql +++ b/triggers.sql @@ -1,4 +1,4 @@ --- 15 +-- 16 -- Copyright (c) 2009 Center for History and New Media -- George Mason University, Fairfax, Virginia, USA @@ -341,6 +341,171 @@ CREATE TRIGGER fku_creatorData_creatorDataID_creators_creatorDataID WHERE (SELECT COUNT(*) FROM creators WHERE creatorDataID = OLD.creatorDataID) > 0; END; + +-- customBaseFieldMappings/customItemTypeID +DROP TRIGGER IF EXISTS fki_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID; +CREATE TRIGGER fki_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID + BEFORE INSERT ON customBaseFieldMappings + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'insert on table "customBaseFieldMappings" violates foreign key constraint "fki_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID"') + WHERE NEW.customItemTypeID IS NOT NULL AND (SELECT COUNT(*) FROM customItemTypes WHERE customItemTypeID = NEW.customItemTypeID) = 0; + END; + +DROP TRIGGER IF EXISTS fku_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID; +CREATE TRIGGER fku_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID + BEFORE UPDATE OF customItemTypeID ON customBaseFieldMappings + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'update on table "customBaseFieldMappings" violates foreign key constraint "fku_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID"') + WHERE NEW.customItemTypeID IS NOT NULL AND (SELECT COUNT(*) FROM customItemTypes WHERE customItemTypeID = NEW.customItemTypeID) = 0; + END; + +DROP TRIGGER IF EXISTS fkd_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID; +CREATE TRIGGER fkd_customBaseFieldMappings_customItemTypeID_customItemTypes_customItemTypeID + BEFORE DELETE ON customItemTypes + FOR EACH ROW BEGIN + DELETE FROM customBaseFieldMappings WHERE customItemTypeID = OLD.customItemTypeID; + END; + +DROP TRIGGER IF EXISTS fku_customItemTypes_customItemTypeID_customBaseFieldMappings_customItemTypeID; +CREATE TRIGGER fku_customItemTypes_customItemTypeID_customBaseFieldMappings_customItemTypeID + AFTER UPDATE OF customItemTypeID ON customItemTypes + FOR EACH ROW BEGIN + UPDATE customBaseFieldMappings SET customItemTypeID=NEW.customItemTypeID WHERE customItemTypeID=OLD.customItemTypeID; + END; + + +-- customBaseFieldMappings/baseFieldID +DROP TRIGGER IF EXISTS fki_customBaseFieldMappings_baseFieldID_fields_fieldID; +CREATE TRIGGER fki_customBaseFieldMappings_baseFieldID_fields_fieldID + BEFORE INSERT ON customBaseFieldMappings + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'insert on table "customBaseFieldMappings" violates foreign key constraint "fki_customBaseFieldMappings_baseFieldID_fields_fieldID"') + WHERE NEW.baseFieldID IS NOT NULL AND (SELECT COUNT(*) FROM fields WHERE fieldID = NEW.baseFieldID) = 0; + END; + +DROP TRIGGER IF EXISTS fku_customBaseFieldMappings_baseFieldID_fields_fieldID; +CREATE TRIGGER fku_customBaseFieldMappings_baseFieldID_fields_fieldID + BEFORE UPDATE OF baseFieldID ON customBaseFieldMappings + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'update on table "customBaseFieldMappings" violates foreign key constraint "fku_customBaseFieldMappings_baseFieldID_fields_fieldID"') + WHERE NEW.baseFieldID IS NOT NULL AND (SELECT COUNT(*) FROM fields WHERE fieldID = NEW.baseFieldID) = 0; + END; + + +-- customBaseFieldMappings/customFieldID +DROP TRIGGER IF EXISTS fki_customBaseFieldMappings_customFieldID_customFields_customFieldID; +CREATE TRIGGER fki_customBaseFieldMappings_customFieldID_customFields_customFieldID + BEFORE INSERT ON customBaseFieldMappings + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'insert on table "customBaseFieldMappings" violates foreign key constraint "fki_customBaseFieldMappings_customFieldID_customFields_customFieldID"') + WHERE NEW.customFieldID IS NOT NULL AND (SELECT COUNT(*) FROM customFields WHERE customFieldID = NEW.customFieldID) = 0; + END; + +DROP TRIGGER IF EXISTS fku_customBaseFieldMappings_customFieldID_customFields_customFieldID; +CREATE TRIGGER fku_customFields_customFieldID_customFields_customFieldID + BEFORE UPDATE OF customFieldID ON customBaseFieldMappings + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'update on table "customBaseFieldMappings" violates foreign key constraint "fku_customBaseFieldMappings_customFieldID_customFields_customFieldID"') + WHERE NEW.customFieldID IS NOT NULL AND (SELECT COUNT(*) FROM customFields WHERE customFieldID = NEW.customFieldID) = 0; + END; + +DROP TRIGGER IF EXISTS fkd_customBaseFieldMappings_customFieldID_customFields_customFieldID; +CREATE TRIGGER fkd_customFields_customFieldID_customFields_customFieldID + BEFORE DELETE ON customFields + FOR EACH ROW BEGIN + DELETE FROM customBaseFieldMappings WHERE customFieldID = OLD.customFieldID; + END; + +DROP TRIGGER IF EXISTS fku_customFields_customFieldID_customBaseFieldMappings_customFieldID; +CREATE TRIGGER fku_customFields_customFieldID_customBaseFieldMappings_customFieldID + AFTER UPDATE OF customFieldID ON customFields + FOR EACH ROW BEGIN + UPDATE customBaseFieldMappings SET customFieldID=NEW.customFieldID WHERE customFieldID=OLD.customFieldID; + END; + + +-- customItemTypeFields/customItemTypeID +DROP TRIGGER IF EXISTS fki_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID; +CREATE TRIGGER fki_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID + BEFORE INSERT ON customItemTypeFields + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'insert on table "customItemTypeFields" violates foreign key constraint "fki_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID"') + WHERE NEW.customItemTypeID IS NOT NULL AND (SELECT COUNT(*) FROM customItemTypes WHERE customItemTypeID = NEW.customItemTypeID) = 0; + END; + +DROP TRIGGER IF EXISTS fku_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID; +CREATE TRIGGER fku_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID + BEFORE UPDATE OF customItemTypeID ON customItemTypeFields + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'update on table "customItemTypeFields" violates foreign key constraint "fku_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID"') + WHERE NEW.customItemTypeID IS NOT NULL AND (SELECT COUNT(*) FROM customItemTypes WHERE customItemTypeID = NEW.customItemTypeID) = 0; + END; + +DROP TRIGGER IF EXISTS fkd_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID; +CREATE TRIGGER fkd_customItemTypeFields_customItemTypeID_customItemTypes_customItemTypeID + BEFORE DELETE ON customItemTypes + FOR EACH ROW BEGIN + DELETE FROM customBaseFieldMappings WHERE customItemTypeID = OLD.customItemTypeID; + END; + +DROP TRIGGER IF EXISTS fku_customItemTypes_customItemTypeID_customItemTypeFields_customItemTypeID; +CREATE TRIGGER fku_customItemTypes_customItemTypeID_customItemTypeFields_customItemTypeID + AFTER UPDATE OF customItemTypeID ON customItemTypes + FOR EACH ROW BEGIN + UPDATE customItemTypeFields SET customItemTypeID=NEW.customItemTypeID WHERE customItemTypeID=OLD.customItemTypeID; + END; + + +-- customItemTypeFields/fieldID +DROP TRIGGER IF EXISTS fki_customItemTypeFields_fieldID_fields_fieldID; +CREATE TRIGGER fki_customItemTypeFields_fieldID_fields_fieldID + BEFORE INSERT ON customItemTypeFields + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'insert on table "customItemTypeFields" violates foreign key constraint "fki_customItemTypeFields_fieldID_fields_fieldID"') + WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fields WHERE fieldID = NEW.fieldID) = 0; + END; + +DROP TRIGGER IF EXISTS fku_customItemTypeFields_fieldID_fields_fieldID; +CREATE TRIGGER fku_customItemTypeFields_fieldID_fields_fieldID + BEFORE UPDATE OF fieldID ON customItemTypeFields + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'update on table "customItemTypeFields" violates foreign key constraint "fku_customItemTypeFields_fieldID_fields_fieldID"') + WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fields WHERE fieldID = NEW.fieldID) = 0; + END; + + +-- customItemTypeFields/customFieldID +DROP TRIGGER IF EXISTS fki_customItemTypeFields_customFieldID_customFields_customFieldID; +CREATE TRIGGER fki_customItemTypeFields_customFieldID_customFields_customFieldID + BEFORE INSERT ON customItemTypeFields + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'insert on table "customItemTypeFields" violates foreign key constraint "fki_customItemTypeFields_customFieldID_customFields_customFieldID"') + WHERE NEW.customFieldID IS NOT NULL AND (SELECT COUNT(*) FROM customFields WHERE customFieldID = NEW.customFieldID) = 0; + END; + +DROP TRIGGER IF EXISTS fku_customItemTypeFields_customFieldID_customFields_customFieldID; +CREATE TRIGGER fku_customItemTypeFields_customFieldID_customFields_customFieldID + BEFORE UPDATE OF customFieldID ON customItemTypeFields + FOR EACH ROW BEGIN + SELECT RAISE(ABORT, 'update on table "customItemTypeFields" violates foreign key constraint "fku_customItemTypeFields_customFieldID_customFields_customFieldID"') + WHERE NEW.customFieldID IS NOT NULL AND (SELECT COUNT(*) FROM customFields WHERE customFieldID = NEW.customFieldID) = 0; + END; + +DROP TRIGGER IF EXISTS fkd_customItemTypeFields_customFieldID_customFields_customFieldID; +CREATE TRIGGER fkd_customItemTypeFields_customFieldID_customFields_customFieldID + BEFORE DELETE ON customFields + FOR EACH ROW BEGIN + DELETE FROM customItemTypeFields WHERE customFieldID = OLD.customFieldID; + END; + +DROP TRIGGER IF EXISTS fku_customFields_customFieldID_customItemTypeFields_customFieldID; +CREATE TRIGGER fku_customFields_customFieldID_customItemTypeFields_customFieldID + AFTER UPDATE OF customFieldID ON customFields + FOR EACH ROW BEGIN + UPDATE customItemTypeFields SET customFieldID=NEW.customFieldID WHERE customFieldID=OLD.customFieldID; + END; + + -- fulltextItems/itemID DROP TRIGGER IF EXISTS fki_fulltextItems_itemID_items_itemID; CREATE TRIGGER fki_fulltextItems_itemID_items_itemID @@ -859,32 +1024,16 @@ DROP TRIGGER IF EXISTS fki_itemData_fieldID_fields_fieldID; CREATE TRIGGER fki_itemData_fieldID_fields_fieldID BEFORE INSERT ON itemData FOR EACH ROW BEGIN - SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_fieldID_fields_fieldID"') - WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fields WHERE fieldID = NEW.fieldID) = 0; + SELECT RAISE(ABORT, 'insert on table "itemData" violates foreign key constraint "fki_itemData_fieldID_fieldsCombined_fieldID"') + WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fieldsCombined WHERE fieldID = NEW.fieldID) = 0; END; DROP TRIGGER IF EXISTS fku_itemData_fieldID_fields_fieldID; CREATE TRIGGER fku_itemData_fieldID_fields_fieldID BEFORE UPDATE OF fieldID ON itemData FOR EACH ROW BEGIN - SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_fieldID_fields_fieldID"') - WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fields WHERE fieldID = NEW.fieldID) = 0; - END; - -DROP TRIGGER IF EXISTS fkd_itemData_fieldID_fields_fieldID; -CREATE TRIGGER fkd_itemData_fieldID_fields_fieldID - BEFORE DELETE ON FIELDS - FOR EACH ROW BEGIN - SELECT RAISE(ABORT, 'delete on table "fields" violates foreign key constraint "fkd_itemData_fieldID_fields_fieldID"') - WHERE (SELECT COUNT(*) FROM itemData WHERE fieldID = OLD.fieldID) > 0; - END; - -DROP TRIGGER IF EXISTS fku_fields_fieldID_itemData_fieldID; -CREATE TRIGGER fku_fields_fieldID_itemData_fieldID - BEFORE UPDATE OF fieldID ON FIELDS - FOR EACH ROW BEGIN - SELECT RAISE(ABORT, 'update on table "fields" violates foreign key constraint "fku_fields_fieldID_itemData_fieldID"') - WHERE (SELECT COUNT(*) FROM itemData WHERE fieldID = OLD.fieldID) > 0; + SELECT RAISE(ABORT, 'update on table "itemData" violates foreign key constraint "fku_itemData_fieldID_fieldsCombined_fieldID"') + WHERE NEW.fieldID IS NOT NULL AND (SELECT COUNT(*) FROM fieldsCombined WHERE fieldID = NEW.fieldID) = 0; END; -- itemData/valueID diff --git a/userdata.sql b/userdata.sql index 9e2f8d0cd..13d95eaeb 100644 --- a/userdata.sql +++ b/userdata.sql @@ -1,4 +1,4 @@ --- 67 +-- 68 -- Copyright (c) 2009 Center for History and New Media -- George Mason University, Fairfax, Virginia, USA @@ -338,4 +338,46 @@ CREATE TABLE proxyHosts ( hostname TEXT, FOREIGN KEY (proxyID) REFERENCES proxies(proxyID) ); -CREATE INDEX proxyHosts_proxyID ON proxyHosts(proxyID); \ No newline at end of file +CREATE INDEX proxyHosts_proxyID ON proxyHosts(proxyID); + + +-- These shouldn't be used yet +CREATE TABLE customItemTypes ( + customItemTypeID INTEGER PRIMARY KEY, + typeName TEXT, + label TEXT, + display INT DEFAULT 1, -- 0 == hide, 1 == display, 2 == primary + icon TEXT +); + +CREATE TABLE customFields ( + customFieldID INTEGER PRIMARY KEY, + fieldName TEXT, + label TEXT +); + +CREATE TABLE customItemTypeFields ( + customItemTypeID INT NOT NULL, + fieldID INT, + customFieldID INT, + hide INT NOT NULL, + orderIndex INT NOT NULL, + PRIMARY KEY (customItemTypeID, orderIndex), + FOREIGN KEY (customItemTypeID) REFERENCES customItemTypes(customItemTypeID), + FOREIGN KEY (fieldID) REFERENCES fields(fieldID), + FOREIGN KEY (customFieldID) REFERENCES customFields(customFieldID) +); +CREATE INDEX customItemTypeFields_fieldID ON customItemTypeFields(fieldID); +CREATE INDEX customItemTypeFields_customFieldID ON customItemTypeFields(customFieldID); + +CREATE TABLE customBaseFieldMappings ( + customItemTypeID INT, + baseFieldID INT, + customFieldID INT, + PRIMARY KEY (customItemTypeID, baseFieldID, customFieldID), + FOREIGN KEY (customItemTypeID) REFERENCES customItemTypes(customItemTypeID), + FOREIGN KEY (baseFieldID) REFERENCES fields(fieldID), + FOREIGN KEY (customFieldID) REFERENCES fields(customFieldID) +); +CREATE INDEX customBaseFieldMappings_baseFieldID ON customBaseFieldMappings(baseFieldID); +CREATE INDEX customBaseFieldMappings_customFieldID ON customBaseFieldMappings(customFieldID); \ No newline at end of file