Fix hangs related to data object purging

This commit is contained in:
Dan Stillman 2015-05-22 15:50:27 -04:00
parent cf010d7748
commit 22e0ba3a22
3 changed files with 54 additions and 54 deletions

View file

@ -333,11 +333,11 @@ Zotero.Group.prototype.erase = Zotero.Promise.coroutine(function* () {
sql = "DELETE FROM libraries WHERE libraryID=?";
yield Zotero.DB.queryAsync(sql, this.libraryID)
yield Zotero.purgeDataObjects();
Zotero.Groups.unregister(this.id);
Zotero.Notifier.trigger('delete', 'group', this.id, notifierData);
}.bind(this));
yield Zotero.purgeDataObjects();
});

View file

@ -370,61 +370,61 @@ Zotero.Tags = new function() {
tagIDs = Zotero.flattenArguments(tagIDs);
}
yield Zotero.DB.executeTransaction(function* () {
yield Zotero.Tags.load(libraryID);
// Use given tags, as long as they're orphaned
if (tagIDs) {
let sql = "CREATE TEMPORARY TABLE tagDelete (tagID INT PRIMARY KEY)";
yield Zotero.DB.queryAsync(sql);
for (let i=0; i<tagIDs.length; i++) {
yield Zotero.DB.queryAsync("INSERT OR IGNORE INTO tagDelete VALUES (?)", tagIDs[i]);
}
sql = "SELECT * FROM tagDelete WHERE tagID NOT IN (SELECT tagID FROM itemTags)";
var toDelete = yield Zotero.DB.columnQueryAsync(sql);
Zotero.DB.requireTransaction();
yield Zotero.Tags.load(libraryID);
// Use given tags, as long as they're orphaned
if (tagIDs) {
let sql = "CREATE TEMPORARY TABLE tagDelete (tagID INT PRIMARY KEY)";
yield Zotero.DB.queryAsync(sql);
for (let i=0; i<tagIDs.length; i++) {
yield Zotero.DB.queryAsync("INSERT OR IGNORE INTO tagDelete VALUES (?)", tagIDs[i]);
}
// Look for orphaned tags
else {
var sql = "CREATE TEMPORARY TABLE tagDelete AS "
+ "SELECT tagID FROM tags WHERE tagID "
+ "NOT IN (SELECT tagID FROM itemTags)";
yield Zotero.DB.queryAsync(sql);
sql = "CREATE INDEX tagDelete_tagID ON tagDelete(tagID)";
yield Zotero.DB.queryAsync(sql);
sql = "SELECT * FROM tagDelete";
var toDelete = yield Zotero.DB.columnQueryAsync(sql);
if (!toDelete) {
sql = "DROP TABLE tagDelete";
return Zotero.DB.queryAsync(sql);
}
}
notifierData = {};
for (let i=0; i<toDelete.length; i++) {
let id = toDelete[i];
if (_tagNamesByID[id]) {
notifierData[id] = {
old: {
libraryID: libraryID,
tag: _tagNamesByID[id]
}
};
}
}
_unload(libraryID, toDelete);
sql = "DELETE FROM tags WHERE tagID IN (SELECT tagID FROM tagDelete);";
sql = "SELECT * FROM tagDelete WHERE tagID NOT IN (SELECT tagID FROM itemTags)";
var toDelete = yield Zotero.DB.columnQueryAsync(sql);
}
// Look for orphaned tags
else {
var sql = "CREATE TEMPORARY TABLE tagDelete AS "
+ "SELECT tagID FROM tags WHERE tagID "
+ "NOT IN (SELECT tagID FROM itemTags)";
yield Zotero.DB.queryAsync(sql);
sql = "DROP TABLE tagDelete";
sql = "CREATE INDEX tagDelete_tagID ON tagDelete(tagID)";
yield Zotero.DB.queryAsync(sql);
Zotero.Notifier.trigger('delete', 'tag', toDelete, notifierData);
}.bind(this));
sql = "SELECT * FROM tagDelete";
var toDelete = yield Zotero.DB.columnQueryAsync(sql);
if (!toDelete) {
sql = "DROP TABLE tagDelete";
return Zotero.DB.queryAsync(sql);
}
}
notifierData = {};
for (let i=0; i<toDelete.length; i++) {
let id = toDelete[i];
if (_tagNamesByID[id]) {
notifierData[id] = {
old: {
libraryID: libraryID,
tag: _tagNamesByID[id]
}
};
}
}
_unload(libraryID, toDelete);
sql = "DELETE FROM tags WHERE tagID IN (SELECT tagID FROM tagDelete);";
yield Zotero.DB.queryAsync(sql);
sql = "DROP TABLE tagDelete";
yield Zotero.DB.queryAsync(sql);
Zotero.Notifier.trigger('delete', 'tag', toDelete, notifierData);
Zotero.Prefs.set('purge.tags', false);
});

View file

@ -2061,11 +2061,11 @@ Components.utils.import("resource://gre/modules/osfile.jsm");
// TEMP: Disabled until we have async DB (and maybe SQLite FTS)
//Zotero.Fulltext.purgeUnusedWords();
yield Zotero.DB.executeTransaction(function* () {
yield Zotero.Items.purge();
return Zotero.Items.purge();
});
// DEBUG: this might not need to be permanent
yield Zotero.DB.executeTransaction(function* () {
yield Zotero.Relations.purge();
return Zotero.Relations.purge();
});
});