| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" | 5 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/metrics/histogram_macros.h" | 14 #include "base/metrics/histogram_macros.h" |
| 15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 17 #include "sql/meta_table.h" | 17 #include "sql/meta_table.h" |
| 18 #include "sql/statement.h" | 18 #include "sql/statement.h" |
| 19 #include "sql/transaction.h" | 19 #include "sql/transaction.h" |
| 20 | 20 |
| 21 using content::BrowserThread; | 21 using content::BrowserThread; |
| 22 using sql::Statement; | 22 using sql::Statement; |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 using ResourceRow = predictors::ResourcePrefetchPredictorTables::ResourceRow; | 26 using ResourceRow = predictors::ResourcePrefetchPredictorTables::ResourceRow; |
| 27 using RedirectRow = predictors::ResourcePrefetchPredictorTables::RedirectRow; |
| 28 using RedirectData = predictors::ResourcePrefetchPredictorTables::RedirectData; |
| 27 | 29 |
| 28 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; | 30 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; |
| 29 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; | 31 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url_resource"; |
| 30 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; | 32 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; |
| 31 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; | 33 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; |
| 34 const char kHostResourceTableName[] = |
| 35 "resource_prefetch_predictor_host_resource"; |
| 32 const char kHostMetadataTableName[] = | 36 const char kHostMetadataTableName[] = |
| 33 "resource_prefetch_predictor_host_metadata"; | 37 "resource_prefetch_predictor_host_metadata"; |
| 38 const char kHostRedirectTableName[] = |
| 39 "resource_prefetch_predictor_host_redirect"; |
| 34 | 40 |
| 35 const char kCreateGlobalMetadataStatementTemplate[] = | 41 const char kCreateGlobalMetadataStatementTemplate[] = |
| 36 "CREATE TABLE %s ( " | 42 "CREATE TABLE %s ( " |
| 37 "key TEXT, value INTEGER, " | 43 "key TEXT, value INTEGER, " |
| 38 "PRIMARY KEY (key))"; | 44 "PRIMARY KEY (key))"; |
| 39 const char kCreateResourceTableStatementTemplate[] = | 45 const char kCreateResourceTableStatementTemplate[] = |
| 40 "CREATE TABLE %s ( " | 46 "CREATE TABLE %s ( " |
| 41 "main_page_url TEXT, " | 47 "main_page_url TEXT, " |
| 42 "resource_url TEXT, " | 48 "resource_url TEXT, " |
| 43 "proto BLOB, " | 49 "proto BLOB, " |
| 44 "PRIMARY KEY(main_page_url, resource_url))"; | 50 "PRIMARY KEY(main_page_url, resource_url))"; |
| 45 const char kCreateMetadataTableStatementTemplate[] = | 51 const char kCreateMetadataTableStatementTemplate[] = |
| 46 "CREATE TABLE %s ( " | 52 "CREATE TABLE %s ( " |
| 47 "main_page_url TEXT, " | 53 "main_page_url TEXT, " |
| 48 "last_visit_time INTEGER, " | 54 "last_visit_time INTEGER, " |
| 49 "PRIMARY KEY(main_page_url))"; | 55 "PRIMARY KEY(main_page_url))"; |
| 56 const char kCreateRedirectTableStatementTemplate[] = |
| 57 "CREATE TABLE %s ( " |
| 58 "main_page_url TEXT, " |
| 59 "proto BLOB, " |
| 60 "PRIMARY KEY(main_page_url))"; |
| 50 | 61 |
| 51 const char kInsertResourceTableStatementTemplate[] = | 62 const char kInsertResourceTableStatementTemplate[] = |
| 52 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; | 63 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; |
| 64 const char kInsertRedirectTableStatementTemplate[] = |
| 65 "INSERT INTO %s (main_page_url, proto) VALUES (?,?)"; |
| 53 const char kInsertMetadataTableStatementTemplate[] = | 66 const char kInsertMetadataTableStatementTemplate[] = |
| 54 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; | 67 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; |
| 55 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; | 68 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; |
| 56 | 69 |
| 57 void BindResourceRowToStatement(const ResourceRow& row, | 70 void BindResourceRowToStatement(const ResourceRow& row, |
| 58 const std::string& primary_key, | 71 const std::string& primary_key, |
| 59 Statement* statement) { | 72 Statement* statement) { |
| 60 chrome_browser_predictors::ResourceData proto; | 73 chrome_browser_predictors::ResourceData proto; |
| 61 row.ToProto(&proto); | 74 row.ToProto(&proto); |
| 62 int size = proto.ByteSize(); | 75 int size = proto.ByteSize(); |
| 63 std::vector<char> proto_buffer(size); | 76 std::vector<char> proto_buffer(size); |
| 64 proto.SerializeToArray(&proto_buffer[0], size); | 77 proto.SerializeToArray(&proto_buffer[0], size); |
| 65 | 78 |
| 66 statement->BindString(0, primary_key); | 79 statement->BindString(0, primary_key); |
| 67 statement->BindString(1, row.resource_url.spec()); | 80 statement->BindString(1, row.resource_url.spec()); |
| 68 statement->BindBlob(2, &proto_buffer[0], size); | 81 statement->BindBlob(2, &proto_buffer[0], size); |
| 69 } | 82 } |
| 70 | 83 |
| 84 void BindRedirectDataToStatement(const RedirectData& data, |
| 85 Statement* statement) { |
| 86 chrome_browser_predictors::RedirectProto proto; |
| 87 data.ToProto(&proto); |
| 88 int size = proto.ByteSize(); |
| 89 std::vector<char> proto_buffer(size); |
| 90 proto.SerializeToArray(&proto_buffer[0], size); |
| 91 |
| 92 statement->BindString(0, data.primary_key); |
| 93 statement->BindBlob(1, &proto_buffer[0], size); |
| 94 } |
| 95 |
| 71 bool StepAndInitializeResourceRow(Statement* statement, | 96 bool StepAndInitializeResourceRow(Statement* statement, |
| 72 ResourceRow* row, | 97 ResourceRow* row, |
| 73 std::string* primary_key) { | 98 std::string* primary_key) { |
| 74 if (!statement->Step()) | 99 if (!statement->Step()) |
| 75 return false; | 100 return false; |
| 76 | 101 |
| 77 *primary_key = statement->ColumnString(0); | 102 *primary_key = statement->ColumnString(0); |
| 78 | 103 |
| 79 int size = statement->ColumnByteLength(2); | 104 int size = statement->ColumnByteLength(2); |
| 80 const void* data = statement->ColumnBlob(2); | 105 const void* data = statement->ColumnBlob(2); |
| 81 DCHECK(data); | 106 DCHECK(data); |
| 82 chrome_browser_predictors::ResourceData proto; | 107 chrome_browser_predictors::ResourceData proto; |
| 83 proto.ParseFromArray(data, size); | 108 proto.ParseFromArray(data, size); |
| 84 ResourceRow::FromProto(proto, row); | 109 ResourceRow::FromProto(proto, row); |
| 85 | 110 |
| 86 GURL resource_url(statement->ColumnString(1)); | 111 GURL resource_url(statement->ColumnString(1)); |
| 87 DCHECK(resource_url == row->resource_url); | 112 DCHECK(resource_url == row->resource_url); |
| 88 | 113 |
| 89 return true; | 114 return true; |
| 90 } | 115 } |
| 91 | 116 |
| 117 bool StepAndInitializeRedirectData(Statement* statement, |
| 118 RedirectData* redirect_data, |
| 119 std::string* primary_key) { |
| 120 if (!statement->Step()) |
| 121 return false; |
| 122 |
| 123 *primary_key = statement->ColumnString(0); |
| 124 redirect_data->primary_key = *primary_key; |
| 125 |
| 126 int size = statement->ColumnByteLength(1); |
| 127 const void* data = statement->ColumnBlob(1); |
| 128 DCHECK(data); |
| 129 chrome_browser_predictors::RedirectProto proto; |
| 130 proto.ParseFromArray(data, size); |
| 131 RedirectData::FromProto(proto, redirect_data); |
| 132 |
| 133 return true; |
| 134 } |
| 135 |
| 92 } // namespace | 136 } // namespace |
| 93 | 137 |
| 94 namespace predictors { | 138 namespace predictors { |
| 95 | 139 |
| 96 ResourceRow::ResourceRow() | 140 ResourceRow::ResourceRow() |
| 97 : resource_type(content::RESOURCE_TYPE_LAST_TYPE), | 141 : resource_type(content::RESOURCE_TYPE_LAST_TYPE), |
| 98 number_of_hits(0), | 142 number_of_hits(0), |
| 99 number_of_misses(0), | 143 number_of_misses(0), |
| 100 consecutive_misses(0), | 144 consecutive_misses(0), |
| 101 average_position(0.0), | 145 average_position(0.0), |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 return resource_url == rhs.resource_url && | 205 return resource_url == rhs.resource_url && |
| 162 resource_type == rhs.resource_type && | 206 resource_type == rhs.resource_type && |
| 163 number_of_hits == rhs.number_of_hits && | 207 number_of_hits == rhs.number_of_hits && |
| 164 number_of_misses == rhs.number_of_misses && | 208 number_of_misses == rhs.number_of_misses && |
| 165 consecutive_misses == rhs.consecutive_misses && | 209 consecutive_misses == rhs.consecutive_misses && |
| 166 average_position == rhs.average_position && priority == rhs.priority && | 210 average_position == rhs.average_position && priority == rhs.priority && |
| 167 has_validators == rhs.has_validators && | 211 has_validators == rhs.has_validators && |
| 168 always_revalidate == rhs.always_revalidate && score == rhs.score; | 212 always_revalidate == rhs.always_revalidate && score == rhs.score; |
| 169 } | 213 } |
| 170 | 214 |
| 215 // static |
| 216 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) { |
| 217 row->resource_url = GURL(proto.resource_url()); |
| 218 row->resource_type = |
| 219 static_cast<content::ResourceType>(proto.resource_type()); |
| 220 row->number_of_hits = proto.number_of_hits(); |
| 221 row->number_of_misses = proto.number_of_misses(); |
| 222 row->consecutive_misses = proto.consecutive_misses(); |
| 223 row->average_position = proto.average_position(); |
| 224 row->priority = static_cast<net::RequestPriority>(proto.priority()); |
| 225 row->has_validators = proto.has_validators(); |
| 226 row->always_revalidate = proto.always_revalidate(); |
| 227 row->UpdateScore(); |
| 228 } |
| 229 |
| 171 void ResourceRow::ToProto(ResourceData* resource_data) const { | 230 void ResourceRow::ToProto(ResourceData* resource_data) const { |
| 172 using chrome_browser_predictors::ResourceData_Priority; | 231 using chrome_browser_predictors::ResourceData_Priority; |
| 173 using chrome_browser_predictors::ResourceData_ResourceType; | 232 using chrome_browser_predictors::ResourceData_ResourceType; |
| 174 | 233 |
| 175 resource_data->set_resource_url(resource_url.spec()); | 234 resource_data->set_resource_url(resource_url.spec()); |
| 176 resource_data->set_resource_type( | 235 resource_data->set_resource_type( |
| 177 static_cast<ResourceData_ResourceType>(resource_type)); | 236 static_cast<ResourceData_ResourceType>(resource_type)); |
| 178 resource_data->set_number_of_hits(number_of_hits); | 237 resource_data->set_number_of_hits(number_of_hits); |
| 179 resource_data->set_number_of_misses(number_of_misses); | 238 resource_data->set_number_of_misses(number_of_misses); |
| 180 resource_data->set_consecutive_misses(consecutive_misses); | 239 resource_data->set_consecutive_misses(consecutive_misses); |
| 181 resource_data->set_average_position(average_position); | 240 resource_data->set_average_position(average_position); |
| 182 resource_data->set_priority(static_cast<ResourceData_Priority>(priority)); | 241 resource_data->set_priority(static_cast<ResourceData_Priority>(priority)); |
| 183 resource_data->set_has_validators(has_validators); | 242 resource_data->set_has_validators(has_validators); |
| 184 resource_data->set_always_revalidate(always_revalidate); | 243 resource_data->set_always_revalidate(always_revalidate); |
| 185 } | 244 } |
| 186 | 245 |
| 187 // static | 246 // static |
| 188 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) { | 247 void ResourcePrefetchPredictorTables::SortResourceRows( |
| 189 row->resource_url = GURL(proto.resource_url()); | 248 std::vector<ResourceRow>* rows) { |
| 190 row->resource_type = | |
| 191 static_cast<content::ResourceType>(proto.resource_type()); | |
| 192 row->number_of_hits = proto.number_of_hits(); | |
| 193 row->number_of_misses = proto.number_of_misses(); | |
| 194 row->consecutive_misses = proto.consecutive_misses(); | |
| 195 row->average_position = proto.average_position(); | |
| 196 row->priority = static_cast<net::RequestPriority>(proto.priority()); | |
| 197 row->has_validators = proto.has_validators(); | |
| 198 row->always_revalidate = proto.always_revalidate(); | |
| 199 row->UpdateScore(); | |
| 200 } | |
| 201 | |
| 202 // static | |
| 203 void ResourcePrefetchPredictorTables::SortResourceRows(ResourceRows* rows) { | |
| 204 std::sort(rows->begin(), rows->end(), | 249 std::sort(rows->begin(), rows->end(), |
| 205 [](const ResourceRow& x, const ResourceRow& y) { | 250 [](const ResourceRow& x, const ResourceRow& y) { |
| 206 return x.score > y.score; | 251 return x.score > y.score; |
| 207 }); | 252 }); |
| 208 } | 253 } |
| 209 | 254 |
| 210 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( | 255 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( |
| 211 PrefetchKeyType i_key_type, | 256 PrefetchKeyType i_key_type, |
| 212 const std::string& i_primary_key) | 257 const std::string& i_primary_key) |
| 213 : key_type(i_key_type), | 258 : key_type(i_key_type), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 224 | 269 |
| 225 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { | 270 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { |
| 226 } | 271 } |
| 227 | 272 |
| 228 bool ResourcePrefetchPredictorTables::PrefetchData::operator==( | 273 bool ResourcePrefetchPredictorTables::PrefetchData::operator==( |
| 229 const PrefetchData& rhs) const { | 274 const PrefetchData& rhs) const { |
| 230 return key_type == rhs.key_type && primary_key == rhs.primary_key && | 275 return key_type == rhs.key_type && primary_key == rhs.primary_key && |
| 231 resources == rhs.resources; | 276 resources == rhs.resources; |
| 232 } | 277 } |
| 233 | 278 |
| 279 RedirectRow::RedirectRow() |
| 280 : number_of_hits(0), |
| 281 number_of_misses(0), |
| 282 consecutive_misses(0), |
| 283 score(0.0) {} |
| 284 |
| 285 RedirectRow::RedirectRow(const RedirectRow& other) |
| 286 : url(other.url), |
| 287 number_of_hits(other.number_of_hits), |
| 288 number_of_misses(other.number_of_misses), |
| 289 consecutive_misses(other.consecutive_misses), |
| 290 score(other.score) {} |
| 291 |
| 292 RedirectRow::RedirectRow(const std::string& i_url, |
| 293 size_t i_number_of_hits, |
| 294 size_t i_number_of_misses, |
| 295 size_t i_consecutive_misses) |
| 296 : url(i_url), |
| 297 number_of_hits(i_number_of_hits), |
| 298 number_of_misses(i_number_of_misses), |
| 299 consecutive_misses(i_consecutive_misses), |
| 300 score(0.0) {} |
| 301 |
| 302 void RedirectRow::UpdateScore() { |
| 303 // TODO(alexilin): invent some scoring |
| 304 } |
| 305 |
| 306 bool RedirectRow::operator==(const RedirectRow& rhs) const { |
| 307 return url == rhs.url && number_of_hits == rhs.number_of_hits && |
| 308 number_of_misses == rhs.number_of_misses && |
| 309 consecutive_misses == rhs.consecutive_misses; |
| 310 } |
| 311 |
| 312 // static |
| 313 void RedirectRow::FromProto(const RedirectStat& proto, RedirectRow* row) { |
| 314 row->url = proto.url(); |
| 315 row->number_of_hits = proto.number_of_hits(); |
| 316 row->number_of_misses = proto.number_of_misses(); |
| 317 row->consecutive_misses = proto.consecutive_misses(); |
| 318 row->UpdateScore(); |
| 319 } |
| 320 |
| 321 void RedirectRow::ToProto(RedirectStat* redirect_stat) const { |
| 322 redirect_stat->set_url(url); |
| 323 redirect_stat->set_number_of_hits(number_of_hits); |
| 324 redirect_stat->set_number_of_misses(number_of_misses); |
| 325 redirect_stat->set_consecutive_misses(consecutive_misses); |
| 326 } |
| 327 |
| 328 // static |
| 329 void ResourcePrefetchPredictorTables::SortRedirectRows( |
| 330 std::vector<RedirectRow>* rows) { |
| 331 std::sort(rows->begin(), rows->end(), |
| 332 [](const RedirectRow& x, const RedirectRow& y) { |
| 333 return x.score > y.score; |
| 334 }); |
| 335 } |
| 336 |
| 337 ResourcePrefetchPredictorTables::RedirectData::RedirectData( |
| 338 PrefetchKeyType i_key_type, |
| 339 const std::string& i_primary_key) |
| 340 : key_type(i_key_type), primary_key(i_primary_key) {} |
| 341 |
| 342 ResourcePrefetchPredictorTables::RedirectData::RedirectData( |
| 343 const RedirectData& other) |
| 344 : key_type(other.key_type), |
| 345 primary_key(other.primary_key), |
| 346 last_visit(other.last_visit), |
| 347 redirects(other.redirects) {} |
| 348 |
| 349 ResourcePrefetchPredictorTables::RedirectData::~RedirectData() {} |
| 350 |
| 351 bool ResourcePrefetchPredictorTables::RedirectData::operator==( |
| 352 const RedirectData& rhs) const { |
| 353 return key_type == rhs.key_type && primary_key == rhs.primary_key && |
| 354 redirects == rhs.redirects; |
| 355 } |
| 356 |
| 357 // static |
| 358 void ResourcePrefetchPredictorTables::RedirectData::FromProto( |
| 359 const RedirectProto& proto, |
| 360 RedirectData* data) { |
| 361 data->last_visit = base::Time::FromInternalValue(proto.last_visit_time()); |
| 362 data->redirects.clear(); |
| 363 for (const auto& stat : proto.redirects()) { |
| 364 RedirectRow row; |
| 365 RedirectRow::FromProto(stat, &row); |
| 366 data->redirects.push_back(row); |
| 367 } |
| 368 } |
| 369 |
| 370 void ResourcePrefetchPredictorTables::RedirectData::ToProto( |
| 371 RedirectProto* proto) const { |
| 372 proto->set_last_visit_time(last_visit.ToInternalValue()); |
| 373 proto->clear_redirects(); |
| 374 for (const auto& row : redirects) { |
| 375 RedirectStat* stat = proto->add_redirects(); |
| 376 row.ToProto(stat); |
| 377 } |
| 378 } |
| 379 |
| 234 void ResourcePrefetchPredictorTables::GetAllData( | 380 void ResourcePrefetchPredictorTables::GetAllData( |
| 235 PrefetchDataMap* url_data_map, | 381 PrefetchDataMap* url_data_map, |
| 236 PrefetchDataMap* host_data_map) { | 382 PrefetchDataMap* host_data_map, |
| 383 RedirectDataMap* url_redirect_data_map, |
| 384 RedirectDataMap* host_redirect_data_map) { |
| 237 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 385 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 238 if (CantAccessDatabase()) | 386 if (CantAccessDatabase()) |
| 239 return; | 387 return; |
| 240 | 388 |
| 241 DCHECK(url_data_map); | 389 DCHECK(url_data_map); |
| 242 DCHECK(host_data_map); | 390 DCHECK(host_data_map); |
| 391 DCHECK(url_redirect_data_map); |
| 392 DCHECK(host_redirect_data_map); |
| 243 url_data_map->clear(); | 393 url_data_map->clear(); |
| 244 host_data_map->clear(); | 394 host_data_map->clear(); |
| 395 url_redirect_data_map->clear(); |
| 396 host_redirect_data_map->clear(); |
| 245 | 397 |
| 246 std::vector<std::string> urls_to_delete, hosts_to_delete; | 398 std::vector<std::string> urls_to_delete, hosts_to_delete; |
| 247 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete); | 399 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, |
| 248 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete); | 400 &urls_to_delete); |
| 401 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, |
| 402 &hosts_to_delete); |
| 403 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); |
| 404 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); |
| 249 | 405 |
| 250 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) | 406 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) |
| 251 DeleteData(urls_to_delete, hosts_to_delete); | 407 DeleteResourceData(urls_to_delete, hosts_to_delete); |
| 252 } | 408 } |
| 253 | 409 |
| 254 void ResourcePrefetchPredictorTables::UpdateData( | 410 void ResourcePrefetchPredictorTables::UpdateData( |
| 255 const PrefetchData& url_data, | 411 const PrefetchData& url_data, |
| 256 const PrefetchData& host_data) { | 412 const PrefetchData& host_data, |
| 413 const RedirectData& url_redirect_data, |
| 414 const RedirectData& host_redirect_data) { |
| 257 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 415 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 258 if (CantAccessDatabase()) | 416 if (CantAccessDatabase()) |
| 259 return; | 417 return; |
| 260 | 418 |
| 261 DCHECK(!url_data.is_host() && host_data.is_host()); | 419 DCHECK(!url_data.is_host() && host_data.is_host()); |
| 262 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty()); | 420 DCHECK(!url_redirect_data.is_host() && host_redirect_data.is_host()); |
| 421 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty() || |
| 422 !url_redirect_data.primary_key.empty() || |
| 423 !host_redirect_data.primary_key.empty()); |
| 263 | 424 |
| 264 DB()->BeginTransaction(); | 425 DB()->BeginTransaction(); |
| 265 | 426 |
| 266 bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) && | 427 bool success = |
| 267 (host_data.primary_key.empty() || UpdateDataHelper(host_data)); | 428 (url_data.primary_key.empty() || UpdateResourceDataHelper(url_data)) && |
| 429 (host_data.primary_key.empty() || UpdateResourceDataHelper(host_data)) && |
| 430 (url_redirect_data.primary_key.empty() || |
| 431 UpdateRedirectDataHelper(url_redirect_data)) && |
| 432 (host_redirect_data.primary_key.empty() || |
| 433 UpdateRedirectDataHelper(host_redirect_data)); |
| 268 if (!success) | 434 if (!success) |
| 269 DB()->RollbackTransaction(); | 435 DB()->RollbackTransaction(); |
| 270 | 436 else |
| 271 DB()->CommitTransaction(); | 437 DB()->CommitTransaction(); |
| 272 } | 438 } |
| 273 | 439 |
| 274 void ResourcePrefetchPredictorTables::DeleteData( | 440 void ResourcePrefetchPredictorTables::DeleteResourceData( |
| 275 const std::vector<std::string>& urls, | 441 const std::vector<std::string>& urls, |
| 276 const std::vector<std::string>& hosts) { | 442 const std::vector<std::string>& hosts) { |
| 277 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 443 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 444 if (CantAccessDatabase()) |
| 445 return; |
| 446 |
| 447 DCHECK(!urls.empty() || !hosts.empty()); |
| 448 |
| 449 if (!urls.empty()) |
| 450 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_URL, urls); |
| 451 if (!hosts.empty()) |
| 452 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); |
| 453 } |
| 454 |
| 455 void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint( |
| 456 const std::string& key, |
| 457 PrefetchKeyType key_type) { |
| 458 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 459 if (CantAccessDatabase()) |
| 460 return; |
| 461 |
| 462 DeleteResourceDataHelper(key_type, {key}); |
| 463 } |
| 464 |
| 465 void ResourcePrefetchPredictorTables::DeleteRedirectData( |
| 466 const std::vector<std::string>& urls, |
| 467 const std::vector<std::string>& hosts) { |
| 468 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 278 if (CantAccessDatabase()) | 469 if (CantAccessDatabase()) |
| 279 return; | 470 return; |
| 280 | 471 |
| 281 DCHECK(!urls.empty() || !hosts.empty()); | 472 DCHECK(!urls.empty() || !hosts.empty()); |
| 282 | 473 |
| 283 if (!urls.empty()) | 474 if (!urls.empty()) |
| 284 DeleteDataHelper(PREFETCH_KEY_TYPE_URL, urls); | 475 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_URL, urls); |
| 285 if (!hosts.empty()) | 476 if (!hosts.empty()) |
| 286 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); | 477 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); |
| 287 } | 478 } |
| 288 | 479 |
| 289 void ResourcePrefetchPredictorTables::DeleteSingleDataPoint( | 480 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( |
| 290 const std::string& key, | 481 const std::string& key, |
| 291 PrefetchKeyType key_type) { | 482 PrefetchKeyType key_type) { |
| 292 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 483 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 293 if (CantAccessDatabase()) | 484 if (CantAccessDatabase()) |
| 294 return; | 485 return; |
| 295 | 486 |
| 296 DeleteDataHelper(key_type, std::vector<std::string>(1, key)); | 487 DeleteRedirectDataHelper(key_type, {key}); |
| 297 } | 488 } |
| 298 | 489 |
| 299 void ResourcePrefetchPredictorTables::DeleteAllData() { | 490 void ResourcePrefetchPredictorTables::DeleteAllData() { |
| 300 if (CantAccessDatabase()) | 491 if (CantAccessDatabase()) |
| 301 return; | 492 return; |
| 302 | 493 |
| 303 Statement deleter; | 494 Statement deleter; |
| 304 for (const char* table_name : | 495 for (const char* table_name : |
| 305 {kUrlResourceTableName, kUrlMetadataTableName, kHostResourceTableName, | 496 {kUrlResourceTableName, kUrlMetadataTableName, kUrlRedirectTableName, |
| 306 kHostMetadataTableName}) { | 497 kHostResourceTableName, kHostMetadataTableName, |
| 498 kHostRedirectTableName}) { |
| 307 deleter.Assign(DB()->GetUniqueStatement( | 499 deleter.Assign(DB()->GetUniqueStatement( |
| 308 base::StringPrintf("DELETE FROM %s", table_name).c_str())); | 500 base::StringPrintf("DELETE FROM %s", table_name).c_str())); |
| 309 deleter.Run(); | 501 deleter.Run(); |
| 310 } | 502 } |
| 311 } | 503 } |
| 312 | 504 |
| 313 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() | 505 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() |
| 314 : PredictorTableBase() { | 506 : PredictorTableBase() { |
| 315 } | 507 } |
| 316 | 508 |
| 317 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { | 509 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { |
| 318 } | 510 } |
| 319 | 511 |
| 320 void ResourcePrefetchPredictorTables::GetAllDataHelper( | 512 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper( |
| 321 PrefetchKeyType key_type, | 513 PrefetchKeyType key_type, |
| 322 PrefetchDataMap* data_map, | 514 PrefetchDataMap* data_map, |
| 323 std::vector<std::string>* to_delete) { | 515 std::vector<std::string>* to_delete) { |
| 324 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | 516 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| 325 | 517 |
| 326 // Read the resources table and organize it per primary key. | 518 // Read the resources table and organize it per primary key. |
| 327 const char* resource_table_name = is_host ? kHostResourceTableName : | 519 const char* resource_table_name = is_host ? kHostResourceTableName : |
| 328 kUrlResourceTableName; | 520 kUrlResourceTableName; |
| 329 Statement resource_reader(DB()->GetUniqueStatement( | 521 Statement resource_reader(DB()->GetUniqueStatement( |
| 330 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str())); | 522 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str())); |
| 331 | 523 |
| 332 ResourceRow row; | 524 ResourceRow row; |
| 333 std::string primary_key; | 525 std::string primary_key; |
| 334 while (StepAndInitializeResourceRow(&resource_reader, &row, &primary_key)) { | 526 while (StepAndInitializeResourceRow(&resource_reader, &row, &primary_key)) { |
| 335 PrefetchDataMap::iterator it = data_map->find(primary_key); | 527 PrefetchDataMap::iterator it = data_map->find(primary_key); |
| 336 if (it == data_map->end()) { | 528 if (it == data_map->end()) { |
| 337 it = data_map->insert(std::make_pair( | 529 it = data_map->insert(std::make_pair( |
| 338 primary_key, PrefetchData(key_type, primary_key))).first; | 530 primary_key, PrefetchData(key_type, primary_key))).first; |
| 339 } | 531 } |
| 340 it->second.resources.push_back(row); | 532 it->second.resources.push_back(row); |
| 341 } | 533 } |
| 342 | 534 |
| 343 // Sort each of the resource row vectors by score. | 535 // Sort each of the resource row vectors by score. |
| 344 for (auto& kv : *data_map) | 536 for (auto& kv : *data_map) |
| 345 SortResourceRows(&(kv.second.resources)); | 537 SortResourceRows(&(kv.second.resources)); |
| 346 | 538 |
| 347 // Read the metadata and keep track of entries that have metadata, but no | 539 // Read the metadata and keep track of entries that have metadata, but no |
| 348 // resource entries, so they can be deleted. | 540 // resource entries, so they can be deleted. |
| 349 const char* metadata_table_name = is_host ? kHostMetadataTableName : | 541 const char* metadata_table_name = |
| 350 kUrlMetadataTableName; | 542 is_host ? kHostMetadataTableName : kUrlMetadataTableName; |
| 351 Statement metadata_reader(DB()->GetUniqueStatement( | 543 Statement metadata_reader(DB()->GetUniqueStatement( |
| 352 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); | 544 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); |
| 353 | 545 |
| 354 while (metadata_reader.Step()) { | 546 while (metadata_reader.Step()) { |
| 355 std::string primary_key = metadata_reader.ColumnString(0); | 547 std::string primary_key = metadata_reader.ColumnString(0); |
| 356 | 548 |
| 357 PrefetchDataMap::iterator it = data_map->find(primary_key); | 549 PrefetchDataMap::iterator it = data_map->find(primary_key); |
| 358 if (it != data_map->end()) { | 550 if (it != data_map->end()) { |
| 359 int64_t last_visit = metadata_reader.ColumnInt64(1); | 551 int64_t last_visit = metadata_reader.ColumnInt64(1); |
| 360 it->second.last_visit = base::Time::FromInternalValue(last_visit); | 552 it->second.last_visit = base::Time::FromInternalValue(last_visit); |
| 361 } else { | 553 } else { |
| 362 to_delete->push_back(primary_key); | 554 to_delete->push_back(primary_key); |
| 363 } | 555 } |
| 364 } | 556 } |
| 365 } | 557 } |
| 366 | 558 |
| 367 bool ResourcePrefetchPredictorTables::UpdateDataHelper( | 559 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( |
| 560 PrefetchKeyType key_type, |
| 561 RedirectDataMap* redirect_map) { |
| 562 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| 563 |
| 564 const char* redirect_table_name = |
| 565 is_host ? kHostRedirectTableName : kUrlRedirectTableName; |
| 566 Statement redirect_reader(DB()->GetUniqueStatement( |
| 567 base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str())); |
| 568 |
| 569 RedirectData data(key_type); |
| 570 std::string primary_key; |
| 571 while (StepAndInitializeRedirectData(&redirect_reader, &data, &primary_key)) { |
| 572 auto result = redirect_map->insert(std::make_pair(primary_key, data)); |
| 573 DCHECK(result.second); |
| 574 } |
| 575 } |
| 576 |
| 577 bool ResourcePrefetchPredictorTables::UpdateResourceDataHelper( |
| 368 const PrefetchData& data) { | 578 const PrefetchData& data) { |
| 369 DCHECK(!data.primary_key.empty()); | 579 DCHECK(!data.primary_key.empty()); |
| 370 | 580 |
| 371 if (!StringsAreSmallerThanDBLimit(data)) { | 581 if (!StringsAreSmallerThanDBLimit(data)) { |
| 372 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); | 582 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); |
| 373 return false; | 583 return false; |
| 374 } | 584 } |
| 375 | 585 |
| 376 // Delete the older data from both the tables. | 586 // Delete the older data from both the tables. |
| 377 std::unique_ptr<Statement> deleter(data.is_host() | 587 std::unique_ptr<Statement> deleter(data.is_host() |
| 378 ? GetHostResourceDeleteStatement() | 588 ? GetHostResourceDeleteStatement() |
| 379 : GetUrlResourceDeleteStatement()); | 589 : GetUrlResourceDeleteStatement()); |
| 380 deleter->BindString(0, data.primary_key); | 590 deleter->BindString(0, data.primary_key); |
| 381 if (!deleter->Run()) | 591 if (!deleter->Run()) |
| 382 return false; | 592 return false; |
| 383 | 593 |
| 384 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() : | 594 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() |
| 385 GetUrlMetadataDeleteStatement()); | 595 : GetUrlMetadataDeleteStatement()); |
| 386 deleter->BindString(0, data.primary_key); | 596 deleter->BindString(0, data.primary_key); |
| 387 if (!deleter->Run()) | 597 if (!deleter->Run()) |
| 388 return false; | 598 return false; |
| 389 | 599 |
| 390 // Add the new data to the tables. | 600 // Add the new data to the tables. |
| 391 for (const ResourceRow& resource : data.resources) { | 601 for (const ResourceRow& resource : data.resources) { |
| 392 std::unique_ptr<Statement> resource_inserter( | 602 std::unique_ptr<Statement> resource_inserter( |
| 393 data.is_host() ? GetHostResourceUpdateStatement() | 603 data.is_host() ? GetHostResourceUpdateStatement() |
| 394 : GetUrlResourceUpdateStatement()); | 604 : GetUrlResourceUpdateStatement()); |
| 395 BindResourceRowToStatement(resource, data.primary_key, | 605 BindResourceRowToStatement(resource, data.primary_key, |
| 396 resource_inserter.get()); | 606 resource_inserter.get()); |
| 397 if (!resource_inserter->Run()) | 607 if (!resource_inserter->Run()) |
| 398 return false; | 608 return false; |
| 399 } | 609 } |
| 400 | 610 |
| 401 std::unique_ptr<Statement> metadata_inserter( | 611 std::unique_ptr<Statement> metadata_inserter( |
| 402 data.is_host() ? GetHostMetadataUpdateStatement() | 612 data.is_host() ? GetHostMetadataUpdateStatement() |
| 403 : GetUrlMetadataUpdateStatement()); | 613 : GetUrlMetadataUpdateStatement()); |
| 404 metadata_inserter->BindString(0, data.primary_key); | 614 metadata_inserter->BindString(0, data.primary_key); |
| 405 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); | 615 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); |
| 406 if (!metadata_inserter->Run()) | 616 if (!metadata_inserter->Run()) |
| 407 return false; | 617 return false; |
| 408 | 618 |
| 409 return true; | 619 return true; |
| 410 } | 620 } |
| 411 | 621 |
| 412 void ResourcePrefetchPredictorTables::DeleteDataHelper( | 622 bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper( |
| 623 const RedirectData& data) { |
| 624 DCHECK(!data.primary_key.empty()); |
| 625 |
| 626 if (!StringsAreSmallerThanDBLimit(data)) { |
| 627 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); |
| 628 return false; |
| 629 } |
| 630 |
| 631 // Delete the older data from the table. |
| 632 std::unique_ptr<Statement> deleter(data.is_host() |
| 633 ? GetHostRedirectDeleteStatement() |
| 634 : GetUrlRedirectDeleteStatement()); |
| 635 deleter->BindString(0, data.primary_key); |
| 636 if (!deleter->Run()) |
| 637 return false; |
| 638 |
| 639 // Add the new data to the table. |
| 640 std::unique_ptr<Statement> inserter(data.is_host() |
| 641 ? GetHostRedirectUpdateStatement() |
| 642 : GetUrlRedirectUpdateStatement()); |
| 643 BindRedirectDataToStatement(data, inserter.get()); |
| 644 if (!inserter->Run()) |
| 645 return false; |
| 646 |
| 647 return true; |
| 648 } |
| 649 |
| 650 void ResourcePrefetchPredictorTables::DeleteResourceDataHelper( |
| 413 PrefetchKeyType key_type, | 651 PrefetchKeyType key_type, |
| 414 const std::vector<std::string>& keys) { | 652 const std::vector<std::string>& keys) { |
| 415 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | 653 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| 416 | 654 |
| 417 for (const std::string& key : keys) { | 655 for (const std::string& key : keys) { |
| 418 std::unique_ptr<Statement> deleter(is_host | 656 std::unique_ptr<Statement> deleter(is_host |
| 419 ? GetHostResourceDeleteStatement() | 657 ? GetHostResourceDeleteStatement() |
| 420 : GetUrlResourceDeleteStatement()); | 658 : GetUrlResourceDeleteStatement()); |
| 421 deleter->BindString(0, key); | 659 deleter->BindString(0, key); |
| 422 deleter->Run(); | 660 deleter->Run(); |
| 423 | 661 |
| 424 deleter.reset(is_host ? GetHostMetadataDeleteStatement() : | 662 deleter.reset(is_host ? GetHostMetadataDeleteStatement() |
| 425 GetUrlMetadataDeleteStatement()); | 663 : GetUrlMetadataDeleteStatement()); |
| 426 deleter->BindString(0, key); | 664 deleter->BindString(0, key); |
| 427 deleter->Run(); | 665 deleter->Run(); |
| 428 } | 666 } |
| 667 } |
| 668 |
| 669 void ResourcePrefetchPredictorTables::DeleteRedirectDataHelper( |
| 670 PrefetchKeyType key_type, |
| 671 const std::vector<std::string>& keys) { |
| 672 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| 673 |
| 674 for (const std::string& key : keys) { |
| 675 std::unique_ptr<Statement> deleter(is_host |
| 676 ? GetHostRedirectDeleteStatement() |
| 677 : GetUrlRedirectDeleteStatement()); |
| 678 deleter->BindString(0, key); |
| 679 deleter->Run(); |
| 680 } |
| 429 } | 681 } |
| 430 | 682 |
| 431 // static | 683 // static |
| 432 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( | 684 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( |
| 433 const PrefetchData& data) { | 685 const PrefetchData& data) { |
| 434 if (data.primary_key.length() > kMaxStringLength) | 686 if (data.primary_key.length() > kMaxStringLength) |
| 435 return false; | 687 return false; |
| 436 | 688 |
| 437 for (const ResourceRow& row : data.resources) { | 689 for (const ResourceRow& row : data.resources) { |
| 438 if (row.resource_url.spec().length() > kMaxStringLength) | 690 if (row.resource_url.spec().length() > kMaxStringLength) |
| 439 return false; | 691 return false; |
| 440 } | 692 } |
| 441 return true; | 693 return true; |
| 442 } | 694 } |
| 443 | 695 |
| 444 // static | 696 // static |
| 697 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( |
| 698 const RedirectData& data) { |
| 699 if (data.primary_key.length() > kMaxStringLength) |
| 700 return false; |
| 701 |
| 702 for (const RedirectRow& row : data.redirects) { |
| 703 if (row.url.length() > kMaxStringLength) |
| 704 return false; |
| 705 } |
| 706 return true; |
| 707 } |
| 708 |
| 709 // static |
| 445 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( | 710 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( |
| 446 sql::Connection* db) { | 711 sql::Connection* db) { |
| 447 int version = GetDatabaseVersion(db); | 712 int version = GetDatabaseVersion(db); |
| 448 bool success = true; | 713 bool success = true; |
| 449 // Too new is also a problem. | 714 // Too new is also a problem. |
| 450 bool incompatible_version = version != kDatabaseVersion; | 715 bool incompatible_version = version != kDatabaseVersion; |
| 451 | 716 |
| 452 if (incompatible_version) { | 717 if (incompatible_version) { |
| 453 for (const char* table_name : | 718 for (const char* table_name : |
| 454 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, | 719 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, |
| 455 kUrlMetadataTableName, kHostMetadataTableName}) { | 720 kUrlRedirectTableName, kHostRedirectTableName, kUrlMetadataTableName, |
| 721 kHostMetadataTableName}) { |
| 456 success = | 722 success = |
| 457 success && | 723 success && |
| 458 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) | 724 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) |
| 459 .c_str()); | 725 .c_str()); |
| 460 } | 726 } |
| 461 } | 727 } |
| 462 | 728 |
| 463 if (incompatible_version) { | 729 if (incompatible_version) { |
| 464 success = | 730 success = |
| 465 success && | 731 success && |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 success = | 778 success = |
| 513 success && | 779 success && |
| 514 (db->DoesTableExist(kUrlResourceTableName) || | 780 (db->DoesTableExist(kUrlResourceTableName) || |
| 515 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, | 781 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, |
| 516 kUrlResourceTableName) | 782 kUrlResourceTableName) |
| 517 .c_str())) && | 783 .c_str())) && |
| 518 (db->DoesTableExist(kUrlMetadataTableName) || | 784 (db->DoesTableExist(kUrlMetadataTableName) || |
| 519 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, | 785 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, |
| 520 kUrlMetadataTableName) | 786 kUrlMetadataTableName) |
| 521 .c_str())) && | 787 .c_str())) && |
| 788 (db->DoesTableExist(kUrlRedirectTableName) || |
| 789 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, |
| 790 kUrlRedirectTableName) |
| 791 .c_str())) && |
| 522 (db->DoesTableExist(kHostResourceTableName) || | 792 (db->DoesTableExist(kHostResourceTableName) || |
| 523 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, | 793 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, |
| 524 kHostResourceTableName) | 794 kHostResourceTableName) |
| 525 .c_str())) && | 795 .c_str())) && |
| 526 (db->DoesTableExist(kHostMetadataTableName) || | 796 (db->DoesTableExist(kHostMetadataTableName) || |
| 527 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, | 797 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, |
| 528 kHostMetadataTableName) | 798 kHostMetadataTableName) |
| 799 .c_str())) && |
| 800 (db->DoesTableExist(kHostRedirectTableName) || |
| 801 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, |
| 802 kHostRedirectTableName) |
| 529 .c_str())); | 803 .c_str())); |
| 530 | 804 |
| 531 if (success) | 805 if (success) |
| 532 success = transaction.Commit(); | 806 success = transaction.Commit(); |
| 533 else | 807 else |
| 534 transaction.Rollback(); | 808 transaction.Rollback(); |
| 535 | 809 |
| 536 if (!success) | 810 if (!success) |
| 537 ResetDB(); | 811 ResetDB(); |
| 538 } | 812 } |
| 539 | 813 |
| 540 void ResourcePrefetchPredictorTables::LogDatabaseStats() { | 814 void ResourcePrefetchPredictorTables::LogDatabaseStats() { |
| 541 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 815 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 542 if (CantAccessDatabase()) | 816 if (CantAccessDatabase()) |
| 543 return; | 817 return; |
| 544 | 818 |
| 545 Statement statement(DB()->GetUniqueStatement( | 819 Statement statement(DB()->GetUniqueStatement( |
| 546 base::StringPrintf("SELECT count(*) FROM %s", | 820 base::StringPrintf("SELECT count(*) FROM %s", |
| 547 kUrlResourceTableName).c_str())); | 821 kUrlResourceTableName).c_str())); |
| 548 if (statement.Step()) | 822 if (statement.Step()) |
| 549 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount", | 823 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount", |
| 550 statement.ColumnInt(0)); | 824 statement.ColumnInt(0)); |
| 551 | 825 |
| 552 statement.Assign(DB()->GetUniqueStatement( | 826 statement.Assign(DB()->GetUniqueStatement( |
| 553 base::StringPrintf("SELECT count(*) FROM %s", | 827 base::StringPrintf("SELECT count(*) FROM %s", |
| 554 kHostResourceTableName).c_str())); | 828 kHostResourceTableName).c_str())); |
| 555 if (statement.Step()) | 829 if (statement.Step()) |
| 556 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", | 830 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", |
| 557 statement.ColumnInt(0)); | 831 statement.ColumnInt(0)); |
| 832 |
| 833 statement.Assign(DB()->GetUniqueStatement( |
| 834 base::StringPrintf("SELECT count(*) FROM %s", kUrlRedirectTableName) |
| 835 .c_str())); |
| 836 if (statement.Step()) |
| 837 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlRedirectTableRowCount", |
| 838 statement.ColumnInt(0)); |
| 839 |
| 840 statement.Assign(DB()->GetUniqueStatement( |
| 841 base::StringPrintf("SELECT count(*) FROM %s", kHostRedirectTableName) |
| 842 .c_str())); |
| 843 if (statement.Step()) |
| 844 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostRedirectTableRowCount", |
| 845 statement.ColumnInt(0)); |
| 558 } | 846 } |
| 559 | 847 |
| 560 Statement* | 848 Statement* |
| 561 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() { | 849 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() { |
| 562 return new Statement(DB()->GetCachedStatement( | 850 return new Statement(DB()->GetCachedStatement( |
| 563 SQL_FROM_HERE, | 851 SQL_FROM_HERE, |
| 564 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName) | 852 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName) |
| 565 .c_str())); | 853 .c_str())); |
| 566 } | 854 } |
| 567 | 855 |
| 568 Statement* | 856 Statement* |
| 569 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() { | 857 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() { |
| 570 return new Statement(DB()->GetCachedStatement( | 858 return new Statement(DB()->GetCachedStatement( |
| 571 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, | 859 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, |
| 572 kUrlResourceTableName) | 860 kUrlResourceTableName) |
| 573 .c_str())); | 861 .c_str())); |
| 574 } | 862 } |
| 575 | 863 |
| 576 Statement* | 864 Statement* ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() { |
| 577 ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() { | |
| 578 return new Statement(DB()->GetCachedStatement( | 865 return new Statement(DB()->GetCachedStatement( |
| 579 SQL_FROM_HERE, | 866 SQL_FROM_HERE, |
| 580 base::StringPrintf(kDeleteStatementTemplate, kUrlMetadataTableName) | 867 base::StringPrintf(kDeleteStatementTemplate, kUrlMetadataTableName) |
| 581 .c_str())); | 868 .c_str())); |
| 582 } | 869 } |
| 583 | 870 |
| 584 Statement* | 871 Statement* ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() { |
| 585 ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() { | |
| 586 return new Statement(DB()->GetCachedStatement( | 872 return new Statement(DB()->GetCachedStatement( |
| 587 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, | 873 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, |
| 588 kUrlMetadataTableName) | 874 kUrlMetadataTableName) |
| 589 .c_str())); | 875 .c_str())); |
| 590 } | 876 } |
| 591 | 877 |
| 878 Statement* ResourcePrefetchPredictorTables::GetUrlRedirectDeleteStatement() { |
| 879 return new Statement(DB()->GetCachedStatement( |
| 880 SQL_FROM_HERE, |
| 881 base::StringPrintf(kDeleteStatementTemplate, kUrlRedirectTableName) |
| 882 .c_str())); |
| 883 } |
| 884 |
| 885 Statement* ResourcePrefetchPredictorTables::GetUrlRedirectUpdateStatement() { |
| 886 return new Statement(DB()->GetCachedStatement( |
| 887 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate, |
| 888 kUrlRedirectTableName) |
| 889 .c_str())); |
| 890 } |
| 891 |
| 592 Statement* | 892 Statement* |
| 593 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { | 893 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { |
| 594 return new Statement(DB()->GetCachedStatement( | 894 return new Statement(DB()->GetCachedStatement( |
| 595 SQL_FROM_HERE, | 895 SQL_FROM_HERE, |
| 596 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName) | 896 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName) |
| 597 .c_str())); | 897 .c_str())); |
| 598 } | 898 } |
| 599 | 899 |
| 600 Statement* | 900 Statement* |
| 601 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() { | 901 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() { |
| 602 return new Statement(DB()->GetCachedStatement( | 902 return new Statement(DB()->GetCachedStatement( |
| 603 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, | 903 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, |
| 604 kHostResourceTableName) | 904 kHostResourceTableName) |
| 605 .c_str())); | 905 .c_str())); |
| 606 } | 906 } |
| 607 | 907 |
| 608 Statement* | 908 Statement* ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() { |
| 609 ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() { | |
| 610 return new Statement(DB()->GetCachedStatement( | 909 return new Statement(DB()->GetCachedStatement( |
| 611 SQL_FROM_HERE, | 910 SQL_FROM_HERE, |
| 612 base::StringPrintf(kDeleteStatementTemplate, kHostMetadataTableName) | 911 base::StringPrintf(kDeleteStatementTemplate, kHostMetadataTableName) |
| 613 .c_str())); | 912 .c_str())); |
| 614 } | 913 } |
| 615 | 914 |
| 616 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { | 915 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { |
| 617 return new Statement(DB()->GetCachedStatement( | 916 return new Statement(DB()->GetCachedStatement( |
| 618 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, | 917 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, |
| 619 kHostMetadataTableName) | 918 kHostMetadataTableName) |
| 620 .c_str())); | 919 .c_str())); |
| 621 } | 920 } |
| 622 | 921 |
| 922 Statement* ResourcePrefetchPredictorTables::GetHostRedirectDeleteStatement() { |
| 923 return new Statement(DB()->GetCachedStatement( |
| 924 SQL_FROM_HERE, |
| 925 base::StringPrintf(kDeleteStatementTemplate, kHostRedirectTableName) |
| 926 .c_str())); |
| 927 } |
| 928 |
| 929 Statement* ResourcePrefetchPredictorTables::GetHostRedirectUpdateStatement() { |
| 930 return new Statement(DB()->GetCachedStatement( |
| 931 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate, |
| 932 kHostRedirectTableName) |
| 933 .c_str())); |
| 934 } |
| 935 |
| 623 } // namespace predictors | 936 } // namespace predictors |
| OLD | NEW |