Bug 1226556 - part 3: add tableExists to ESEDBReader, use it to fall back to normal bookmarks migration, r?MattN draft
authorGijs Kruitbosch <gijskruitbosch@gmail.com>
Wed, 03 Feb 2016 14:46:36 +0000
changeset 328540 b416f9298c5b98538418918ee7263ca2e5c0e95f
parent 328539 bcc6624f825d2ac952c925f3a7ccfb78f80ff97d
child 513825 c5f681827f74db7cd971f5e8688e7d9e53702a7b
push id10368
push usergijskruitbosch@gmail.com
push dateWed, 03 Feb 2016 14:49:00 +0000
reviewersMattN
bugs1226556
milestone47.0a1
Bug 1226556 - part 3: add tableExists to ESEDBReader, use it to fall back to normal bookmarks migration, r?MattN
browser/components/migration/ESEDBReader.jsm
browser/components/migration/EdgeProfileMigrator.js
--- a/browser/components/migration/ESEDBReader.jsm
+++ b/browser/components/migration/ESEDBReader.jsm
@@ -319,16 +319,40 @@ ESEDB.prototype = {
     try {
       columnInfo = this._getColumnInfo(tableName, [{name: columnName}]);
     } catch (ex) {
       return null;
     }
     return columnInfo[0];
   },
 
+  tableExists(tableName) {
+    if (!this._opened) {
+      throw "The database was closed!";
+    }
+
+    let tableId = new ESE.JET_TABLEID();
+    let rv = ESE.ManualOpenTableW(this._sessionId, this._dbId, tableName, null,
+                                  0, 4 /* JET_bitTableReadOnly */,
+                                  tableId.address());
+    if (rv == -1305 /* JET_errObjectNotFound */) {
+      return false;
+    }
+    if (rv < 0) {
+      log.error("Got error " + rv + " calling OpenTableW");
+      throw new Error(convertESEError(rv));
+    }
+
+    if (rv > 0) {
+      log.error("Got warning " + rv + " calling OpenTableW");
+    }
+    ESE.FailSafeCloseTable(this._sessionId, tableId);
+    return true;
+  },
+
   tableItems: function*(tableName, columns) {
     if (!this._opened) {
       throw "The database was closed!";
     }
 
     let tableOpened = false;
     let tableId;
     try {
--- a/browser/components/migration/EdgeProfileMigrator.js
+++ b/browser/components/migration/EdgeProfileMigrator.js
@@ -222,18 +222,44 @@ EdgeReadingListMigrator.prototype = {
 };
 
 function EdgeBookmarksMigrator() {
 }
 
 EdgeBookmarksMigrator.prototype = {
   type: MigrationUtils.resourceTypes.BOOKMARKS,
 
+  get TABLE_NAME() { return "Favorites" },
+
   get exists() {
-    return !!gEdgeDatabase;
+    if ("_exists" in this) {
+      return this._exists;
+    }
+    return this._exists = (!!gEdgeDatabase && this._checkTableExists());
+  },
+
+  _checkTableExists() {
+    let database;
+    let rv;
+    try {
+      let logFile = gEdgeDatabase.parent;
+      logFile.append("LogFiles");
+      database = ESEDBReader.openDB(gEdgeDatabase.parent, gEdgeDatabase, logFile);
+
+      rv = database.tableExists(this.TABLE_NAME);
+    } catch (ex) {
+      Cu.reportError("Failed to check for table " + tableName + " in Edge database at " +
+                     gEdgeDatabase.path + " due to the following error: " + ex);
+      return false;
+    } finally {
+      if (database) {
+        ESEDBReader.closeDB(database);
+      }
+    }
+    return rv;
   },
 
   migrate(callback) {
     this._migrateBookmarks(PlacesUtils.bookmarks.menuGuid).then(
       () => callback(true),
       ex => {
         Cu.reportError(ex);
         callback(false);
@@ -317,17 +343,17 @@ EdgeBookmarksMigrator.prototype = {
       if (row.IsDeleted) {
         return false;
       }
       if (row.IsFolder) {
         folderMap.set(row.ItemId, row);
       }
       return true;
     }
-    let bookmarks = readTableFromEdgeDB("Favorites", columns, filterFn);
+    let bookmarks = readTableFromEdgeDB(this.TABLE_NAME, columns, filterFn);
     return {bookmarks, folderMap};
   },
 
   _getGuidForFolder: Task.async(function*(folderId, folderMap, rootGuid) {
     // If the folderId is not known as a folder in the folder map, we assume
     // we just need the root
     if (!folderMap.has(folderId)) {
       return rootGuid;
@@ -362,18 +388,22 @@ EdgeBookmarksMigrator.prototype = {
 }
 
 function EdgeProfileMigrator() {
 }
 
 EdgeProfileMigrator.prototype = Object.create(MigratorPrototype);
 
 EdgeProfileMigrator.prototype.getResources = function() {
+  let bookmarksMigrator = new EdgeBookmarksMigrator();
+  if (!bookmarksMigrator.exists) {
+    bookmarksMigrator = MSMigrationUtils.getBookmarksMigrator(MSMigrationUtils.MIGRATION_TYPE_EDGE);
+  }
   let resources = [
-    new EdgeBookmarksMigrator(),
+    bookmarksMigrator,
     MSMigrationUtils.getCookiesMigrator(MSMigrationUtils.MIGRATION_TYPE_EDGE),
     new EdgeTypedURLMigrator(),
     new EdgeReadingListMigrator(),
   ];
   let windowsVaultFormPasswordsMigrator =
     MSMigrationUtils.getWindowsVaultFormPasswordsMigrator();
   windowsVaultFormPasswordsMigrator.name = "EdgeVaultFormPasswords";
   resources.push(windowsVaultFormPasswordsMigrator);