| Index: components/offline_pages/core/background/request_queue_store_sql.cc
|
| diff --git a/components/offline_pages/core/background/request_queue_store_sql.cc b/components/offline_pages/core/background/request_queue_store_sql.cc
|
| index 5e5672a595fc1cc2765463c8c8cc905a35c544e0..099f774180f61ad384ae829e21623ab7d434421f 100644
|
| --- a/components/offline_pages/core/background/request_queue_store_sql.cc
|
| +++ b/components/offline_pages/core/background/request_queue_store_sql.cc
|
| @@ -42,26 +42,63 @@ bool CreateRequestQueueTable(sql::Connection* db) {
|
| " state INTEGER NOT NULL DEFAULT 0,"
|
| " url VARCHAR NOT NULL,"
|
| " client_namespace VARCHAR NOT NULL,"
|
| - " client_id VARCHAR NOT NULL"
|
| + " client_id VARCHAR NOT NULL,"
|
| + " original_url VARCHAR NOT NULL DEFAULT ''"
|
| ")";
|
| return db->Execute(kSql);
|
| }
|
|
|
| +bool UpgradeWithQuery(sql::Connection* db, const char* upgrade_sql) {
|
| + if (!db->Execute("ALTER TABLE " REQUEST_QUEUE_TABLE_NAME
|
| + " RENAME TO temp_" REQUEST_QUEUE_TABLE_NAME)) {
|
| + return false;
|
| + }
|
| + if (!CreateRequestQueueTable(db))
|
| + return false;
|
| + if (!db->Execute(upgrade_sql))
|
| + return false;
|
| + return db->Execute("DROP TABLE IF EXISTS temp_" REQUEST_QUEUE_TABLE_NAME);
|
| +}
|
| +
|
| +bool UpgradeFrom57(sql::Connection* db) {
|
| + const char kSql[] =
|
| + "INSERT INTO " REQUEST_QUEUE_TABLE_NAME
|
| + " (request_id, creation_time, activation_time, last_attempt_time, "
|
| + "started_attempt_count, completed_attempt_count, state, url, "
|
| + "client_namespace, client_id) "
|
| + "SELECT "
|
| + "request_id, creation_time, activation_time, last_attempt_time, "
|
| + "started_attempt_count, completed_attempt_count, state, url, "
|
| + "client_namespace, client_id "
|
| + "FROM temp_" REQUEST_QUEUE_TABLE_NAME;
|
| + return UpgradeWithQuery(db, kSql);
|
| +}
|
| +
|
| bool CreateSchema(sql::Connection* db) {
|
| + sql::Transaction transaction(db);
|
| + if (!transaction.Begin())
|
| + return false;
|
| +
|
| + if (!db->DoesTableExist(REQUEST_QUEUE_TABLE_NAME)) {
|
| + if (!CreateRequestQueueTable(db))
|
| + return false;
|
| + }
|
| +
|
| // If there is not already a state column, we need to drop the old table. We
|
| // are choosing to drop instead of upgrade since the feature is not yet
|
| - // released, so we don't use a transaction to protect existing data, or try to
|
| - // migrate it.
|
| + // released, so we don't try to migrate it.
|
| if (!db->DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "state")) {
|
| if (!db->Execute("DROP TABLE IF EXISTS " REQUEST_QUEUE_TABLE_NAME))
|
| return false;
|
| }
|
|
|
| - if (!CreateRequestQueueTable(db))
|
| - return false;
|
| + if (!db->DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "original_url")) {
|
| + if (!UpgradeFrom57(db))
|
| + return false;
|
| + }
|
|
|
| // TODO(fgorski): Add indices here.
|
| - return true;
|
| + return transaction.Commit();
|
| }
|
|
|
| // Create a save page request from a SQL result. Expects complete rows with
|
| @@ -83,11 +120,12 @@ std::unique_ptr<SavePageRequest> MakeSavePageRequest(
|
| const GURL url(statement.ColumnString(7));
|
| const ClientId client_id(statement.ColumnString(8),
|
| statement.ColumnString(9));
|
| + const GURL original_url(statement.ColumnString(10));
|
|
|
| DVLOG(2) << "making save page request - id " << id << " url " << url
|
| << " client_id " << client_id.name_space << "-" << client_id.id
|
| << " creation time " << creation_time << " user requested "
|
| - << kUserRequested;
|
| + << kUserRequested << " original_url " << original_url;
|
|
|
| std::unique_ptr<SavePageRequest> request(new SavePageRequest(
|
| id, url, client_id, creation_time, activation_time, kUserRequested));
|
| @@ -95,6 +133,7 @@ std::unique_ptr<SavePageRequest> MakeSavePageRequest(
|
| request->set_started_attempt_count(started_attempt_count);
|
| request->set_completed_attempt_count(completed_attempt_count);
|
| request->set_request_state(state);
|
| + request->set_original_url(original_url);
|
| return request;
|
| }
|
|
|
| @@ -104,7 +143,7 @@ std::unique_ptr<SavePageRequest> GetOneRequest(sql::Connection* db,
|
| const char kSql[] =
|
| "SELECT request_id, creation_time, activation_time,"
|
| " last_attempt_time, started_attempt_count, completed_attempt_count,"
|
| - " state, url, client_namespace, client_id"
|
| + " state, url, client_namespace, client_id, original_url"
|
| " FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?";
|
|
|
| sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
|
| @@ -132,9 +171,9 @@ ItemActionStatus Insert(sql::Connection* db, const SavePageRequest& request) {
|
| "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME
|
| " (request_id, creation_time, activation_time,"
|
| " last_attempt_time, started_attempt_count, completed_attempt_count,"
|
| - " state, url, client_namespace, client_id)"
|
| + " state, url, client_namespace, client_id, original_url)"
|
| " VALUES "
|
| - " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
| + " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
|
|
| sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
|
| statement.BindInt64(0, request.request_id());
|
| @@ -147,6 +186,7 @@ ItemActionStatus Insert(sql::Connection* db, const SavePageRequest& request) {
|
| statement.BindString(7, request.url().spec());
|
| statement.BindString(8, request.client_id().name_space);
|
| statement.BindString(9, request.client_id().id);
|
| + statement.BindString(10, request.original_url().spec());
|
|
|
| if (!statement.Run())
|
| return ItemActionStatus::STORE_ERROR;
|
| @@ -160,7 +200,7 @@ ItemActionStatus Update(sql::Connection* db, const SavePageRequest& request) {
|
| "UPDATE OR IGNORE " REQUEST_QUEUE_TABLE_NAME
|
| " SET creation_time = ?, activation_time = ?, last_attempt_time = ?,"
|
| " started_attempt_count = ?, completed_attempt_count = ?, state = ?,"
|
| - " url = ?, client_namespace = ?, client_id = ?"
|
| + " url = ?, client_namespace = ?, client_id = ?, original_url = ?"
|
| " WHERE request_id = ?";
|
|
|
| sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
|
| @@ -173,7 +213,8 @@ ItemActionStatus Update(sql::Connection* db, const SavePageRequest& request) {
|
| statement.BindString(6, request.url().spec());
|
| statement.BindString(7, request.client_id().name_space);
|
| statement.BindString(8, request.client_id().id);
|
| - statement.BindInt64(9, request.request_id());
|
| + statement.BindString(9, request.original_url().spec());
|
| + statement.BindInt64(10, request.request_id());
|
|
|
| if (!statement.Run())
|
| return ItemActionStatus::STORE_ERROR;
|
| @@ -236,7 +277,7 @@ void GetRequestsSync(sql::Connection* db,
|
| const char kSql[] =
|
| "SELECT request_id, creation_time, activation_time,"
|
| " last_attempt_time, started_attempt_count, completed_attempt_count,"
|
| - " state, url, client_namespace, client_id"
|
| + " state, url, client_namespace, client_id, original_url"
|
| " FROM " REQUEST_QUEUE_TABLE_NAME;
|
|
|
| sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
|
|
|