| Index: chrome/browser/history/download_database.cc
|
| diff --git a/chrome/browser/history/download_database.cc b/chrome/browser/history/download_database.cc
|
| index ae63f63273c142a93c8f34b7e64eefeca8410d57..4fa418e1b5cbaf33389a074d3244fa46c303d346 100644
|
| --- a/chrome/browser/history/download_database.cc
|
| +++ b/chrome/browser/history/download_database.cc
|
| @@ -38,35 +38,6 @@ enum DroppedReason {
|
| DROPPED_REASON_MAX
|
| };
|
|
|
| -static const char kSchema[] =
|
| - "CREATE TABLE downloads ("
|
| - "id INTEGER PRIMARY KEY," // Primary key.
|
| - "current_path LONGVARCHAR NOT NULL," // Current disk location
|
| - "target_path LONGVARCHAR NOT NULL," // Final disk location
|
| - "start_time INTEGER NOT NULL," // When the download was started.
|
| - "received_bytes INTEGER NOT NULL," // Total size downloaded.
|
| - "total_bytes INTEGER NOT NULL," // Total size of the download.
|
| - "state INTEGER NOT NULL," // 1=complete, 4=interrupted
|
| - "danger_type INTEGER NOT NULL, " // Danger type, validated.
|
| - "interrupt_reason INTEGER NOT NULL," // content::DownloadInterruptReason
|
| - "end_time INTEGER NOT NULL," // When the download completed.
|
| - "opened INTEGER NOT NULL," // 1 if it has ever been opened else 0
|
| - "referrer VARCHAR NOT NULL," // HTTP Referrer
|
| - "by_ext_id VARCHAR NOT NULL," // ID of extension that started the
|
| - // download
|
| - "by_ext_name VARCHAR NOT NULL," // name of extension
|
| - "etag VARCHAR NOT NULL," // ETag
|
| - "last_modified VARCHAR NOT NULL)"; // Last-Modified header
|
| -
|
| -static const char kUrlChainSchema[] =
|
| - "CREATE TABLE downloads_url_chains ("
|
| - "id INTEGER NOT NULL," // downloads.id.
|
| - "chain_index INTEGER NOT NULL," // Index of url in chain
|
| - // 0 is initial target,
|
| - // MAX is target after redirects.
|
| - "url LONGVARCHAR NOT NULL, " // URL.
|
| - "PRIMARY KEY (id, chain_index) )";
|
| -
|
| #if defined(OS_POSIX)
|
|
|
| // Binds/reads the given file path to the given column of the given statement.
|
| @@ -213,6 +184,13 @@ bool DownloadDatabase::EnsureColumnExists(
|
| GetDB().Execute(add_col.c_str());
|
| }
|
|
|
| +bool DownloadDatabase::MigrateMimeType() {
|
| + return EnsureColumnExists("mime_type", "VARCHAR(255) NOT NULL"
|
| + " DEFAULT \"\"") &&
|
| + EnsureColumnExists("original_mime_type", "VARCHAR(255) NOT NULL"
|
| + " DEFAULT \"\"");
|
| +}
|
| +
|
| bool DownloadDatabase::MigrateDownloadsState() {
|
| sql::Statement statement(GetDB().GetUniqueStatement(
|
| "UPDATE downloads SET state=? WHERE state=?"));
|
| @@ -227,8 +205,32 @@ bool DownloadDatabase::MigrateDownloadsReasonPathsAndDangerType() {
|
| if (!GetDB().Execute("ALTER TABLE downloads RENAME TO downloads_tmp"))
|
| return false;
|
|
|
| + const char kReasonPathDangerSchema[] =
|
| + "CREATE TABLE downloads ("
|
| + "id INTEGER PRIMARY KEY,"
|
| + "current_path LONGVARCHAR NOT NULL,"
|
| + "target_path LONGVARCHAR NOT NULL,"
|
| + "start_time INTEGER NOT NULL,"
|
| + "received_bytes INTEGER NOT NULL,"
|
| + "total_bytes INTEGER NOT NULL,"
|
| + "state INTEGER NOT NULL,"
|
| + "danger_type INTEGER NOT NULL,"
|
| + "interrupt_reason INTEGER NOT NULL,"
|
| + "end_time INTEGER NOT NULL,"
|
| + "opened INTEGER NOT NULL)";
|
| +
|
| + static const char kReasonPathDangerUrlChainSchema[] =
|
| + "CREATE TABLE downloads_url_chains ("
|
| + "id INTEGER NOT NULL," // downloads.id.
|
| + "chain_index INTEGER NOT NULL," // Index of url in chain
|
| + // 0 is initial target,
|
| + // MAX is target after redirects.
|
| + "url LONGVARCHAR NOT NULL, " // URL.
|
| + "PRIMARY KEY (id, chain_index) )";
|
| +
|
| +
|
| // Recreate main table.
|
| - if (!GetDB().Execute(kSchema))
|
| + if (!GetDB().Execute(kReasonPathDangerSchema))
|
| return false;
|
|
|
| // Populate it. As we do so, we transform the time values from time_t
|
| @@ -238,8 +240,7 @@ bool DownloadDatabase::MigrateDownloadsReasonPathsAndDangerType() {
|
| sql::Statement statement_populate(GetDB().GetUniqueStatement(
|
| "INSERT INTO downloads "
|
| "( id, current_path, target_path, start_time, received_bytes, "
|
| - " total_bytes, state, danger_type, interrupt_reason, end_time, opened, "
|
| - " referrer, by_ext_id, by_ext_name, etag, last_modified ) "
|
| + " total_bytes, state, danger_type, interrupt_reason, end_time, opened ) "
|
| "SELECT id, full_path, full_path, "
|
| " CASE start_time WHEN 0 THEN 0 ELSE "
|
| " (start_time + 11644473600) * 1000000 END, "
|
| @@ -247,7 +248,7 @@ bool DownloadDatabase::MigrateDownloadsReasonPathsAndDangerType() {
|
| " state, ?, ?, "
|
| " CASE end_time WHEN 0 THEN 0 ELSE "
|
| " (end_time + 11644473600) * 1000000 END, "
|
| - " opened, \"\", \"\", \"\", \"\", \"\" "
|
| + " opened "
|
| "FROM downloads_tmp"));
|
| statement_populate.BindInt(0, content::DOWNLOAD_INTERRUPT_REASON_NONE);
|
| statement_populate.BindInt(1, kDangerTypeNotDangerous);
|
| @@ -255,7 +256,7 @@ bool DownloadDatabase::MigrateDownloadsReasonPathsAndDangerType() {
|
| return false;
|
|
|
| // Create new chain table and populate it.
|
| - if (!GetDB().Execute(kUrlChainSchema))
|
| + if (!GetDB().Execute(kReasonPathDangerUrlChainSchema))
|
| return false;
|
|
|
| if (!GetDB().Execute("INSERT INTO downloads_url_chains "
|
| @@ -285,6 +286,38 @@ bool DownloadDatabase::MigrateDownloadValidators() {
|
| }
|
|
|
| bool DownloadDatabase::InitDownloadTable() {
|
| + const char kSchema[] =
|
| + "CREATE TABLE downloads ("
|
| + "id INTEGER PRIMARY KEY," // Primary key.
|
| + "current_path LONGVARCHAR NOT NULL," // Current disk location
|
| + "target_path LONGVARCHAR NOT NULL," // Final disk location
|
| + "start_time INTEGER NOT NULL," // When the download was started.
|
| + "received_bytes INTEGER NOT NULL," // Total size downloaded.
|
| + "total_bytes INTEGER NOT NULL," // Total size of the download.
|
| + "state INTEGER NOT NULL," // 1=complete, 4=interrupted
|
| + "danger_type INTEGER NOT NULL," // Danger type, validated.
|
| + "interrupt_reason INTEGER NOT NULL," // content::DownloadInterruptReason
|
| + "end_time INTEGER NOT NULL," // When the download completed.
|
| + "opened INTEGER NOT NULL," // 1 if it has ever been opened
|
| + // else 0
|
| + "referrer VARCHAR NOT NULL," // HTTP Referrer
|
| + "by_ext_id VARCHAR NOT NULL," // ID of extension that started the
|
| + // download
|
| + "by_ext_name VARCHAR NOT NULL," // name of extension
|
| + "etag VARCHAR NOT NULL," // ETag
|
| + "last_modified VARCHAR NOT NULL," // Last-Modified header
|
| + "mime_type VARCHAR(255) NOT NULL," // MIME type.
|
| + "original_mime_type VARCHAR(255) NOT NULL)"; // Original MIME type.
|
| +
|
| + const char kUrlChainSchema[] =
|
| + "CREATE TABLE downloads_url_chains ("
|
| + "id INTEGER NOT NULL," // downloads.id.
|
| + "chain_index INTEGER NOT NULL," // Index of url in chain
|
| + // 0 is initial target,
|
| + // MAX is target after redirects.
|
| + "url LONGVARCHAR NOT NULL, " // URL.
|
| + "PRIMARY KEY (id, chain_index) )";
|
| +
|
| if (GetDB().DoesTableExist("downloads")) {
|
| return EnsureColumnExists("end_time", "INTEGER NOT NULL DEFAULT 0") &&
|
| EnsureColumnExists("opened", "INTEGER NOT NULL DEFAULT 0");
|
| @@ -327,7 +360,9 @@ void DownloadDatabase::QueryDownloads(
|
| std::map<uint32, DownloadRow*> info_map;
|
|
|
| sql::Statement statement_main(GetDB().GetCachedStatement(SQL_FROM_HERE,
|
| - "SELECT id, current_path, target_path, start_time, received_bytes, "
|
| + "SELECT id, current_path, target_path, "
|
| + "mime_type, original_mime_type, "
|
| + "start_time, received_bytes, "
|
| "total_bytes, state, danger_type, interrupt_reason, end_time, opened, "
|
| "referrer, by_ext_id, by_ext_name, etag, last_modified "
|
| "FROM downloads ORDER BY start_time"));
|
| @@ -343,6 +378,8 @@ void DownloadDatabase::QueryDownloads(
|
| info->id = static_cast<uint32>(signed_id);
|
| info->current_path = ColumnFilePath(statement_main, column++);
|
| info->target_path = ColumnFilePath(statement_main, column++);
|
| + info->mime_type = statement_main.ColumnString(column++);
|
| + info->original_mime_type = statement_main.ColumnString(column++);
|
| info->start_time = base::Time::FromInternalValue(
|
| statement_main.ColumnInt64(column++));
|
| info->received_bytes = statement_main.ColumnInt64(column++);
|
| @@ -463,13 +500,17 @@ bool DownloadDatabase::UpdateDownload(const DownloadRow& data) {
|
|
|
| sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
|
| "UPDATE downloads "
|
| - "SET current_path=?, target_path=?, received_bytes=?, state=?, "
|
| + "SET current_path=?, target_path=?, "
|
| + "mime_type=?, original_mime_type=?, "
|
| + "received_bytes=?, state=?, "
|
| "danger_type=?, interrupt_reason=?, end_time=?, total_bytes=?, "
|
| "opened=?, by_ext_id=?, by_ext_name=?, etag=?, last_modified=? "
|
| "WHERE id=?"));
|
| int column = 0;
|
| BindFilePath(statement, data.current_path, column++);
|
| BindFilePath(statement, data.target_path, column++);
|
| + statement.BindString(column++, data.mime_type);
|
| + statement.BindString(column++, data.original_mime_type);
|
| statement.BindInt64(column++, data.received_bytes);
|
| statement.BindInt(column++, state);
|
| statement.BindInt(column++, danger_type);
|
| @@ -519,16 +560,20 @@ bool DownloadDatabase::CreateDownload(const DownloadRow& info) {
|
| sql::Statement statement_insert(GetDB().GetCachedStatement(
|
| SQL_FROM_HERE,
|
| "INSERT INTO downloads "
|
| - "(id, current_path, target_path, start_time, "
|
| + "(id, current_path, target_path, "
|
| + " mime_type, original_mime_type, "
|
| + " start_time, "
|
| " received_bytes, total_bytes, state, danger_type, interrupt_reason, "
|
| " end_time, opened, referrer, by_ext_id, by_ext_name, etag, "
|
| " last_modified) "
|
| - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
|
| + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
|
|
|
| int column = 0;
|
| statement_insert.BindInt(column++, info.id);
|
| BindFilePath(statement_insert, info.current_path, column++);
|
| BindFilePath(statement_insert, info.target_path, column++);
|
| + statement_insert.BindString(column++, info.mime_type);
|
| + statement_insert.BindString(column++, info.original_mime_type);
|
| statement_insert.BindInt64(column++, info.start_time.ToInternalValue());
|
| statement_insert.BindInt64(column++, info.received_bytes);
|
| statement_insert.BindInt64(column++, info.total_bytes);
|
|
|