diff --git a/chrome/content/zotero/bindings/itembox.xml b/chrome/content/zotero/bindings/itembox.xml index c14c66890..aac8a62e4 100644 --- a/chrome/content/zotero/bindings/itembox.xml +++ b/chrome/content/zotero/bindings/itembox.xml @@ -1488,6 +1488,7 @@ @@ -1802,6 +1810,8 @@ diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index c1f547995..d6eb06ab2 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -2372,6 +2372,20 @@ Zotero.Schema = new function(){ Zotero.DB.query("UPDATE creatorData SET shortName='' WHERE shortName IS NULL"); Zotero.DB.query("UPDATE creatorData SET birthYear=NULL WHERE birthYear=''"); } + + if (i==55) { + Zotero.DB.query("CREATE TEMPORARY TABLE tmpEmptyCreators AS SELECT creatorID FROM creators WHERE creatorDataID IN (SELECT creatorDataID FROM creatorData WHERE firstName='' AND lastName='')"); + Zotero.DB.query("INSERT INTO syncDeleteLog SELECT 2, libraryID, key, CURRENT_TIMESTAMP FROM creators WHERE creatorID IN (SELECT creatorID FROM tmpEmptyCreators)"); + var rows = Zotero.DB.query("SELECT * FROM itemCreators WHERE creatorID IN (SELECT creatorID FROM tmpEmptyCreators) ORDER BY orderIndex DESC"); + for each(var row in rows) { + Zotero.DB.query("DELETE FROM itemCreators WHERE itemID=? AND creatorID=? AND orderIndex=?", [row.itemID, row.creatorID, row.orderIndex]); + Zotero.DB.query("UPDATE itemCreators SET orderIndex=orderIndex-1 WHERE itemID=? AND orderIndex>?", [row.itemID, row.orderIndex]); + } + Zotero.DB.query("DELETE FROM itemCreators WHERE creatorID IN (SELECT creatorID FROM tmpEmptyCreators)"); + Zotero.DB.query("DELETE FROM creators WHERE creatorDataID IN (SELECT creatorDataID FROM creatorData WHERE firstName='' AND lastName='')"); + Zotero.DB.query("DROP TABLE tmpEmptyCreators"); + Zotero.DB.query("DELETE FROM creatorData WHERE firstName='' AND lastName=''"); + } } _updateDBVersion('userdata', toVersion); diff --git a/triggers.sql b/triggers.sql index df5a46ec5..6f58dc3fa 100644 --- a/triggers.sql +++ b/triggers.sql @@ -1,4 +1,4 @@ --- 9 +-- 10 -- Triggers to validate date field DROP TRIGGER IF EXISTS insert_date_field; @@ -28,6 +28,22 @@ CREATE TRIGGER update_date_field BEFORE UPDATE ON itemData END; +-- Don't allow empty creators +DROP TRIGGER IF EXISTS insert_creatorData; +CREATE TRIGGER insert_creatorData BEFORE INSERT ON creatorData + FOR EACH ROW WHEN NEW.firstName='' AND NEW.lastName='' + BEGIN + SELECT RAISE (ABORT, 'Creator names cannot be empty'); + END; + +DROP TRIGGER IF EXISTS update_creatorData; +CREATE TRIGGER update_creatorData BEFORE UPDATE ON creatorData + FOR EACH ROW WHEN NEW.firstName='' AND NEW.lastName='' + BEGIN + SELECT RAISE (ABORT, 'Creator names cannot be empty'); + END; + + -- -- Fake foreign key constraint checks using triggers -- diff --git a/userdata.sql b/userdata.sql index 4ca52e1a0..28936932d 100644 --- a/userdata.sql +++ b/userdata.sql @@ -1,4 +1,4 @@ --- 54 +-- 55 -- This file creates tables containing user-specific data for new users -- -- any changes made here must be mirrored in transition steps in schema.js::_migrateSchema()