Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11228)

Unified Diff: chrome/browser/history/download_database.cc

Issue 10915180: Make DownloadHistory observe manager, items (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/history/download_database.cc
diff --git a/chrome/browser/history/download_database.cc b/chrome/browser/history/download_database.cc
index c9881156db31829652ffccc9ffd972e32777b381..fd1b8513a315134fdfc0ba34366a247a41e74958 100644
--- a/chrome/browser/history/download_database.cc
+++ b/chrome/browser/history/download_database.cc
@@ -14,16 +14,17 @@
#include "base/time.h"
#include "base/utf_string_conversions.h"
#include "build/build_config.h"
+#include "chrome/browser/history/download_persistent_store_info.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/download_item.h"
-#include "content/public/browser/download_persistent_store_info.h"
#include "sql/statement.h"
using content::DownloadItem;
-using content::DownloadPersistentStoreInfo;
namespace history {
+const int64 DownloadDatabase::kUninitializedHandle = -1;
+
namespace {
static const char kSchema[] =
@@ -112,15 +113,6 @@ DownloadDatabase::DownloadDatabase()
DownloadDatabase::~DownloadDatabase() {
}
-void DownloadDatabase::CheckThread() {
- if (owning_thread_set_) {
- DCHECK(owning_thread_ == base::PlatformThread::CurrentId());
- } else {
- owning_thread_ = base::PlatformThread::CurrentId();
- owning_thread_set_ = true;
- }
-}
-
bool DownloadDatabase::EnsureColumnExists(
const std::string& name, const std::string& type) {
std::string add_col = "ALTER TABLE downloads ADD COLUMN " + name + " " + type;
@@ -137,7 +129,6 @@ bool DownloadDatabase::MigrateDownloadsState() {
}
bool DownloadDatabase::InitDownloadTable() {
- CheckThread();
GetMetaTable().GetValue(kNextDownloadId, &next_id_);
if (GetDB().DoesTableExist("downloads")) {
return EnsureColumnExists("end_time", "INTEGER NOT NULL DEFAULT 0") &&
@@ -148,13 +139,11 @@ bool DownloadDatabase::InitDownloadTable() {
}
bool DownloadDatabase::DropDownloadTable() {
- CheckThread();
return GetDB().Execute("DROP TABLE downloads");
}
void DownloadDatabase::QueryDownloads(
std::vector<DownloadPersistentStoreInfo>* results) {
- CheckThread();
results->clear();
if (next_db_handle_ < 1)
next_db_handle_ = 1;
@@ -194,7 +183,6 @@ void DownloadDatabase::QueryDownloads(
}
bool DownloadDatabase::UpdateDownload(const DownloadPersistentStoreInfo& data) {
- CheckThread();
DCHECK(data.db_handle > 0);
int state = StateToInt(data.state);
if (state == kStateInvalid) {
@@ -203,30 +191,20 @@ bool DownloadDatabase::UpdateDownload(const DownloadPersistentStoreInfo& data) {
}
sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
"UPDATE downloads "
- "SET received_bytes=?, state=?, end_time=?, opened=? WHERE id=?"));
- statement.BindInt64(0, data.received_bytes);
- statement.BindInt(1, state);
- statement.BindInt64(2, data.end_time.ToTimeT());
- statement.BindInt(3, (data.opened ? 1 : 0));
- statement.BindInt64(4, data.db_handle);
-
- return statement.Run();
-}
-
-bool DownloadDatabase::UpdateDownloadPath(const FilePath& path,
- DownloadID db_handle) {
- CheckThread();
- DCHECK(db_handle > 0);
- sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
- "UPDATE downloads SET full_path=? WHERE id=?"));
- BindFilePath(statement, path, 0);
- statement.BindInt64(1, db_handle);
+ "SET full_path=?, received_bytes=?, state=?, end_time=?, total_bytes=?, "
+ "opened=? WHERE id=?"));
+ BindFilePath(statement, data.path, 0);
+ statement.BindInt64(1, data.received_bytes);
+ statement.BindInt(2, state);
+ statement.BindInt64(3, data.end_time.ToTimeT());
+ statement.BindInt(4, data.total_bytes);
+ statement.BindInt(5, (data.opened ? 1 : 0));
+ statement.BindInt64(6, data.db_handle);
return statement.Run();
}
bool DownloadDatabase::CleanUpInProgressEntries() {
- CheckThread();
sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
"UPDATE downloads SET state=? WHERE state=?"));
statement.BindInt(0, kStateCancelled);
@@ -237,7 +215,6 @@ bool DownloadDatabase::CleanUpInProgressEntries() {
int64 DownloadDatabase::CreateDownload(
const DownloadPersistentStoreInfo& info) {
- CheckThread();
if (next_db_handle_ == 0) {
// This is unlikely. All current known tests and users already call
@@ -278,60 +255,21 @@ int64 DownloadDatabase::CreateDownload(
return 0;
}
-void DownloadDatabase::RemoveDownload(DownloadID db_handle) {
- CheckThread();
-
- sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
- "DELETE FROM downloads WHERE id=?"));
- statement.BindInt64(0, db_handle);
-
- statement.Run();
-}
-
-bool DownloadDatabase::RemoveDownloadsBetween(base::Time delete_begin,
- base::Time delete_end) {
- CheckThread();
- time_t start_time = delete_begin.ToTimeT();
- time_t end_time = delete_end.ToTimeT();
-
- int num_downloads_deleted = -1;
- {
- sql::Statement count(GetDB().GetCachedStatement(SQL_FROM_HERE,
- "SELECT count(*) FROM downloads WHERE start_time >= ? "
- "AND start_time < ? AND (State = ? OR State = ? OR State = ?)"));
- count.BindInt64(0, start_time);
- count.BindInt64(
- 1,
- end_time ? end_time : std::numeric_limits<int64>::max());
- count.BindInt(2, kStateComplete);
- count.BindInt(3, kStateCancelled);
- count.BindInt(4, kStateInterrupted);
- if (count.Step())
- num_downloads_deleted = count.ColumnInt(0);
- }
-
-
- bool success = false;
+void DownloadDatabase::RemoveDownloads(const std::set<DownloadID>& handles) {
+ int downloads_count_before = CountDownloads();
base::TimeTicks started_removing = base::TimeTicks::Now();
- {
- // This does not use an index. We currently aren't likely to have enough
- // downloads where an index by time will give us a lot of benefit.
+ // HistoryBackend uses a long-running Transaction that is committed
+ // periodically, so this loop doesn't actually hit the disk too hard.
+ for (std::set<DownloadID>::const_iterator it = handles.begin();
+ it != handles.end(); ++it) {
sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
- "DELETE FROM downloads WHERE start_time >= ? AND start_time < ? "
- "AND (State = ? OR State = ? OR State = ?)"));
- statement.BindInt64(0, start_time);
- statement.BindInt64(
- 1,
- end_time ? end_time : std::numeric_limits<int64>::max());
- statement.BindInt(2, kStateComplete);
- statement.BindInt(3, kStateCancelled);
- statement.BindInt(4, kStateInterrupted);
-
- success = statement.Run();
+ "DELETE FROM downloads WHERE id=?"));
+ statement.BindInt64(0, *it);
+ statement.Run();
}
-
base::TimeTicks finished_removing = base::TimeTicks::Now();
-
+ int downloads_count_after = CountDownloads();
+ int num_downloads_deleted = downloads_count_before - downloads_count_after;
if (num_downloads_deleted >= 0) {
UMA_HISTOGRAM_COUNTS("Download.DatabaseRemoveDownloadsCount",
num_downloads_deleted);
@@ -342,8 +280,18 @@ bool DownloadDatabase::RemoveDownloadsBetween(base::Time delete_begin,
(1000 * micros) / num_downloads_deleted);
}
}
+ int num_downloads_not_deleted = handles.size() - num_downloads_deleted;
+ if (num_downloads_not_deleted >= 0) {
+ UMA_HISTOGRAM_COUNTS("Download.DatabaseRemoveDownloadsCountNotRemoved",
+ num_downloads_not_deleted);
+ }
+}
- return success;
+int DownloadDatabase::CountDownloads() {
+ sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
+ "SELECT count(*) from downloads"));
+ statement.Step();
+ return statement.ColumnInt(0);
}
} // namespace history

Powered by Google App Engine
This is Rietveld 408576698