mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-25 11:15:34 +00:00
Bug 566746, support deleted table in new form history module, r=mak
This commit is contained in:
parent
8f48bceea0
commit
bf297fa2b7
@ -91,6 +91,13 @@ const DB_SCHEMA_VERSION = 4;
|
||||
const DAY_IN_MS = 86400000; // 1 day in milliseconds
|
||||
const NOOP = function noop() {};
|
||||
|
||||
let supportsDeletedTable =
|
||||
#ifdef ANDROID
|
||||
true;
|
||||
#else
|
||||
false;
|
||||
#endif
|
||||
|
||||
let Prefs = {
|
||||
initialized: false,
|
||||
|
||||
@ -152,6 +159,11 @@ const dbSchema = {
|
||||
"lastUsed" : "INTEGER",
|
||||
"guid" : "TEXT",
|
||||
},
|
||||
moz_deleted_formhistory: {
|
||||
"id" : "INTEGER PRIMARY KEY",
|
||||
"timeDeleted" : "INTEGER",
|
||||
"guid" : "TEXT"
|
||||
}
|
||||
},
|
||||
indices : {
|
||||
moz_formhistory_index : {
|
||||
@ -299,6 +311,30 @@ function makeUpdateStatement(aGuid, aNewData, aBindingArrays) {
|
||||
return dbCreateAsyncStatement(query, aNewData, aBindingArrays);
|
||||
}
|
||||
|
||||
function makeMoveToDeletedStatement(aGuid, aNow, aData, aBindingArrays) {
|
||||
if (supportsDeletedTable) {
|
||||
let query = "INSERT INTO moz_deleted_formhistory (guid, timeDeleted)";
|
||||
let queryTerms = makeQueryPredicates(aData);
|
||||
|
||||
if (aGuid) {
|
||||
query += " VALUES (:guid, :timeDeleted)";
|
||||
} else {
|
||||
// TODO: Add these items to the deleted items table once we've sorted
|
||||
// out the issues from bug 756701
|
||||
if (!queryTerms)
|
||||
return;
|
||||
|
||||
query += " SELECT guid, :timeDeleted FROM moz_formhistory WHERE " + queryTerms;
|
||||
}
|
||||
|
||||
aData.timeDeleted = aNow;
|
||||
|
||||
return dbCreateAsyncStatement(query, aData, aBindingArrays);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function generateGUID() {
|
||||
// string like: "{f60d9eac-9421-4abc-8491-8e8322b063d4}"
|
||||
let uuid = uuidService.generateUUID().toString();
|
||||
@ -414,6 +450,7 @@ function dbCreate() {
|
||||
for (let name in dbSchema.tables) {
|
||||
let table = dbSchema.tables[name];
|
||||
let tSQL = [[col, table[col]].join(" ") for (col in table)].join(", ");
|
||||
log("Creating table " + name + " with " + tSQL);
|
||||
_dbConnection.createTable(name, tSQL);
|
||||
}
|
||||
|
||||
@ -451,40 +488,39 @@ function dbMigrate(oldVersion) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Upgrade to newer version...
|
||||
let migrateStmts = [];
|
||||
for (let v = oldVersion + 1; v <= DB_SCHEMA_VERSION; v++) {
|
||||
log("Upgrading to version " + v + "...");
|
||||
let migrateFunction = "dbMigrateToVersion" + v;
|
||||
for each (let stmt in this[migrateFunction]()) {
|
||||
migrateStmts.push(stmt);
|
||||
// Note that migration is currently performed synchronously.
|
||||
_dbConnection.beginTransaction();
|
||||
|
||||
try {
|
||||
for (let v = oldVersion + 1; v <= DB_SCHEMA_VERSION; v++) {
|
||||
this.log("Upgrading to version " + v + "...");
|
||||
Migrators["dbMigrateToVersion" + v]();
|
||||
}
|
||||
} catch (e) {
|
||||
this.log("Migration failed: " + e);
|
||||
this.dbConnection.rollbackTransaction();
|
||||
throw e;
|
||||
}
|
||||
|
||||
_dbConnection.executeAsync(migrateStmts, migrateStmts.length, {
|
||||
handleResult : NOOP,
|
||||
handleError : function dbMigrateHandleError(aError) {
|
||||
throw Components.Exception(aError.message,
|
||||
Cr.NS_ERROR_UNEXPECTED);
|
||||
},
|
||||
handleCompletion : function dbMigrateHandleCompletion(aReason) {
|
||||
if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) {
|
||||
_dbConnection.schemaVersion = DB_SCHEMA_VERSION;
|
||||
}
|
||||
}
|
||||
});
|
||||
_dbConnection.schemaVersion = DB_SCHEMA_VERSION;
|
||||
_dbConnection.commitTransaction();
|
||||
|
||||
log("DB migration completed.");
|
||||
}
|
||||
|
||||
// dbMigrateToVersion1 (bug 463154) -- unsupported as of Firefox 11
|
||||
// dbMigrateToVersion2 (bug 243136) -- unsupported as of Firefox 11
|
||||
// dbMigrateToVersion3 (bug 506402) -- unsupported as of Firefox 11
|
||||
|
||||
// WARNING: Newer dbMigrateToVersionXXX functions should return an
|
||||
// ordered list of mozIStorageAsyncStatements (e.g. through
|
||||
// dbCreateAsyncStatement) that modify and update the database rather than
|
||||
// executing them from the function.
|
||||
var Migrators = {
|
||||
/*
|
||||
* Updates the DB schema to v3 (bug 506402).
|
||||
* Adds deleted form history table.
|
||||
*/
|
||||
dbMigrateToVersion4: function dbMigrateToVersion4() {
|
||||
if (!_dbConnection.tableExists("moz_deleted_formhistory")) {
|
||||
let table = dbSchema.tables["moz_deleted_formhistory"];
|
||||
let tSQL = [[col, table[col]].join(" ") for (col in table)].join(", ");
|
||||
_dbConnection.createTable("moz_deleted_formhistory", tSQL);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* dbAreExpectedColumnsPresent
|
||||
@ -586,6 +622,11 @@ function updateFormHistoryWrite(aChanges, aCallbacks) {
|
||||
switch (operation) {
|
||||
case "remove":
|
||||
log("Remove from form history " + change);
|
||||
let delStmt = makeMoveToDeletedStatement(change.guid, now, change, bindingArrays);
|
||||
if (delStmt && stmts.indexOf(delStmt) == -1)
|
||||
stmts.push(delStmt);
|
||||
if ("timeDeleted" in change)
|
||||
delete change.timeDeleted;
|
||||
stmt = makeRemoveStatement(change, bindingArrays);
|
||||
notifications.push([ "formhistory-remove", null ]);
|
||||
break;
|
||||
@ -1013,6 +1054,14 @@ const FormHistory = {
|
||||
return dbConnection.schemaVersion;
|
||||
},
|
||||
|
||||
// This is used only so that the test can verify deleted table support.
|
||||
get _supportsDeletedTable() {
|
||||
return supportsDeletedTable;
|
||||
},
|
||||
set _supportsDeletedTable(val) {
|
||||
supportsDeletedTable = val;
|
||||
},
|
||||
|
||||
// The remaining methods are called by FormHistoryStartup.js
|
||||
updatePrefs: function updatePrefs() {
|
||||
Prefs.initialized = false;
|
||||
|
@ -35,8 +35,11 @@ EXTRA_PP_COMPONENTS = \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_JS_MODULES = \
|
||||
FormHistory.jsm \
|
||||
nsFormAutoCompleteResult.jsm \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_PP_JS_MODULES = \
|
||||
FormHistory.jsm \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
@ -3,9 +3,17 @@
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
var testnum = 0;
|
||||
var fh;
|
||||
|
||||
let iter;
|
||||
|
||||
function run_test()
|
||||
{
|
||||
do_test_pending();
|
||||
iter = next_test();
|
||||
iter.next();
|
||||
}
|
||||
|
||||
function next_test()
|
||||
{
|
||||
try {
|
||||
|
||||
@ -22,19 +30,29 @@ function run_test()
|
||||
testfile.copyTo(profileDir, "formhistory.sqlite");
|
||||
do_check_eq(3, getDBVersion(testfile));
|
||||
|
||||
fh = Cc["@mozilla.org/satchel/form-history;1"].
|
||||
getService(Ci.nsIFormHistory2);
|
||||
|
||||
|
||||
// ===== 1 =====
|
||||
testnum++;
|
||||
|
||||
// Check that the index was added
|
||||
do_check_true(fh.DBConnection.tableExists("moz_deleted_formhistory"));
|
||||
destFile = profileDir.clone();
|
||||
destFile.append("formhistory.sqlite");
|
||||
let dbConnection = Services.storage.openUnsharedDatabase(destFile);
|
||||
|
||||
// check for upgraded schema.
|
||||
do_check_eq(CURRENT_SCHEMA, fh.DBConnection.schemaVersion);
|
||||
do_check_eq(CURRENT_SCHEMA, FormHistory.schemaVersion);
|
||||
|
||||
// Check that the index was added
|
||||
do_check_true(dbConnection.tableExists("moz_deleted_formhistory"));
|
||||
dbConnection.close();
|
||||
|
||||
// check for upgraded schema.
|
||||
do_check_eq(CURRENT_SCHEMA, FormHistory.schemaVersion);
|
||||
// check that an entry still exists
|
||||
do_check_true(fh.entryExists("name-A", "value-A"));
|
||||
yield countEntries("name-A", "value-A",
|
||||
function (num) {
|
||||
do_check_true(num > 0);
|
||||
do_test_finished();
|
||||
}
|
||||
);
|
||||
|
||||
} catch (e) {
|
||||
throw "FAILED in test #" + testnum + " -- " + e;
|
||||
|
@ -3,9 +3,17 @@
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
var testnum = 0;
|
||||
var fh;
|
||||
|
||||
let iter;
|
||||
|
||||
function run_test()
|
||||
{
|
||||
do_test_pending();
|
||||
iter = next_test();
|
||||
iter.next();
|
||||
}
|
||||
|
||||
function next_test()
|
||||
{
|
||||
try {
|
||||
|
||||
@ -22,19 +30,27 @@ function run_test()
|
||||
testfile.copyTo(profileDir, "formhistory.sqlite");
|
||||
do_check_eq(3, getDBVersion(testfile));
|
||||
|
||||
fh = Cc["@mozilla.org/satchel/form-history;1"].
|
||||
getService(Ci.nsIFormHistory2);
|
||||
|
||||
|
||||
// ===== 1 =====
|
||||
testnum++;
|
||||
|
||||
// Check that the index was added
|
||||
do_check_true(fh.DBConnection.tableExists("moz_deleted_formhistory"));
|
||||
destFile = profileDir.clone();
|
||||
destFile.append("formhistory.sqlite");
|
||||
dbConnection = Services.storage.openUnsharedDatabase(destFile);
|
||||
|
||||
// check for upgraded schema.
|
||||
do_check_eq(CURRENT_SCHEMA, fh.DBConnection.schemaVersion);
|
||||
do_check_eq(CURRENT_SCHEMA, FormHistory.schemaVersion);
|
||||
|
||||
// Check that the index was added
|
||||
do_check_true(dbConnection.tableExists("moz_deleted_formhistory"));
|
||||
dbConnection.close();
|
||||
|
||||
// check that an entry still exists
|
||||
do_check_true(fh.entryExists("name-A", "value-A"));
|
||||
yield countEntries("name-A", "value-A",
|
||||
function (num) {
|
||||
do_check_true(num > 0);
|
||||
do_test_finished();
|
||||
}
|
||||
);
|
||||
|
||||
} catch (e) {
|
||||
throw "FAILED in test #" + testnum + " -- " + e;
|
||||
|
Loading…
Reference in New Issue
Block a user