commit e9f5643ecd47e5c55faf311a0bc9dae64228842e
parent 1c560eb94c7e4c4c910bbc43f5f78425a2bb2c79
Author: Dan Stillman <dstillman@zotero.org>
Date: Tue, 2 Aug 2011 05:59:38 +0000
- Throw an error if an invalid creator type for the item type is passed to Zotero.Item.setCreator()
- Cache some Zotero.CreatorTypes calls
Diffstat:
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
@@ -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
@@ -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