Bug 1226556 - part 3: add tableExists to ESEDBReader, use it to fall back to normal bookmarks migration, r?MattN
--- 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);