From 68ee91d91b1c6fcee401b5e443ac50153aa8a2ad Mon Sep 17 00:00:00 2001 From: "edward.lee%engineering.uiuc.edu" Date: Sun, 7 Oct 2007 16:15:32 +0000 Subject: [PATCH] Bug 384810 - DM should restore the database state gracefully after a crash. r=sdwilsh, a=mconnor git-svn-id: svn://10.0.0.236/trunk@237372 18797224-902f-48f8-a5cc-f745e15eee43 --- .../downloads/src/nsDownloadManager.cpp | 18 +++++++++++------- .../downloads/src/nsDownloadManager.h | 5 +++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp b/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp index 1f7c324270a..7341fb0cae4 100644 --- a/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp +++ b/mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp @@ -592,6 +592,9 @@ nsDownloadManager::RestoreDatabaseState() rv = stmt->BindInt32Parameter(i++, nsIDownloadManager::DOWNLOAD_DOWNLOADING); NS_ENSURE_SUCCESS(rv, rv); + rv = stmt->Execute(); + NS_ENSURE_SUCCESS(rv, rv); + // Finally, let's retry all of those downloads for (nsTArray::size_type i = 0; i < ids.Length(); i++) (void)RetryDownload(ids[i]); @@ -697,12 +700,6 @@ nsDownloadManager::Init() if (doImport) ImportDownloadHistory(); - rv = RestoreDatabaseState(); - NS_ENSURE_SUCCESS(rv, rv); - - rv = RestoreActiveDownloads(); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr bundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); @@ -729,6 +726,14 @@ nsDownloadManager::Init() "WHERE id = ?8"), getter_AddRefs(mUpdateDownloadStatement)); NS_ENSURE_SUCCESS(rv, rv); + // Do things *after* initializing various download manager properties such as + // restoring downloads to a consistent state + rv = RestoreDatabaseState(); + NS_ENSURE_SUCCESS(rv, rv); + + rv = RestoreActiveDownloads(); + NS_ENSURE_SUCCESS(rv, rv); + // The following three AddObserver calls must be the last lines in this function, // because otherwise, this function may fail (and thus, this object would be not // completely initialized), but the observerservice would still keep a reference @@ -738,7 +743,6 @@ nsDownloadManager::Init() // These observers will be cleaned up automatically at app shutdown. We do // not bother explicitly breaking the observers because we are a singleton // that lives for the duration of the app. - // mObserverService->AddObserver(this, "quit-application", PR_FALSE); mObserverService->AddObserver(this, "quit-application-requested", PR_FALSE); mObserverService->AddObserver(this, "offline-requested", PR_FALSE); diff --git a/mozilla/toolkit/components/downloads/src/nsDownloadManager.h b/mozilla/toolkit/components/downloads/src/nsDownloadManager.h index 4d603c5d26c..8285c3894f9 100644 --- a/mozilla/toolkit/components/downloads/src/nsDownloadManager.h +++ b/mozilla/toolkit/components/downloads/src/nsDownloadManager.h @@ -99,6 +99,11 @@ protected: nsresult InitDB(PRBool *aDoImport); nsresult CreateTable(); nsresult ImportDownloadHistory(); + + /** + * Fix up the database after a crash such as dealing with previously-active + * downloads. + */ nsresult RestoreDatabaseState(); /**