Преглед изворни кода

HUE-6151 [editor] Catch all js exceptions in the autocompleter

This prevents the Ace editor from inserting garbled text when a js exception occurs.
Johan Ahlen пре 8 година
родитељ
комит
4221dea

+ 10 - 8
desktop/core/src/desktop/static/desktop/js/ko.hue-bindings.js

@@ -3454,14 +3454,16 @@
                       identifierChain: nextTable.identifierChain,
                       silenceErrors: true,
                       successCallback: function (data) {
-                        if (typeof data.columns !== 'undefined' && data.columns.indexOf(location.identifierChain[0].name) !== -1) {
-                          location.identifierChain = nextTable.identifierChain.concat(location.identifierChain);
-                          delete location.tables;
-                          token.parseLocation = location;
-                          activeTokens.push(token);
-                        } else if (tablesToGo.length > 0) {
-                          findIdentifierChainInTable(tablesToGo);
-                        }
+                        try {
+                          if (typeof data.columns !== 'undefined' && data.columns.indexOf(location.identifierChain[0].name) !== -1) {
+                            location.identifierChain = nextTable.identifierChain.concat(location.identifierChain);
+                            delete location.tables;
+                            token.parseLocation = location;
+                            activeTokens.push(token);
+                          } else if (tablesToGo.length > 0) {
+                            findIdentifierChainInTable(tablesToGo);
+                          }
+                        } catch (e) {} // TODO: Ignore for subqueries
                       }
                     })
                   } else if (tablesToGo.length > 0) {

+ 20 - 8
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter2.js

@@ -116,7 +116,11 @@ var SqlAutocompleter2 = (function () {
       if (foundVarRef.length > 0) {
         colRefCallback({ type: 'T' });
       } else {
-        self.fetchFieldsForIdentifiers(database, parseResult.colRef.identifierChain, colRefCallback, colRefDeferral.resolve);
+        try {
+          self.fetchFieldsForIdentifiers(database, parseResult.colRef.identifierChain, colRefCallback, colRefDeferral.resolve);
+        } catch(e) {
+          colRefCallback({ type: 'T' });
+        } // TODO: Ignore for subqueries
       }
     } else {
       colRefDeferral.resolve();
@@ -819,12 +823,16 @@ var SqlAutocompleter2 = (function () {
         self.snippet.getApiHelper().loadDatabases({
           sourceType: self.snippet.type(),
           successCallback: function (data) {
-            var foundDb = data.filter(function (db) {
-              return db.toLowerCase() === identifierChain[0].name.toLowerCase();
-            });
-            var databaseName = foundDb.length > 0 ? identifierChain.shift().name : defaultDatabase;
-            var tableName = identifierChain.shift().name;
-            fetchFieldsInternal(tableName, databaseName, identifierChain, callback, errorCallback, []);
+            try {
+              var foundDb = data.filter(function (db) {
+                return db.toLowerCase() === identifierChain[0].name.toLowerCase();
+              });
+              var databaseName = foundDb.length > 0 ? identifierChain.shift().name : defaultDatabase;
+              var tableName = identifierChain.shift().name;
+              fetchFieldsInternal(tableName, databaseName, identifierChain, callback, errorCallback, []);
+            } catch(e) {
+              callback([]);
+            } // TODO: Ignore for subqueries
           },
           silenceErrors: true,
           errorCallback: errorCallback
@@ -1009,7 +1017,11 @@ var SqlAutocompleter2 = (function () {
         addColumnsDeferred.resolve();
       };
 
-      self.fetchFieldsForIdentifiers(database, table.identifierChain, callback, addColumnsDeferred.resolve);
+      try {
+        self.fetchFieldsForIdentifiers(database, table.identifierChain, callback, addColumnsDeferred.resolve);
+      } catch(e) {
+        addColumnsDeferred.resolve();
+      } // TODO: Ignore for subqueries
     }
     return addColumnsDeferred;
   };

+ 31 - 14
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -328,9 +328,13 @@ var AutocompleteResults = (function () {
       if (foundVarRef.length > 0) {
         colRefDeferred.resolve({ type: 'T' });
       } else {
-        self.fetchFieldsForIdentifiers(self.parseResult.colRef.identifierChain, colRefCallback, function () {
+        try {
+          self.fetchFieldsForIdentifiers(self.parseResult.colRef.identifierChain, colRefCallback, function () {
+            colRefDeferred.resolve({ type: 'T' });
+          });
+        } catch (e) {
           colRefDeferred.resolve({ type: 'T' });
-        });
+        }  // TODO: Ignore for subqueries
       }
     } else {
       colRefDeferred.resolve({ type: 'T' });
@@ -945,7 +949,11 @@ var AutocompleteResults = (function () {
         addColumnsDeferred.resolve();
       };
 
-      self.fetchFieldsForIdentifiers(table.identifierChain, callback, addColumnsDeferred.resolve);
+      try {
+        self.fetchFieldsForIdentifiers(table.identifierChain, callback, addColumnsDeferred.resolve);
+      } catch (e) {
+        addColumnsDeferred.resolve();
+      } // TODO: Ignore for subqueries
     }
     return addColumnsDeferred;
   };
@@ -1681,12 +1689,16 @@ var AutocompleteResults = (function () {
           sourceType: self.snippet.type(),
           timeout: AUTOCOMPLETE_TIMEOUT,
           successCallback: function (data) {
-            var foundDb = data.filter(function (db) {
-              return db.toLowerCase() === identifierChain[0].name.toLowerCase();
-            });
-            var databaseName = foundDb.length > 0 ? identifierChain.shift().name : self.activeDatabase;
-            var tableName = identifierChain.shift().name;
-            fetchFieldsInternal(tableName, databaseName, identifierChain, callback, errorCallback, []);
+            try {
+              var foundDb = data.filter(function (db) {
+                return db.toLowerCase() === identifierChain[0].name.toLowerCase();
+              });
+              var databaseName = foundDb.length > 0 ? identifierChain.shift().name : self.activeDatabase;
+              var tableName = identifierChain.shift().name;
+              fetchFieldsInternal(tableName, databaseName, identifierChain, callback, errorCallback, []);
+            } catch (e) {
+              callback([]);
+            } // TODO: Ignore for subqueries
           },
           silenceErrors: true,
           errorCallback: errorCallback
@@ -1721,13 +1733,18 @@ var SqlAutocompleter3 = (function () {
 
   SqlAutocompleter3.prototype.autocomplete = function () {
     var self = this;
-    var parseResult = sql.parseSql(self.editor().getTextBeforeCursor(), self.editor().getTextAfterCursor(), self.snippet.type(), false);
+    try {
+      var parseResult = sql.parseSql(self.editor().getTextBeforeCursor(), self.editor().getTextAfterCursor(), self.snippet.type(), false);
 
-    if (typeof hueDebug !== 'undefined' && hueDebug.showParseResult) {
-      console.log(parseResult);
-    }
+      if (typeof hueDebug !== 'undefined' && hueDebug.showParseResult) {
+        console.log(parseResult);
+      }
 
-    self.suggestions.update(parseResult);
+      self.suggestions.update(parseResult);
+    } catch(e) {
+      // This prevents Ace from inserting garbled text in case of exception
+      huePubSub.publish('hue.ace.autocompleter.done');
+    }
   };
 
   return SqlAutocompleter3;