diff --git a/chrome/content/zotero/preferences/preferences.js b/chrome/content/zotero/preferences/preferences.js index a4f68fb3c..24a722583 100644 --- a/chrome/content/zotero/preferences/preferences.js +++ b/chrome/content/zotero/preferences/preferences.js @@ -1189,6 +1189,9 @@ function runIntegrityCheck() { .getService(Components.interfaces.nsIPromptService); var ok = Zotero.DB.integrityCheck(); + if (ok) { + ok = Zotero.Schema.integrityCheck(); + } var str = ok ? 'passed' : 'failed'; ps.alert(window, diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index 7ed35b8ff..891d635cd 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1038,6 +1038,59 @@ Zotero.Schema = new function(){ } + this.integrityCheck = function () { + // There should be an equivalent SELECT COUNT(*) statement for every + // statement run by the DB Repair Tool + var queries = [ + "SELECT COUNT(*) FROM annotations WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM collectionItems WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM fulltextItems WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM fulltextItemWords WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM fulltextItemWords WHERE itemID NOT IN (SELECT itemID FROM fulltextItems)", + "SELECT COUNT(*) FROM highlights WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemAttachments WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemCreators WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemData WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemNotes WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemSeeAlso WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemSeeAlso WHERE linkedItemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemTags WHERE itemID NOT IN (SELECT itemID FROM items)", + "SELECT COUNT(*) FROM itemTags WHERE tagID NOT IN (SELECT tagID FROM tags)", + "SELECT COUNT(*) FROM savedSearchConditions WHERE savedSearchID NOT IN (select savedSearchID FROM savedSearches)", + "SELECT COUNT(*) FROM items WHERE itemTypeID IS NULL", + + "SELECT COUNT(*) FROM itemData WHERE valueID NOT IN (SELECT valueID FROM itemDataValues)", + "SELECT COUNT(*) FROM fulltextItemWords WHERE wordID NOT IN (SELECT wordID FROM fulltextWords)", + "SELECT COUNT(*) FROM collectionItems WHERE collectionID NOT IN (SELECT collectionID FROM collections)", + "SELECT COUNT(*) FROM itemCreators WHERE creatorID NOT IN (SELECT creatorID FROM creators)", + "SELECT COUNT(*) FROM itemTags WHERE tagID NOT IN (SELECT tagID FROM tags)", + "SELECT COUNT(*) FROM itemData WHERE fieldID NOT IN (SELECT fieldID FROM fields)", + "SELECT COUNT(*) FROM itemData WHERE valueID NOT IN (SELECT valueID FROM itemDataValues)", + + "SELECT COUNT(*) FROM itemData WHERE fieldID NOT IN (SELECT fieldID FROM itemTypeFields WHERE itemTypeID=(SELECT itemTypeID FROM items WHERE itemID=itemData.itemID))", + + "SELECT COUNT(*) FROM items WHERE itemTypeID=14 AND itemID NOT IN (SELECT itemID FROM itemAttachments)", + + "SELECT COUNT(*) FROM itemAttachments WHERE sourceItemID IN (SELECT itemID FROM items WHERE itemTypeID IN (1,14))", + "SELECT COUNT(*) FROM itemNotes WHERE sourceItemID IN (SELECT itemID FROM items WHERE itemTypeID IN (1,14))", + + "SELECT COUNT(*) FROM tags NATURAL JOIN itemTags JOIN items USING (itemID) WHERE IFNULL(tags.libraryID, 0)!=IFNULL(items.libraryID,0)", + + "SELECT COUNT(*) FROM itemTags WHERE tagID IS NULL", + "SELECT COUNT(*) FROM itemAttachments WHERE charsetID='NULL'" + ]; + + for each(var sql in queries) { + if (Zotero.DB.valueQuery(sql)) { + return false; + } + } + + return true; + } + + + ///////////////////////////////////////////////////////////////// // // Private methods