From e9f5643ecd47e5c55faf311a0bc9dae64228842e Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Tue, 2 Aug 2011 05:59:38 +0000 Subject: [PATCH] - Throw an error if an invalid creator type for the item type is passed to Zotero.Item.setCreator() - Cache some Zotero.CreatorTypes calls --- .../content/zotero/xpcom/data/cachedTypes.js | 35 ++++++++++++++++--- chrome/content/zotero/xpcom/data/item.js | 5 +++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/chrome/content/zotero/xpcom/data/cachedTypes.js b/chrome/content/zotero/xpcom/data/cachedTypes.js index 0a2fa1bda..5315a6783 100644 --- a/chrome/content/zotero/xpcom/data/cachedTypes.js +++ b/chrome/content/zotero/xpcom/data/cachedTypes.js @@ -164,21 +164,48 @@ Zotero.CreatorTypes = new function() { var _primaryIDCache = {}; var _hasCreatorTypeCache = {}; + var _creatorTypesByItemType = {}; + var _isValidForItemType = {}; function getTypesForItemType(itemTypeID) { + if (_creatorTypesByItemType[itemTypeID]) { + return _creatorTypesByItemType[itemTypeID]; + } + var sql = "SELECT creatorTypeID AS id, creatorType AS name " + "FROM itemTypeCreatorTypes NATURAL JOIN creatorTypes " // DEBUG: sort needs to be on localized strings in itemPane.js // (though still put primary field at top) + "WHERE itemTypeID=? ORDER BY primaryField=1 DESC, name"; - return Zotero.DB.query(sql, itemTypeID); + var types = Zotero.DB.query(sql, itemTypeID); + if (!types) { + types = []; + } + + _creatorTypesByItemType[itemTypeID] = types; + return _creatorTypesByItemType[itemTypeID]; } function isValidForItemType(creatorTypeID, itemTypeID) { - var sql = "SELECT COUNT(*) FROM itemTypeCreatorTypes " - + "WHERE itemTypeID=? AND creatorTypeID=?"; - return !!Zotero.DB.valueQuery(sql, [itemTypeID, creatorTypeID]); + if (_isValidForItemType[itemTypeID] && typeof _isValidForItemType[itemTypeID][creatorTypeID] != 'undefined') { + return _isValidForItemType[itemTypeID][creatorTypeID]; + } + + var valid = false; + var types = this.getTypesForItemType(creatorTypeID, itemTypeID); + for each(var type in types) { + if (type.id == creatorTypeID) { + valid = true; + break; + } + } + + if (!_isValidForItemType[itemTypeID]) { + _isValidForItemType[itemTypeID] = {}; + } + _isValidForItemType[itemTypeID][creatorTypeID] = valid; + return valid; } diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index d5baca4e0..cbb657397 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -1011,6 +1011,11 @@ Zotero.Item.prototype.setCreator = function(orderIndex, creator, creatorTypeIDOr return false; } + if (!Zotero.CreatorTypes.isValidForItemType(creatorTypeID, this.itemTypeID)) { + throw ("Invalid creator type for item type in Zotero.Item.setCreator() " + + "(" + creatorTypeID + ", " + this.itemTypeID + ")"); + } + this._creators[orderIndex] = { ref: creator, creatorTypeID: creatorTypeID