www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 0d59bde186f730770b3c6e845dca5ec0dcdf31a3
parent 4f155e343257a704bcdea853ea6eed8964ecc551
Author: Dan Stillman <dstillman@zotero.org>
Date:   Tue, 16 Jun 2015 19:50:25 -0400

Clean up DataObject erasing, and fix search unloading

Diffstat:
Mchrome/content/zotero/xpcom/data/collection.js | 16++--------------
Mchrome/content/zotero/xpcom/data/dataObject.js | 46++++++++++++++++++++++++----------------------
Mchrome/content/zotero/xpcom/data/item.js | 29+++--------------------------
Mchrome/content/zotero/xpcom/search.js | 10----------
Mtest/tests/dataObjectsTest.js | 14+++++++++++++-
5 files changed, 42 insertions(+), 73 deletions(-)

diff --git a/chrome/content/zotero/xpcom/data/collection.js b/chrome/content/zotero/xpcom/data/collection.js @@ -561,12 +561,6 @@ Zotero.Collection.prototype._eraseData = Zotero.Promise.coroutine(function* (env var descendents = yield this.getDescendents(false, null, true); var items = []; - var notifierData = {}; - notifierData[this.id] = { - libraryID: this.libraryID, - key: this.key - }; - var del = []; for(var i=0, len=descendents.length; i<len; i++) { // Descendent collections @@ -574,7 +568,7 @@ Zotero.Collection.prototype._eraseData = Zotero.Promise.coroutine(function* (env collections.push(descendents[i].id); var c = yield this.ObjectsClass.getAsync(descendents[i].id); if (c) { - notifierData[c.id] = { + env.notifierData[c.id] = { libraryID: c.libraryID, key: c.key }; @@ -607,13 +601,7 @@ Zotero.Collection.prototype._eraseData = Zotero.Promise.coroutine(function* (env + '(' + placeholders + ')', collections); // TODO: Update member items - // Clear deleted collection from internal memory - this.ObjectsClass.unload(collections); - //return Zotero.Collections.reloadAll(); - - if (!env.options.skipNotifier) { - Zotero.Notifier.queue('delete', 'collection', collections, notifierData); - } + env.deletedObjectIDs = collections; }); diff --git a/chrome/content/zotero/xpcom/data/dataObject.js b/chrome/content/zotero/xpcom/data/dataObject.js @@ -1127,23 +1127,20 @@ Zotero.DataObject.prototype.erase = Zotero.Promise.coroutine(function* (options) env.options.tx = true; } - var proceed = yield this._eraseInit(env); - if (!proceed) return false; - Zotero.debug('Deleting ' + this.objectType + ' ' + this.id); if (env.options.tx) { return Zotero.DB.executeTransaction(function* () { + Zotero.DataObject.prototype._initErase.call(this, env); yield this._eraseData(env); - yield this._erasePreCommit(env); - return this._erasePostCommit(env); + Zotero.DataObject.prototype._finalizeErase.call(this, env); }.bind(this)) } else { Zotero.DB.requireTransaction(); + Zotero.DataObject.prototype._initErase.call(this, env); yield this._eraseData(env); - yield this._erasePreCommit(env); - return this._erasePostCommit(env); + Zotero.DataObject.prototype._finalizeErase.call(this, env); } }); @@ -1153,23 +1150,28 @@ Zotero.DataObject.prototype.eraseTx = function (options) { return this.erase(options); }; -Zotero.DataObject.prototype._eraseInit = function(env) { - if (!this.id) return Zotero.Promise.resolve(false); - - return Zotero.Promise.resolve(true); -}; - -Zotero.DataObject.prototype._eraseData = function(env) { - throw new Error("Zotero.DataObject.prototype._eraseData is an abstract method"); -}; - -Zotero.DataObject.prototype._erasePreCommit = function(env) { - return Zotero.Promise.resolve(); +Zotero.DataObject.prototype._initErase = function (env) { + env.notifierData = {}; + env.notifierData[this.id] = { + libraryID: this.libraryID, + key: this.key + }; }; -Zotero.DataObject.prototype._erasePostCommit = function(env) { - return Zotero.Promise.resolve(); -}; +Zotero.DataObject.prototype._finalizeErase = function (env) { + Zotero.DB.addCurrentCallback("commit", function () { + this.ObjectsClass.unload(env.deletedObjectIDs || this.id); + }.bind(this)); + + if (!env.options.skipNotifier) { + Zotero.Notifier.queue( + 'delete', + this._objectType, + Object.keys(env.notifierData).map(id => parseInt(id)), + env.notifierData + ); + } +} /** * Generates data object key diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js @@ -3720,19 +3720,6 @@ Zotero.Item.prototype.copy = Zotero.Promise.coroutine(function* () { });; -Zotero.Item.prototype._eraseInit = Zotero.Promise.coroutine(function* (env) { - var proceed = yield Zotero.Item._super.prototype._eraseInit.apply(this, arguments); - if (!proceed) return false; - - env.deletedItemNotifierData = {}; - env.deletedItemNotifierData[this.id] = { - libraryID: this.libraryID, - key: this.key - }; - - return true; -}); - Zotero.Item.prototype._eraseData = Zotero.Promise.coroutine(function* (env) { Zotero.DB.requireTransaction(); @@ -3792,21 +3779,11 @@ Zotero.Item.prototype._eraseData = Zotero.Promise.coroutine(function* (env) { //Zotero.Fulltext.clearItemContent(this.id); } - env.parentItem = parentItem; -}); - -Zotero.Item.prototype._erasePreCommit = Zotero.Promise.coroutine(function* (env) { yield Zotero.DB.queryAsync('DELETE FROM items WHERE itemID=?', this.id); - if (env.parentItem) { - yield env.parentItem.reload(['primaryData', 'childItems'], true); - env.parentItem.clearBestAttachmentState(); - } - - this.ObjectsClass.unload(this.id); - - if (!env.options.skipNotifier) { - Zotero.Notifier.queue('delete', 'item', this.id, env.deletedItemNotifierData); + if (parentItem) { + yield parentItem.reload(['primaryData', 'childItems'], true); + parentItem.clearBestAttachmentState(); } Zotero.Prefs.set('purge.items', true); diff --git a/chrome/content/zotero/xpcom/search.js b/chrome/content/zotero/xpcom/search.js @@ -220,21 +220,11 @@ Zotero.Search.prototype.clone = function (libraryID) { Zotero.Search.prototype._eraseData = Zotero.Promise.coroutine(function* (env) { Zotero.DB.requireTransaction(); - var notifierData = {}; - notifierData[this.id] = { - libraryID: this.libraryID, - key: this.key - }; - var sql = "DELETE FROM savedSearchConditions WHERE savedSearchID=?"; yield Zotero.DB.queryAsync(sql, this.id); var sql = "DELETE FROM savedSearches WHERE savedSearchID=?"; yield Zotero.DB.queryAsync(sql, this.id); - - if (!env.options.skipNotifier) { - Zotero.Notifier.queue('delete', 'search', this.id, notifierData); - } }); diff --git a/test/tests/dataObjectsTest.js b/test/tests/dataObjectsTest.js @@ -42,7 +42,19 @@ describe("Zotero.DataObjects", function () { assert.isFalse(libraryKey); } }); - }); + }) + + describe("#exists()", function () { + it("should return false after object is deleted", function* () { + for (let type of types) { + let objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type); + let obj = yield createDataObject(type); + let id = obj.id; + yield obj.eraseTx(); + assert.isFalse(objectsClass.exists(id), type + " does not exist"); + } + }) + }) describe("#_setIdentifier", function () { it("should not allow an id change", function* () {