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()