- Workaround for apparent async DB call brokenness in autocomplete -- and only occasionally permanently hang Firefox

- Restore (non-asynchronous) Fx3.0 support
This commit is contained in:
Dan Stillman 2009-08-28 05:56:29 +00:00
parent 76cab84373
commit ae88cbd0ce

View File

@ -48,6 +48,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
this._result = result;
this._results = [];
this._listener = listener;
this._cancelled = false;
this._zotero.debug("Starting autocomplete search of type '"
+ searchParam + "'" + " with string '" + searchString + "'");
@ -72,7 +73,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
break;
case 'tag':
var sql = "SELECT DISTINCT name, NULL FROM tags WHERE name LIKE ?";
var sql = "SELECT DISTINCT name AS val, NULL AS comment FROM tags WHERE name LIKE ?";
var sqlParams = [searchString + '%'];
if (extra){
sql += " AND name NOT IN (SELECT name FROM tags WHERE tagID IN ("
@ -100,18 +101,18 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
if (fieldMode==2)
{
var sql = "SELECT DISTINCT CASE fieldMode WHEN 1 THEN lastName "
+ "WHEN 0 THEN firstName || ' ' || lastName END AS name, NULL "
+ "WHEN 0 THEN firstName || ' ' || lastName END AS val, NULL AS comment "
+ "FROM creators NATURAL JOIN creatorData WHERE CASE fieldMode "
+ "WHEN 1 THEN lastName "
+ "WHEN 0 THEN firstName || ' ' || lastName END "
+ "LIKE ? ORDER BY name";
+ "LIKE ? ORDER BY val";
var sqlParams = searchString + '%';
}
else
{
var sql = "SELECT DISTINCT ";
if (fieldMode==1){
sql += "lastName AS name, creatorID || '-1' AS creatorID";
sql += "lastName AS val, creatorID || '-1' AS comment";
}
// Retrieve the matches in the specified field
// as well as any full names using the name
@ -123,10 +124,10 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
// - 2 means it uses both
else {
sql += "CASE WHEN firstName='' OR firstName IS NULL THEN lastName "
+ "ELSE lastName || ', ' || firstName END AS name, "
+ "ELSE lastName || ', ' || firstName END AS val, "
+ "creatorID || '-' || CASE "
+ "WHEN (firstName = '' OR firstName IS NULL) THEN 1 "
+ "ELSE 2 END AS creatorID";
+ "ELSE 2 END AS comment";
}
var fromSQL = " FROM creators NATURAL JOIN creatorData "
@ -145,11 +146,11 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
// as well (i.e. "Shakespeare"), and group to collapse repeats
if (fieldMode!=1){
sql = "SELECT * FROM (" + sql + " UNION SELECT DISTINCT "
+ searchParts[2] + " AS name, creatorID || '-1' AS creatorID"
+ fromSQL + ") GROUP BY name";
+ searchParts[2] + " AS val, creatorID || '-1' AS comment"
+ fromSQL + ") GROUP BY val";
}
sql += " ORDER BY name";
sql += " ORDER BY val";
}
statement = this._zotero.DB.getStatement(sql, sqlParams);
@ -157,7 +158,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
case 'dateModified':
case 'dateAdded':
var sql = "SELECT DISTINCT DATE(" + searchParam + ", 'localtime'), NULL FROM items "
var sql = "SELECT DISTINCT DATE(" + searchParam + ", 'localtime') AS val, NULL AS comment FROM items "
+ "WHERE " + searchParam + " LIKE ? ORDER BY " + searchParam;
statement = this._zotero.DB.getStatement(sql, searchString + '%');
break;
@ -165,7 +166,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
case 'accessDate':
var fieldID = this._zotero.ItemFields.getID('accessDate');
var sql = "SELECT DISTINCT DATE(value, 'localtime'), NULL FROM itemData "
var sql = "SELECT DISTINCT DATE(value, 'localtime') AS val, NULL AS comment FROM itemData "
+ "WHERE fieldID=? AND value LIKE ? ORDER BY value";
statement = this._zotero.DB.getStatement(sql, [fieldID, searchString + '%']);
break;
@ -183,7 +184,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
// use the user part of the multipart field
var valueField = searchParam=='date' ? 'SUBSTR(value, 12, 100)' : 'value';
var sql = "SELECT DISTINCT " + valueField + ", NULL "
var sql = "SELECT DISTINCT " + valueField + " AS val, NULL AS comment "
+ "FROM itemData NATURAL JOIN itemDataValues "
+ "WHERE fieldID=?1 AND " + valueField
+ " LIKE ?2 "
@ -198,6 +199,31 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
statement = this._zotero.DB.getStatement(sql, sqlParams);
}
if (this._zotero.isFx30) {
var rows = this._zotero.DB.query(sql, sqlParams);
var results = [];
var comments = [];
for each(var row in rows) {
results.push(row.val);
let comment = row.comment;
if (comment) {
comments.push(comment);
}
}
this.updateResults(results, comments);
return;
}
var self = this;
this._zotero.DB._connection.setProgressHandler(5000, {
onProgress: function (connection) {
if (self._cancelled) {
return true;
}
}
});
this.pendingStatement = statement.executeAsync({
handleResult: function (storageResultSet) {
self._zotero.debug("Handling autocomplete results");
@ -226,7 +252,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParam, p
},
handleError: function (e) {
Components.utils.reportError(e.message);
//Components.utils.reportError(e.message);
},
handleCompletion: function (reason) {
@ -295,10 +321,11 @@ ZoteroAutoComplete.prototype.updateResults = function (results, comments, ongoin
ZoteroAutoComplete.prototype.stopSearch = function(){
if (this.pendingStatement) {
// DEBUG: This appears to take as long as letting the query complete
this._zotero.debug('Stopping autocomplete search');
this.pendingStatement.cancel();
this._zotero.debug('Search cancelled');
// This appears to take as long as letting the query complete,
// so we flag instead and abort from the progress handler
//this.pendingStatement.cancel();
this._cancelled = true;
}
}