Bug 888784 - Make FormHistory.search use Sqlite.jsm database backend. r?mak draft
authorMike Conley <mconley@mozilla.com>
Thu, 30 Nov 2017 15:15:10 -0500
changeset 723110 aea020afe76db6299be8fd220150b29b4ed577c0
parent 723109 6e73b0e77af287b1c16fa768e8b0caa8866a1e09
child 723111 3705f5ee500613ada9f5cdb0b3b546c459f54c8e
push id96341
push usermconley@mozilla.com
push dateMon, 22 Jan 2018 16:46:17 +0000
reviewersmak
bugs888784
milestone60.0a1
Bug 888784 - Make FormHistory.search use Sqlite.jsm database backend. r?mak MozReview-Commit-ID: J1ElTJpWHza
toolkit/components/satchel/FormHistory.jsm
--- a/toolkit/components/satchel/FormHistory.jsm
+++ b/toolkit/components/satchel/FormHistory.jsm
@@ -1083,57 +1083,68 @@ this.FormHistory = {
     }
     if (handlers.handleCompletion) {
       defaultHandlers.handleCompletion = handlers.handleCompletion;
     }
 
     return defaultHandlers;
   },
 
-  search(aSelectTerms, aSearchData, aCallbacks) {
+  search(aSelectTerms, aSearchData, aRowFuncOrHandlers) {
     // if no terms selected, select everything
     if (!aSelectTerms) {
       aSelectTerms = validFields;
     }
     validateSearchData(aSearchData, "Search");
 
-    let stmt = makeSearchStatement(aSearchData, aSelectTerms);
+    let query = "SELECT " + aSelectTerms.join(", ") + " FROM moz_formhistory";
+    let queryTerms = makeQueryPredicates(aSearchData);
+    if (queryTerms) {
+      query += " WHERE " + queryTerms;
+    }
+
+    let handlers;
 
-    let handlers = {
-      handleResult(aResultSet) {
-        for (let row = aResultSet.getNextRow(); row; row = aResultSet.getNextRow()) {
-          let result = {};
-          for (let field of aSelectTerms) {
-            result[field] = row.getResultByName(field);
-          }
+    if (typeof aRowFuncOrHandlers == "function") {
+      handlers = this._prepareHandlers();
+      handlers.handleResult = aRowFuncOrHandlers;
+    } else if (typeof aRowFuncOrHandlers == "object") {
+      handlers = this._prepareHandlers(aRowFuncOrHandlers);
+    }
 
-          if (aCallbacks && aCallbacks.handleResult) {
-            aCallbacks.handleResult(result);
-          }
-        }
-      },
+    let allResults = [];
 
-      handleError(aError) {
-        if (aCallbacks && aCallbacks.handleError) {
-          aCallbacks.handleError(aError);
-        }
-      },
+    return new Promise((resolve, reject) => {
+      this.db.then(async conn => {
+        try {
+          await conn.executeCached(query, aSearchData, row => {
+            let result = {};
+            for (let field of aSelectTerms) {
+              result[field] = row.getResultByName(field);
+            }
 
-      handleCompletion(aReason) {
-        if (aCallbacks && aCallbacks.handleCompletion) {
-          aCallbacks.handleCompletion(
-            aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED ?
-              0 :
-              1
-          );
+            if (handlers) {
+              handlers.handleResult(result);
+            } else {
+              allResults.push(result);
+            }
+          });
+          if (handlers) {
+            handlers.handleCompletion(0);
+          }
+          resolve(allResults);
+        } catch (e) {
+          if (handlers) {
+            handlers.handleError(e);
+            handlers.handleCompletion(1);
+          }
+          reject(e);
         }
-      },
-    };
-
-    stmt.executeAsync(handlers);
+      });
+    });
   },
 
   count(aSearchData, aHandlers) {
     validateSearchData(aSearchData, "Count");
 
     let query = "SELECT COUNT(*) AS numEntries FROM moz_formhistory";
     let queryTerms = makeQueryPredicates(aSearchData);
     if (queryTerms) {