Chromium Code Reviews| 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; | |
| 27 | 28 |
| 28 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; | 29 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; |
| 29 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; | 30 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url_resource"; |
| 30 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; | 31 const char kUrlResourceMetadataTableName[] = |
| 31 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; | 32 "resource_prefetch_predictor_url_resource_metadata"; |
| 32 const char kHostMetadataTableName[] = | 33 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; |
| 33 "resource_prefetch_predictor_host_metadata"; | 34 const char kUrlRedirectMetadataTableName[] = |
| 35 "resource_prefetch_predictor_url_redirect_metadata"; | |
| 36 const char kHostResourceTableName[] = | |
| 37 "resource_prefetch_predictor_host_resource"; | |
| 38 const char kHostResourceMetadataTableName[] = | |
| 39 "resource_prefetch_predictor_host_resource_metadata"; | |
| 40 const char kHostRedirectTableName[] = | |
| 41 "resource_prefetch_predictor_host_redirect"; | |
| 42 const char kHostRedirectMetadataTableName[] = | |
| 43 "resource_prefetch_preditcor_host_redirect_metadata"; | |
| 34 | 44 |
| 35 const char kCreateGlobalMetadataStatementTemplate[] = | 45 const char kCreateGlobalMetadataStatementTemplate[] = |
| 36 "CREATE TABLE %s ( " | 46 "CREATE TABLE %s ( " |
| 37 "key TEXT, value INTEGER, " | 47 "key TEXT, value INTEGER, " |
| 38 "PRIMARY KEY (key))"; | 48 "PRIMARY KEY (key))"; |
| 39 const char kCreateResourceTableStatementTemplate[] = | 49 const char kCreateResourceTableStatementTemplate[] = |
| 40 "CREATE TABLE %s ( " | 50 "CREATE TABLE %s ( " |
| 41 "main_page_url TEXT, " | 51 "main_page_url TEXT, " |
| 42 "resource_url TEXT, " | 52 "resource_url TEXT, " |
| 43 "proto BLOB, " | 53 "proto BLOB, " |
| 44 "PRIMARY KEY(main_page_url, resource_url))"; | 54 "PRIMARY KEY(main_page_url, resource_url))"; |
| 55 const char kCreateRedirectTableStatementTemplate[] = | |
| 56 "CREATE TABLE %s ( " | |
| 57 "main_page_url TEXT, " | |
| 58 "final_redirect TEXT, " | |
|
mattcary
2016/09/14 15:37:09
I'm not sure why final_redirect is part of the key
alexilin
2016/09/14 18:59:55
I just copied structure of resource table. It's a
mattcary
2016/09/15 09:04:34
Yeah, that's what I mean. If you always change mul
| |
| 59 "proto BLOB, " | |
| 60 "PRIMARY KEY(main_page_url, final_redirect))"; | |
| 45 const char kCreateMetadataTableStatementTemplate[] = | 61 const char kCreateMetadataTableStatementTemplate[] = |
| 46 "CREATE TABLE %s ( " | 62 "CREATE TABLE %s ( " |
| 47 "main_page_url TEXT, " | 63 "main_page_url TEXT, " |
| 48 "last_visit_time INTEGER, " | 64 "last_visit_time INTEGER, " |
| 49 "PRIMARY KEY(main_page_url))"; | 65 "PRIMARY KEY(main_page_url))"; |
| 50 | 66 |
| 51 const char kInsertResourceTableStatementTemplate[] = | 67 const char kInsertResourceTableStatementTemplate[] = |
| 52 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; | 68 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; |
| 69 const char kInsertRedirectTableStatementTemplate[] = | |
| 70 "INSERT INTO %s (main_page_url, final_redirect, proto) VALUES (?,?,?)"; | |
| 53 const char kInsertMetadataTableStatementTemplate[] = | 71 const char kInsertMetadataTableStatementTemplate[] = |
| 54 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; | 72 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; |
| 55 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; | 73 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; |
| 56 | 74 |
| 57 void BindResourceRowToStatement(const ResourceRow& row, | 75 void BindResourceRowToStatement(const ResourceRow& row, |
| 58 const std::string& primary_key, | 76 const std::string& primary_key, |
| 59 Statement* statement) { | 77 Statement* statement) { |
| 60 chrome_browser_predictors::ResourceData proto; | 78 chrome_browser_predictors::ResourceData proto; |
| 61 row.ToProto(&proto); | 79 row.ToProto(&proto); |
| 62 int size = proto.ByteSize(); | 80 int size = proto.ByteSize(); |
| 63 std::vector<char> proto_buffer(size); | 81 std::vector<char> proto_buffer(size); |
| 64 proto.SerializeToArray(&proto_buffer[0], size); | 82 proto.SerializeToArray(&proto_buffer[0], size); |
| 65 | 83 |
| 66 statement->BindString(0, primary_key); | 84 statement->BindString(0, primary_key); |
| 67 statement->BindString(1, row.resource_url.spec()); | 85 statement->BindString(1, row.resource_url.spec()); |
| 68 statement->BindBlob(2, &proto_buffer[0], size); | 86 statement->BindBlob(2, &proto_buffer[0], size); |
| 69 } | 87 } |
| 70 | 88 |
| 89 void BindRedirectRowToStatement(const RedirectRow& row, | |
| 90 const std::string& primary_key, | |
| 91 Statement* statement) { | |
| 92 chrome_browser_predictors::RedirectStat proto; | |
| 93 row.ToProto(&proto); | |
| 94 int size = proto.ByteSize(); | |
| 95 std::vector<char> proto_buffer(size); | |
| 96 proto.SerializeToArray(&proto_buffer[0], size); | |
| 97 | |
| 98 statement->BindString(0, primary_key); | |
| 99 statement->BindString(1, row.final_redirect); | |
| 100 statement->BindBlob(2, &proto_buffer[0], size); | |
| 101 } | |
| 102 | |
| 71 bool StepAndInitializeResourceRow(Statement* statement, | 103 bool StepAndInitializeResourceRow(Statement* statement, |
| 72 ResourceRow* row, | 104 ResourceRow* row, |
| 73 std::string* primary_key) { | 105 std::string* primary_key) { |
| 74 if (!statement->Step()) | 106 if (!statement->Step()) |
| 75 return false; | 107 return false; |
| 76 | 108 |
| 77 *primary_key = statement->ColumnString(0); | 109 *primary_key = statement->ColumnString(0); |
| 78 | 110 |
| 79 int size = statement->ColumnByteLength(2); | 111 int size = statement->ColumnByteLength(2); |
| 80 const void* data = statement->ColumnBlob(2); | 112 const void* data = statement->ColumnBlob(2); |
| 81 DCHECK(data); | 113 DCHECK(data); |
| 82 chrome_browser_predictors::ResourceData proto; | 114 chrome_browser_predictors::ResourceData proto; |
| 83 proto.ParseFromArray(data, size); | 115 proto.ParseFromArray(data, size); |
| 84 ResourceRow::FromProto(proto, row); | 116 ResourceRow::FromProto(proto, row); |
| 85 | 117 |
| 86 GURL resource_url(statement->ColumnString(1)); | 118 GURL resource_url(statement->ColumnString(1)); |
| 87 DCHECK(resource_url == row->resource_url); | 119 DCHECK(resource_url == row->resource_url); |
| 88 | 120 |
| 89 return true; | 121 return true; |
| 90 } | 122 } |
| 91 | 123 |
| 124 bool StepAndInitializeRedirectRow(Statement* statement, | |
| 125 RedirectRow* row, | |
| 126 std::string* primary_key) { | |
| 127 if (!statement->Step()) | |
| 128 return false; | |
| 129 | |
| 130 *primary_key = statement->ColumnString(0); | |
| 131 | |
| 132 int size = statement->ColumnByteLength(2); | |
| 133 const void* data = statement->ColumnBlob(2); | |
| 134 DCHECK(data); | |
| 135 chrome_browser_predictors::RedirectStat proto; | |
| 136 proto.ParseFromArray(data, size); | |
| 137 RedirectRow::FromProto(proto, row); | |
| 138 | |
| 139 std::string final_redirect(statement->ColumnString(1)); | |
| 140 DCHECK(final_redirect == row->final_redirect); | |
| 141 | |
| 142 return true; | |
| 143 } | |
| 144 | |
| 92 } // namespace | 145 } // namespace |
| 93 | 146 |
| 94 namespace predictors { | 147 namespace predictors { |
| 95 | 148 |
| 96 ResourceRow::ResourceRow() | 149 ResourceRow::ResourceRow() |
| 97 : resource_type(content::RESOURCE_TYPE_LAST_TYPE), | 150 : resource_type(content::RESOURCE_TYPE_LAST_TYPE), |
| 98 number_of_hits(0), | 151 number_of_hits(0), |
| 99 number_of_misses(0), | 152 number_of_misses(0), |
| 100 consecutive_misses(0), | 153 consecutive_misses(0), |
| 101 average_position(0.0), | 154 average_position(0.0), |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 return resource_url == rhs.resource_url && | 214 return resource_url == rhs.resource_url && |
| 162 resource_type == rhs.resource_type && | 215 resource_type == rhs.resource_type && |
| 163 number_of_hits == rhs.number_of_hits && | 216 number_of_hits == rhs.number_of_hits && |
| 164 number_of_misses == rhs.number_of_misses && | 217 number_of_misses == rhs.number_of_misses && |
| 165 consecutive_misses == rhs.consecutive_misses && | 218 consecutive_misses == rhs.consecutive_misses && |
| 166 average_position == rhs.average_position && priority == rhs.priority && | 219 average_position == rhs.average_position && priority == rhs.priority && |
| 167 has_validators == rhs.has_validators && | 220 has_validators == rhs.has_validators && |
| 168 always_revalidate == rhs.always_revalidate && score == rhs.score; | 221 always_revalidate == rhs.always_revalidate && score == rhs.score; |
| 169 } | 222 } |
| 170 | 223 |
| 224 // static | |
| 225 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) { | |
| 226 row->resource_url = GURL(proto.resource_url()); | |
| 227 row->resource_type = | |
| 228 static_cast<content::ResourceType>(proto.resource_type()); | |
| 229 row->number_of_hits = proto.number_of_hits(); | |
| 230 row->number_of_misses = proto.number_of_misses(); | |
| 231 row->consecutive_misses = proto.consecutive_misses(); | |
| 232 row->average_position = proto.average_position(); | |
| 233 row->priority = static_cast<net::RequestPriority>(proto.priority()); | |
| 234 row->has_validators = proto.has_validators(); | |
| 235 row->always_revalidate = proto.always_revalidate(); | |
| 236 row->UpdateScore(); | |
| 237 } | |
| 238 | |
| 171 void ResourceRow::ToProto(ResourceData* resource_data) const { | 239 void ResourceRow::ToProto(ResourceData* resource_data) const { |
| 172 using chrome_browser_predictors::ResourceData_Priority; | 240 using chrome_browser_predictors::ResourceData_Priority; |
| 173 using chrome_browser_predictors::ResourceData_ResourceType; | 241 using chrome_browser_predictors::ResourceData_ResourceType; |
| 174 | 242 |
| 175 resource_data->set_resource_url(resource_url.spec()); | 243 resource_data->set_resource_url(resource_url.spec()); |
| 176 resource_data->set_resource_type( | 244 resource_data->set_resource_type( |
| 177 static_cast<ResourceData_ResourceType>(resource_type)); | 245 static_cast<ResourceData_ResourceType>(resource_type)); |
| 178 resource_data->set_number_of_hits(number_of_hits); | 246 resource_data->set_number_of_hits(number_of_hits); |
| 179 resource_data->set_number_of_misses(number_of_misses); | 247 resource_data->set_number_of_misses(number_of_misses); |
| 180 resource_data->set_consecutive_misses(consecutive_misses); | 248 resource_data->set_consecutive_misses(consecutive_misses); |
| 181 resource_data->set_average_position(average_position); | 249 resource_data->set_average_position(average_position); |
| 182 resource_data->set_priority(static_cast<ResourceData_Priority>(priority)); | 250 resource_data->set_priority(static_cast<ResourceData_Priority>(priority)); |
| 183 resource_data->set_has_validators(has_validators); | 251 resource_data->set_has_validators(has_validators); |
| 184 resource_data->set_always_revalidate(always_revalidate); | 252 resource_data->set_always_revalidate(always_revalidate); |
| 185 } | 253 } |
| 186 | 254 |
| 187 // static | 255 // static |
| 188 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) { | 256 void ResourcePrefetchPredictorTables::SortResourceRows( |
| 189 row->resource_url = GURL(proto.resource_url()); | 257 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(), | 258 std::sort(rows->begin(), rows->end(), |
| 205 [](const ResourceRow& x, const ResourceRow& y) { | 259 [](const ResourceRow& x, const ResourceRow& y) { |
| 206 return x.score > y.score; | 260 return x.score > y.score; |
| 207 }); | 261 }); |
| 208 } | 262 } |
| 209 | 263 |
| 210 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( | 264 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( |
| 211 PrefetchKeyType i_key_type, | 265 PrefetchKeyType i_key_type, |
| 212 const std::string& i_primary_key) | 266 const std::string& i_primary_key) |
| 213 : key_type(i_key_type), | 267 : key_type(i_key_type), |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 224 | 278 |
| 225 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { | 279 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { |
| 226 } | 280 } |
| 227 | 281 |
| 228 bool ResourcePrefetchPredictorTables::PrefetchData::operator==( | 282 bool ResourcePrefetchPredictorTables::PrefetchData::operator==( |
| 229 const PrefetchData& rhs) const { | 283 const PrefetchData& rhs) const { |
| 230 return key_type == rhs.key_type && primary_key == rhs.primary_key && | 284 return key_type == rhs.key_type && primary_key == rhs.primary_key && |
| 231 resources == rhs.resources; | 285 resources == rhs.resources; |
| 232 } | 286 } |
| 233 | 287 |
| 288 RedirectRow::RedirectRow() | |
| 289 : number_of_hits(0), | |
| 290 number_of_misses(0), | |
| 291 consecutive_misses(0), | |
| 292 score(0.0) {} | |
| 293 | |
| 294 RedirectRow::RedirectRow(const RedirectRow& other) | |
| 295 : final_redirect(other.final_redirect), | |
| 296 number_of_hits(other.number_of_hits), | |
| 297 number_of_misses(other.number_of_misses), | |
| 298 consecutive_misses(other.consecutive_misses), | |
| 299 score(other.score) {} | |
| 300 | |
| 301 RedirectRow::RedirectRow( | |
| 302 const std::string& i_final_redirect, | |
| 303 size_t i_number_of_hits, | |
| 304 size_t i_number_of_misses, | |
| 305 size_t i_consecutive_misses) | |
| 306 : final_redirect(i_final_redirect), | |
| 307 number_of_hits(i_number_of_hits), | |
| 308 number_of_misses(i_number_of_misses), | |
| 309 consecutive_misses(i_consecutive_misses), | |
| 310 score(0.0) {} | |
| 311 | |
| 312 void RedirectRow::UpdateScore() { | |
| 313 // TODO(alexilin): invent some scoring | |
| 314 } | |
| 315 | |
| 316 bool RedirectRow::operator==(const RedirectRow& rhs) const { | |
| 317 return final_redirect == rhs.final_redirect && | |
| 318 number_of_hits == rhs.number_of_hits && | |
| 319 number_of_misses == rhs.number_of_misses && | |
| 320 consecutive_misses == rhs.consecutive_misses; | |
| 321 } | |
| 322 | |
| 323 // static | |
| 324 void RedirectRow::FromProto(const RedirectStat& proto, RedirectRow* row) { | |
| 325 row->final_redirect = proto.final_redirect(); | |
| 326 row->number_of_hits = proto.number_of_hits(); | |
| 327 row->number_of_misses = proto.number_of_misses(); | |
| 328 row->consecutive_misses = proto.consecutive_misses(); | |
| 329 row->UpdateScore(); | |
| 330 } | |
| 331 | |
| 332 void RedirectRow::ToProto(RedirectStat* redirect_stat) const { | |
| 333 redirect_stat->set_final_redirect(final_redirect); | |
| 334 redirect_stat->set_number_of_hits(number_of_hits); | |
| 335 redirect_stat->set_number_of_misses(number_of_misses); | |
| 336 redirect_stat->set_consecutive_misses(consecutive_misses); | |
| 337 } | |
| 338 | |
| 339 // static | |
| 340 void ResourcePrefetchPredictorTables::SortRedirectRows( | |
| 341 std::vector<RedirectRow>* rows) { | |
| 342 std::sort(rows->begin(), rows->end(), | |
| 343 [](const RedirectRow& x, const RedirectRow& y) { | |
| 344 return x.score > y.score; | |
| 345 }); | |
| 346 } | |
| 347 | |
| 348 ResourcePrefetchPredictorTables::RedirectData::RedirectData( | |
| 349 PrefetchKeyType i_key_type, | |
| 350 const std::string& i_primary_key) | |
| 351 : key_type(i_key_type), | |
| 352 primary_key(i_primary_key) {} | |
| 353 | |
| 354 ResourcePrefetchPredictorTables::RedirectData::RedirectData( | |
| 355 const RedirectData& other) | |
| 356 : key_type(other.key_type), | |
| 357 primary_key(other.primary_key), | |
| 358 last_visit(other.last_visit), | |
| 359 redirects(other.redirects) {} | |
| 360 | |
| 361 ResourcePrefetchPredictorTables::RedirectData::~RedirectData() { | |
| 362 } | |
| 363 | |
| 364 bool ResourcePrefetchPredictorTables::RedirectData::operator==( | |
| 365 const RedirectData& rhs) const { | |
| 366 return key_type == rhs.key_type && primary_key == rhs.primary_key && | |
| 367 redirects == rhs.redirects; | |
| 368 } | |
| 369 | |
| 234 void ResourcePrefetchPredictorTables::GetAllData( | 370 void ResourcePrefetchPredictorTables::GetAllData( |
| 235 PrefetchDataMap* url_data_map, | 371 PrefetchDataMap* url_data_map, |
| 236 PrefetchDataMap* host_data_map) { | 372 PrefetchDataMap* host_data_map, |
| 373 RedirectDataMap* url_redirect_data_map, | |
| 374 RedirectDataMap* host_redirect_data_map) { | |
| 237 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 375 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 238 if (CantAccessDatabase()) | 376 if (CantAccessDatabase()) |
| 239 return; | 377 return; |
| 240 | 378 |
| 241 DCHECK(url_data_map); | 379 DCHECK(url_data_map); |
| 242 DCHECK(host_data_map); | 380 DCHECK(host_data_map); |
| 381 DCHECK(url_redirect_data_map); | |
| 382 DCHECK(host_redirect_data_map); | |
| 243 url_data_map->clear(); | 383 url_data_map->clear(); |
| 244 host_data_map->clear(); | 384 host_data_map->clear(); |
| 385 url_redirect_data_map->clear(); | |
| 386 host_redirect_data_map->clear(); | |
| 245 | 387 |
| 246 std::vector<std::string> urls_to_delete, hosts_to_delete; | 388 std::vector<std::string> urls_to_delete, hosts_to_delete; |
| 389 std::vector<std::string> url_redirects_to_delete, host_redirects_to_delete; | |
| 247 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete); | 390 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete); |
| 248 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete); | 391 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete); |
| 392 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map, | |
| 393 &url_redirects_to_delete); | |
| 394 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map, | |
| 395 &host_redirects_to_delete); | |
| 249 | 396 |
| 250 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) | 397 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) |
| 251 DeleteData(urls_to_delete, hosts_to_delete); | 398 DeleteResourceData(urls_to_delete, hosts_to_delete); |
| 399 | |
| 400 if (!url_redirects_to_delete.empty() || !host_redirects_to_delete.empty()) | |
| 401 DeleteRedirectData(url_redirects_to_delete, host_redirects_to_delete); | |
| 252 } | 402 } |
| 253 | 403 |
| 254 void ResourcePrefetchPredictorTables::UpdateData( | 404 void ResourcePrefetchPredictorTables::UpdateData( |
| 255 const PrefetchData& url_data, | 405 const PrefetchData& url_data, |
| 256 const PrefetchData& host_data) { | 406 const PrefetchData& host_data, |
| 407 const RedirectData& url_redirect_data, | |
| 408 const RedirectData& host_redirect_data) { | |
| 257 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 409 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 258 if (CantAccessDatabase()) | 410 if (CantAccessDatabase()) |
| 259 return; | 411 return; |
| 260 | 412 |
| 261 DCHECK(!url_data.is_host() && host_data.is_host()); | 413 DCHECK(!url_data.is_host() && host_data.is_host()); |
| 262 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty()); | 414 DCHECK(!url_redirect_data.is_host() && host_redirect_data.is_host()); |
| 415 DCHECK(!url_data.primary_key.empty() || | |
| 416 !host_data.primary_key.empty() || | |
| 417 !url_redirect_data.primary_key.empty() || | |
| 418 !host_redirect_data.primary_key.empty()); | |
| 263 | 419 |
| 264 DB()->BeginTransaction(); | 420 DB()->BeginTransaction(); |
| 265 | 421 |
| 266 bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) && | 422 bool success = |
| 267 (host_data.primary_key.empty() || UpdateDataHelper(host_data)); | 423 (url_data.primary_key.empty() || |
| 424 UpdateDataHelper(url_data)) && | |
| 425 (host_data.primary_key.empty() || | |
| 426 UpdateDataHelper(host_data)) && | |
| 427 (url_redirect_data.primary_key.empty() || | |
| 428 UpdateDataHelper(url_redirect_data)) && | |
| 429 (host_redirect_data.primary_key.empty() || | |
| 430 UpdateDataHelper(host_redirect_data)); | |
| 268 if (!success) | 431 if (!success) |
| 269 DB()->RollbackTransaction(); | 432 DB()->RollbackTransaction(); |
| 270 | 433 |
| 271 DB()->CommitTransaction(); | 434 DB()->CommitTransaction(); |
| 272 } | 435 } |
| 273 | 436 |
| 274 void ResourcePrefetchPredictorTables::DeleteData( | 437 void ResourcePrefetchPredictorTables::DeleteResourceData( |
| 275 const std::vector<std::string>& urls, | 438 const std::vector<std::string>& urls, |
| 276 const std::vector<std::string>& hosts) { | 439 const std::vector<std::string>& hosts) { |
| 277 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 440 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 441 if (CantAccessDatabase()) | |
| 442 return; | |
| 443 | |
| 444 DCHECK(!urls.empty() || !hosts.empty()); | |
| 445 | |
| 446 if (!urls.empty()) | |
| 447 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_URL, urls); | |
| 448 if (!hosts.empty()) | |
| 449 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); | |
| 450 } | |
| 451 | |
| 452 void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint( | |
| 453 const std::string& key, | |
| 454 PrefetchKeyType key_type) { | |
| 455 DCHECK_CURRENTLY_ON(BrowserThread::DB); | |
| 456 if (CantAccessDatabase()) | |
| 457 return; | |
| 458 | |
| 459 DeleteResourceDataHelper(key_type, std::vector<std::string>(1, key)); | |
| 460 } | |
| 461 | |
| 462 void ResourcePrefetchPredictorTables::DeleteRedirectData( | |
| 463 const std::vector<std::string>& urls, | |
| 464 const std::vector<std::string>& hosts) { | |
| 465 DCHECK_CURRENTLY_ON(BrowserThread::DB); | |
| 278 if (CantAccessDatabase()) | 466 if (CantAccessDatabase()) |
| 279 return; | 467 return; |
| 280 | 468 |
| 281 DCHECK(!urls.empty() || !hosts.empty()); | 469 DCHECK(!urls.empty() || !hosts.empty()); |
| 282 | 470 |
| 283 if (!urls.empty()) | 471 if (!urls.empty()) |
| 284 DeleteDataHelper(PREFETCH_KEY_TYPE_URL, urls); | 472 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_URL, urls); |
| 285 if (!hosts.empty()) | 473 if (!hosts.empty()) |
| 286 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); | 474 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); |
| 287 } | 475 } |
| 288 | 476 |
| 289 void ResourcePrefetchPredictorTables::DeleteSingleDataPoint( | 477 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( |
| 290 const std::string& key, | 478 const std::string& key, |
| 291 PrefetchKeyType key_type) { | 479 PrefetchKeyType key_type) { |
| 292 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 480 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 293 if (CantAccessDatabase()) | 481 if (CantAccessDatabase()) |
| 294 return; | 482 return; |
| 295 | 483 |
| 296 DeleteDataHelper(key_type, std::vector<std::string>(1, key)); | 484 DeleteRedirectDataHelper(key_type, std::vector<std::string>(1, key)); |
|
mattcary
2016/09/14 15:37:08
wouldn't std::vector<std::string>{key} be a little
alexilin
2016/09/14 18:59:55
Actually, we could use just {key}. Or do we need m
mattcary
2016/09/15 09:04:34
{key} works even better. I'm still a little weak o
| |
| 297 } | 485 } |
| 298 | 486 |
| 299 void ResourcePrefetchPredictorTables::DeleteAllData() { | 487 void ResourcePrefetchPredictorTables::DeleteAllData() { |
| 300 if (CantAccessDatabase()) | 488 if (CantAccessDatabase()) |
| 301 return; | 489 return; |
| 302 | 490 |
| 303 Statement deleter; | 491 Statement deleter; |
| 304 for (const char* table_name : | 492 for (const char* table_name : |
| 305 {kUrlResourceTableName, kUrlMetadataTableName, kHostResourceTableName, | 493 {kUrlResourceTableName, kUrlRedirectTableName, |
| 306 kHostMetadataTableName}) { | 494 kUrlResourceMetadataTableName, kUrlRedirectMetadataTableName, |
| 495 kHostResourceTableName, kHostRedirectTableName, | |
| 496 kHostResourceMetadataTableName, kHostRedirectMetadataTableName}) { | |
| 307 deleter.Assign(DB()->GetUniqueStatement( | 497 deleter.Assign(DB()->GetUniqueStatement( |
| 308 base::StringPrintf("DELETE FROM %s", table_name).c_str())); | 498 base::StringPrintf("DELETE FROM %s", table_name).c_str())); |
| 309 deleter.Run(); | 499 deleter.Run(); |
| 310 } | 500 } |
| 311 } | 501 } |
| 312 | 502 |
| 313 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() | 503 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() |
| 314 : PredictorTableBase() { | 504 : PredictorTableBase() { |
| 315 } | 505 } |
| 316 | 506 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 339 } | 529 } |
| 340 it->second.resources.push_back(row); | 530 it->second.resources.push_back(row); |
| 341 } | 531 } |
| 342 | 532 |
| 343 // Sort each of the resource row vectors by score. | 533 // Sort each of the resource row vectors by score. |
| 344 for (auto& kv : *data_map) | 534 for (auto& kv : *data_map) |
| 345 SortResourceRows(&(kv.second.resources)); | 535 SortResourceRows(&(kv.second.resources)); |
| 346 | 536 |
| 347 // Read the metadata and keep track of entries that have metadata, but no | 537 // Read the metadata and keep track of entries that have metadata, but no |
| 348 // resource entries, so they can be deleted. | 538 // resource entries, so they can be deleted. |
| 349 const char* metadata_table_name = is_host ? kHostMetadataTableName : | 539 const char* metadata_table_name = is_host ? kHostResourceMetadataTableName : |
| 350 kUrlMetadataTableName; | 540 kUrlResourceMetadataTableName; |
| 351 Statement metadata_reader(DB()->GetUniqueStatement( | 541 Statement metadata_reader(DB()->GetUniqueStatement( |
| 352 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); | 542 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); |
| 353 | 543 |
| 354 while (metadata_reader.Step()) { | 544 while (metadata_reader.Step()) { |
| 355 std::string primary_key = metadata_reader.ColumnString(0); | 545 std::string primary_key = metadata_reader.ColumnString(0); |
| 356 | 546 |
| 357 PrefetchDataMap::iterator it = data_map->find(primary_key); | 547 PrefetchDataMap::iterator it = data_map->find(primary_key); |
| 358 if (it != data_map->end()) { | 548 if (it != data_map->end()) { |
| 359 int64_t last_visit = metadata_reader.ColumnInt64(1); | 549 int64_t last_visit = metadata_reader.ColumnInt64(1); |
| 360 it->second.last_visit = base::Time::FromInternalValue(last_visit); | 550 it->second.last_visit = base::Time::FromInternalValue(last_visit); |
| 361 } else { | 551 } else { |
| 362 to_delete->push_back(primary_key); | 552 to_delete->push_back(primary_key); |
| 363 } | 553 } |
| 364 } | 554 } |
| 365 } | 555 } |
| 366 | 556 |
| 557 void ResourcePrefetchPredictorTables::GetAllDataHelper( | |
| 558 PrefetchKeyType key_type, | |
|
mattcary
2016/09/14 15:37:09
I think I'd prefer to rename the function rather t
alexilin
2016/09/14 18:59:55
Done.
| |
| 559 RedirectDataMap* redirect_map, | |
| 560 std::vector<std::string>* to_delete) { | |
| 561 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | |
| 562 | |
| 563 const char* redirect_table_name = is_host ? kHostRedirectTableName : | |
| 564 kUrlRedirectTableName; | |
| 565 Statement redirect_reader(DB()->GetUniqueStatement( | |
| 566 base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str())); | |
| 567 | |
| 568 RedirectRow row; | |
| 569 std::string primary_key; | |
| 570 while (StepAndInitializeRedirectRow(&redirect_reader, &row, &primary_key)) { | |
| 571 RedirectDataMap::iterator it = redirect_map->find(primary_key); | |
| 572 if (it == redirect_map->end()) { | |
| 573 it = redirect_map->insert(std::make_pair( | |
| 574 primary_key, RedirectData(key_type, primary_key))).first; | |
| 575 } | |
| 576 it->second.redirects.push_back(row); | |
| 577 } | |
| 578 | |
| 579 // Sort each of the redirect row vectors by score. | |
| 580 for (auto& kv : *redirect_map) | |
| 581 SortRedirectRows(&(kv.second.redirects)); | |
| 582 | |
| 583 // Read the metadata and keep track of entries that have metadata, but no | |
| 584 // redirect entries, so they can be deleted | |
| 585 const char* metadata_table_name = is_host ? kHostRedirectMetadataTableName : | |
| 586 kUrlRedirectMetadataTableName; | |
| 587 Statement metadata_reader(DB()->GetUniqueStatement( | |
| 588 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); | |
| 589 | |
| 590 while (metadata_reader.Step()) { | |
| 591 std::string primary_key = metadata_reader.ColumnString(0); | |
| 592 | |
| 593 RedirectDataMap::iterator it = redirect_map->find(primary_key); | |
| 594 if (it != redirect_map->end()) { | |
| 595 int64_t last_visit = metadata_reader.ColumnInt64(1); | |
| 596 it->second.last_visit = base::Time::FromInternalValue(last_visit); | |
| 597 } else { | |
| 598 to_delete->push_back(primary_key); | |
| 599 } | |
| 600 } | |
| 601 } | |
| 602 | |
| 367 bool ResourcePrefetchPredictorTables::UpdateDataHelper( | 603 bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| 368 const PrefetchData& data) { | 604 const PrefetchData& data) { |
| 369 DCHECK(!data.primary_key.empty()); | 605 DCHECK(!data.primary_key.empty()); |
| 370 | 606 |
| 371 if (!StringsAreSmallerThanDBLimit(data)) { | 607 if (!StringsAreSmallerThanDBLimit(data)) { |
| 372 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); | 608 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); |
| 373 return false; | 609 return false; |
| 374 } | 610 } |
| 375 | 611 |
| 376 // Delete the older data from both the tables. | 612 // Delete the older data from both the tables. |
| 377 std::unique_ptr<Statement> deleter(data.is_host() | 613 std::unique_ptr<Statement> deleter(data.is_host() |
| 378 ? GetHostResourceDeleteStatement() | 614 ? GetHostResourceDeleteStatement() |
| 379 : GetUrlResourceDeleteStatement()); | 615 : GetUrlResourceDeleteStatement()); |
| 380 deleter->BindString(0, data.primary_key); | 616 deleter->BindString(0, data.primary_key); |
| 381 if (!deleter->Run()) | 617 if (!deleter->Run()) |
| 382 return false; | 618 return false; |
| 383 | 619 |
| 384 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() : | 620 deleter.reset(data.is_host() ? GetHostResourceMetadataDeleteStatement() : |
| 385 GetUrlMetadataDeleteStatement()); | 621 GetUrlResourceMetadataDeleteStatement()); |
| 386 deleter->BindString(0, data.primary_key); | 622 deleter->BindString(0, data.primary_key); |
| 387 if (!deleter->Run()) | 623 if (!deleter->Run()) |
| 388 return false; | 624 return false; |
| 389 | 625 |
| 390 // Add the new data to the tables. | 626 // Add the new data to the tables. |
| 391 for (const ResourceRow& resource : data.resources) { | 627 for (const ResourceRow& resource : data.resources) { |
| 392 std::unique_ptr<Statement> resource_inserter( | 628 std::unique_ptr<Statement> resource_inserter( |
| 393 data.is_host() ? GetHostResourceUpdateStatement() | 629 data.is_host() ? GetHostResourceUpdateStatement() |
| 394 : GetUrlResourceUpdateStatement()); | 630 : GetUrlResourceUpdateStatement()); |
| 395 BindResourceRowToStatement(resource, data.primary_key, | 631 BindResourceRowToStatement(resource, data.primary_key, |
| 396 resource_inserter.get()); | 632 resource_inserter.get()); |
| 397 if (!resource_inserter->Run()) | 633 if (!resource_inserter->Run()) |
| 398 return false; | 634 return false; |
| 399 } | 635 } |
| 400 | 636 |
| 401 std::unique_ptr<Statement> metadata_inserter( | 637 std::unique_ptr<Statement> metadata_inserter( |
| 402 data.is_host() ? GetHostMetadataUpdateStatement() | 638 data.is_host() ? GetHostResourceMetadataUpdateStatement() |
| 403 : GetUrlMetadataUpdateStatement()); | 639 : GetUrlResourceMetadataUpdateStatement()); |
| 404 metadata_inserter->BindString(0, data.primary_key); | 640 metadata_inserter->BindString(0, data.primary_key); |
| 405 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); | 641 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); |
| 406 if (!metadata_inserter->Run()) | 642 if (!metadata_inserter->Run()) |
| 643 return false; | |
| 644 | |
| 645 return true; | |
| 646 } | |
| 647 | |
| 648 bool ResourcePrefetchPredictorTables::UpdateDataHelper( | |
| 649 const RedirectData& data) { | |
| 650 DCHECK(!data.primary_key.empty()); | |
| 651 | |
| 652 if (!StringsAreSmallerThanDBLimit(data)) { | |
| 653 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); | |
| 654 return false; | |
| 655 } | |
| 656 | |
| 657 // Delete the older data from the table. | |
| 658 std::unique_ptr<Statement> deleter(data.is_host() | |
| 659 ? GetHostRedirectDeleteStatement() | |
| 660 : GetUrlRedirectDeleteStatement()); | |
| 661 deleter->BindString(0, data.primary_key); | |
| 662 if (!deleter->Run()) | |
| 663 return false; | |
| 664 | |
| 665 deleter.reset(data.is_host() ? GetHostRedirectMetadataDeleteStatement() : | |
| 666 GetUrlRedirectMetadataDeleteStatement()); | |
| 667 deleter->BindString(0, data.primary_key); | |
| 668 if (!deleter->Run()) | |
| 669 return false; | |
| 670 | |
| 671 // Add the new data to the table. | |
| 672 for (const RedirectRow& row : data.redirects) { | |
| 673 std::unique_ptr<Statement> row_inserter( | |
| 674 data.is_host() ? GetHostRedirectUpdateStatement() | |
| 675 : GetUrlRedirectUpdateStatement()); | |
| 676 BindRedirectRowToStatement(row, data.primary_key, row_inserter.get()); | |
| 677 if (!row_inserter->Run()) | |
| 678 return false; | |
| 679 } | |
| 680 | |
| 681 std::unique_ptr<Statement> metadata_inserter( | |
| 682 data.is_host() ? GetHostRedirectMetadataUpdateStatement() | |
| 683 : GetUrlRedirectMetadataUpdateStatement()); | |
| 684 metadata_inserter->BindString(0, data.primary_key); | |
| 685 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); | |
| 686 if (!metadata_inserter->Run()) | |
| 407 return false; | 687 return false; |
| 408 | 688 |
| 409 return true; | 689 return true; |
| 410 } | 690 } |
| 411 | 691 |
| 412 void ResourcePrefetchPredictorTables::DeleteDataHelper( | 692 void ResourcePrefetchPredictorTables::DeleteResourceDataHelper( |
| 413 PrefetchKeyType key_type, | 693 PrefetchKeyType key_type, |
| 414 const std::vector<std::string>& keys) { | 694 const std::vector<std::string>& keys) { |
| 415 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | 695 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| 416 | 696 |
| 417 for (const std::string& key : keys) { | 697 for (const std::string& key : keys) { |
| 418 std::unique_ptr<Statement> deleter(is_host | 698 std::unique_ptr<Statement> deleter(is_host |
| 419 ? GetHostResourceDeleteStatement() | 699 ? GetHostResourceDeleteStatement() |
| 420 : GetUrlResourceDeleteStatement()); | 700 : GetUrlResourceDeleteStatement()); |
| 421 deleter->BindString(0, key); | 701 deleter->BindString(0, key); |
| 422 deleter->Run(); | 702 deleter->Run(); |
| 423 | 703 |
| 424 deleter.reset(is_host ? GetHostMetadataDeleteStatement() : | 704 deleter.reset(is_host ? GetHostResourceMetadataDeleteStatement() : |
| 425 GetUrlMetadataDeleteStatement()); | 705 GetUrlResourceMetadataDeleteStatement()); |
| 426 deleter->BindString(0, key); | 706 deleter->BindString(0, key); |
| 427 deleter->Run(); | 707 deleter->Run(); |
| 428 } | 708 } |
| 709 } | |
| 710 | |
| 711 void ResourcePrefetchPredictorTables::DeleteRedirectDataHelper( | |
| 712 PrefetchKeyType key_type, | |
| 713 const std::vector<std::string>& keys) { | |
| 714 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | |
| 715 | |
| 716 for (const std::string& key : keys) { | |
| 717 std::unique_ptr<Statement> deleter(is_host | |
| 718 ? GetHostRedirectDeleteStatement() | |
| 719 : GetUrlRedirectDeleteStatement()); | |
| 720 deleter->BindString(0, key); | |
| 721 deleter->Run(); | |
| 722 | |
| 723 deleter.reset(is_host ? GetHostRedirectMetadataDeleteStatement() : | |
| 724 GetUrlRedirectMetadataDeleteStatement()); | |
| 725 deleter->BindString(0, key); | |
| 726 deleter->Run(); | |
| 727 } | |
| 429 } | 728 } |
| 430 | 729 |
| 431 // static | 730 // static |
| 432 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( | 731 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( |
| 433 const PrefetchData& data) { | 732 const PrefetchData& data) { |
| 434 if (data.primary_key.length() > kMaxStringLength) | 733 if (data.primary_key.length() > kMaxStringLength) |
| 435 return false; | 734 return false; |
| 436 | 735 |
| 437 for (const ResourceRow& row : data.resources) { | 736 for (const ResourceRow& row : data.resources) { |
| 438 if (row.resource_url.spec().length() > kMaxStringLength) | 737 if (row.resource_url.spec().length() > kMaxStringLength) |
| 439 return false; | 738 return false; |
| 440 } | 739 } |
| 441 return true; | 740 return true; |
| 442 } | 741 } |
| 443 | 742 |
| 444 // static | 743 // static |
| 744 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( | |
| 745 const RedirectData& data) { | |
| 746 if (data.primary_key.length() > kMaxStringLength) | |
| 747 return false; | |
| 748 | |
| 749 for (const RedirectRow& row : data.redirects) { | |
| 750 if (row.final_redirect.length() > kMaxStringLength) | |
| 751 return false; | |
| 752 } | |
| 753 return true; | |
| 754 } | |
| 755 | |
| 756 // static | |
| 445 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( | 757 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( |
| 446 sql::Connection* db) { | 758 sql::Connection* db) { |
| 447 int version = GetDatabaseVersion(db); | 759 int version = GetDatabaseVersion(db); |
| 448 bool success = true; | 760 bool success = true; |
| 449 // Too new is also a problem. | 761 // Too new is also a problem. |
| 450 bool incompatible_version = version != kDatabaseVersion; | 762 bool incompatible_version = version != kDatabaseVersion; |
| 451 | 763 |
| 452 if (incompatible_version) { | 764 if (incompatible_version) { |
| 453 for (const char* table_name : | 765 for (const char* table_name : |
| 454 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, | 766 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, |
| 455 kUrlMetadataTableName, kHostMetadataTableName}) { | 767 kUrlRedirectTableName, kHostRedirectTableName, |
| 768 kUrlResourceMetadataTableName, kHostResourceMetadataTableName, | |
| 769 kUrlRedirectMetadataTableName, kHostRedirectMetadataTableName}) { | |
| 456 success = | 770 success = |
| 457 success && | 771 success && |
| 458 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) | 772 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) |
| 459 .c_str()); | 773 .c_str()); |
| 460 } | 774 } |
| 461 } | 775 } |
| 462 | 776 |
| 463 if (incompatible_version) { | 777 if (incompatible_version) { |
| 464 success = | 778 success = |
| 465 success && | 779 success && |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 508 bool success = transaction.Begin(); | 822 bool success = transaction.Begin(); |
| 509 | 823 |
| 510 success = success && DropTablesIfOutdated(db); | 824 success = success && DropTablesIfOutdated(db); |
| 511 | 825 |
| 512 success = | 826 success = |
| 513 success && | 827 success && |
| 514 (db->DoesTableExist(kUrlResourceTableName) || | 828 (db->DoesTableExist(kUrlResourceTableName) || |
| 515 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, | 829 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, |
| 516 kUrlResourceTableName) | 830 kUrlResourceTableName) |
| 517 .c_str())) && | 831 .c_str())) && |
| 518 (db->DoesTableExist(kUrlMetadataTableName) || | 832 (db->DoesTableExist(kUrlRedirectTableName) || |
| 833 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, | |
| 834 kUrlRedirectTableName) | |
| 835 .c_str())) && | |
| 836 (db->DoesTableExist(kUrlResourceMetadataTableName) || | |
| 519 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, | 837 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, |
| 520 kUrlMetadataTableName) | 838 kUrlResourceMetadataTableName) |
| 839 .c_str())) && | |
| 840 (db->DoesTableExist(kUrlRedirectMetadataTableName) || | |
| 841 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, | |
| 842 kUrlRedirectMetadataTableName) | |
| 521 .c_str())) && | 843 .c_str())) && |
| 522 (db->DoesTableExist(kHostResourceTableName) || | 844 (db->DoesTableExist(kHostResourceTableName) || |
| 523 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, | 845 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, |
| 524 kHostResourceTableName) | 846 kHostResourceTableName) |
| 525 .c_str())) && | 847 .c_str())) && |
| 526 (db->DoesTableExist(kHostMetadataTableName) || | 848 (db->DoesTableExist(kHostRedirectTableName) || |
| 849 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, | |
| 850 kHostRedirectTableName) | |
| 851 .c_str())) && | |
| 852 (db->DoesTableExist(kHostResourceMetadataTableName) || | |
| 527 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, | 853 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, |
| 528 kHostMetadataTableName) | 854 kHostResourceMetadataTableName) |
| 855 .c_str())); | |
| 856 (db->DoesTableExist(kHostRedirectMetadataTableName) || | |
| 857 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, | |
| 858 kHostRedirectMetadataTableName) | |
| 529 .c_str())); | 859 .c_str())); |
| 530 | 860 |
| 531 if (success) | 861 if (success) |
| 532 success = transaction.Commit(); | 862 success = transaction.Commit(); |
| 533 else | 863 else |
| 534 transaction.Rollback(); | 864 transaction.Rollback(); |
| 535 | 865 |
| 536 if (!success) | 866 if (!success) |
| 537 ResetDB(); | 867 ResetDB(); |
| 538 } | 868 } |
| 539 | 869 |
| 540 void ResourcePrefetchPredictorTables::LogDatabaseStats() { | 870 void ResourcePrefetchPredictorTables::LogDatabaseStats() { |
| 541 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 871 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 542 if (CantAccessDatabase()) | 872 if (CantAccessDatabase()) |
| 543 return; | 873 return; |
| 544 | 874 |
| 545 Statement statement(DB()->GetUniqueStatement( | 875 Statement statement(DB()->GetUniqueStatement( |
| 546 base::StringPrintf("SELECT count(*) FROM %s", | 876 base::StringPrintf("SELECT count(*) FROM %s", |
| 547 kUrlResourceTableName).c_str())); | 877 kUrlResourceTableName).c_str())); |
| 548 if (statement.Step()) | 878 if (statement.Step()) |
| 549 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount", | 879 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount", |
| 550 statement.ColumnInt(0)); | 880 statement.ColumnInt(0)); |
| 551 | 881 |
| 552 statement.Assign(DB()->GetUniqueStatement( | 882 statement.Assign(DB()->GetUniqueStatement( |
| 553 base::StringPrintf("SELECT count(*) FROM %s", | 883 base::StringPrintf("SELECT count(*) FROM %s", |
| 554 kHostResourceTableName).c_str())); | 884 kHostResourceTableName).c_str())); |
| 555 if (statement.Step()) | 885 if (statement.Step()) |
| 556 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", | 886 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", |
| 557 statement.ColumnInt(0)); | 887 statement.ColumnInt(0)); |
| 888 | |
| 889 statement.Assign(DB()->GetUniqueStatement( | |
| 890 base::StringPrintf("SELECT count(*) FROM %s", | |
| 891 kUrlRedirectTableName).c_str())); | |
| 892 if (statement.Step()) | |
| 893 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlRedirectTableRowCount", | |
| 894 statement.ColumnInt(0)); | |
| 895 | |
| 896 statement.Assign(DB()->GetUniqueStatement( | |
| 897 base::StringPrintf("SELECT count(*) FROM %s", | |
| 898 kHostRedirectTableName).c_str())); | |
| 899 if (statement.Step()) | |
| 900 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostRedirectTableRowCount", | |
| 901 statement.ColumnInt(0)); | |
| 558 } | 902 } |
| 559 | 903 |
| 560 Statement* | 904 Statement* |
| 561 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() { | 905 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() { |
| 562 return new Statement(DB()->GetCachedStatement( | 906 return new Statement(DB()->GetCachedStatement( |
| 563 SQL_FROM_HERE, | 907 SQL_FROM_HERE, |
| 564 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName) | 908 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName) |
| 565 .c_str())); | 909 .c_str())); |
| 566 } | 910 } |
| 567 | 911 |
| 568 Statement* | 912 Statement* |
| 569 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() { | 913 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() { |
| 570 return new Statement(DB()->GetCachedStatement( | 914 return new Statement(DB()->GetCachedStatement( |
| 571 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, | 915 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, |
| 572 kUrlResourceTableName) | 916 kUrlResourceTableName) |
| 573 .c_str())); | 917 .c_str())); |
| 574 } | 918 } |
| 575 | 919 |
| 576 Statement* | 920 Statement* |
| 577 ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() { | 921 ResourcePrefetchPredictorTables::GetUrlResourceMetadataDeleteStatement() { |
| 578 return new Statement(DB()->GetCachedStatement( | 922 return new Statement(DB()->GetCachedStatement( |
| 579 SQL_FROM_HERE, | 923 SQL_FROM_HERE, |
| 580 base::StringPrintf(kDeleteStatementTemplate, kUrlMetadataTableName) | 924 base::StringPrintf(kDeleteStatementTemplate, |
| 925 kUrlResourceMetadataTableName) | |
| 581 .c_str())); | 926 .c_str())); |
| 582 } | 927 } |
| 583 | 928 |
| 584 Statement* | 929 Statement* |
| 585 ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() { | 930 ResourcePrefetchPredictorTables::GetUrlResourceMetadataUpdateStatement() { |
| 586 return new Statement(DB()->GetCachedStatement( | 931 return new Statement(DB()->GetCachedStatement( |
| 587 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, | 932 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, |
| 588 kUrlMetadataTableName) | 933 kUrlResourceMetadataTableName) |
| 589 .c_str())); | 934 .c_str())); |
| 590 } | 935 } |
| 591 | 936 |
| 937 Statement* | |
| 938 ResourcePrefetchPredictorTables::GetUrlRedirectDeleteStatement() { | |
| 939 return new Statement(DB()->GetCachedStatement( | |
| 940 SQL_FROM_HERE, | |
| 941 base::StringPrintf(kDeleteStatementTemplate, kUrlRedirectTableName) | |
| 942 .c_str())); | |
| 943 } | |
| 944 | |
| 945 Statement* | |
| 946 ResourcePrefetchPredictorTables::GetUrlRedirectUpdateStatement() { | |
| 947 return new Statement(DB()->GetCachedStatement( | |
| 948 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate, | |
| 949 kUrlRedirectTableName) | |
| 950 .c_str())); | |
| 951 } | |
| 952 | |
| 953 Statement* | |
| 954 ResourcePrefetchPredictorTables::GetUrlRedirectMetadataDeleteStatement() { | |
| 955 return new Statement(DB()->GetCachedStatement( | |
| 956 SQL_FROM_HERE, | |
| 957 base::StringPrintf(kDeleteStatementTemplate, | |
| 958 kUrlRedirectMetadataTableName) | |
| 959 .c_str())); | |
| 960 } | |
| 961 | |
| 962 Statement* | |
| 963 ResourcePrefetchPredictorTables::GetUrlRedirectMetadataUpdateStatement() { | |
| 964 return new Statement(DB()->GetCachedStatement( | |
| 965 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, | |
| 966 kUrlRedirectMetadataTableName) | |
| 967 .c_str())); | |
| 968 } | |
| 969 | |
| 592 Statement* | 970 Statement* |
| 593 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { | 971 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { |
| 594 return new Statement(DB()->GetCachedStatement( | 972 return new Statement(DB()->GetCachedStatement( |
| 595 SQL_FROM_HERE, | 973 SQL_FROM_HERE, |
| 596 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName) | 974 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName) |
| 597 .c_str())); | 975 .c_str())); |
| 598 } | 976 } |
| 599 | 977 |
| 600 Statement* | 978 Statement* |
| 601 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() { | 979 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() { |
| 602 return new Statement(DB()->GetCachedStatement( | 980 return new Statement(DB()->GetCachedStatement( |
| 603 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, | 981 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, |
| 604 kHostResourceTableName) | 982 kHostResourceTableName) |
| 605 .c_str())); | 983 .c_str())); |
| 606 } | 984 } |
| 607 | 985 |
| 608 Statement* | 986 Statement* |
| 609 ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() { | 987 ResourcePrefetchPredictorTables::GetHostResourceMetadataDeleteStatement() { |
| 610 return new Statement(DB()->GetCachedStatement( | 988 return new Statement(DB()->GetCachedStatement( |
| 611 SQL_FROM_HERE, | 989 SQL_FROM_HERE, base::StringPrintf(kDeleteStatementTemplate, |
| 612 base::StringPrintf(kDeleteStatementTemplate, kHostMetadataTableName) | 990 kHostResourceMetadataTableName) |
| 613 .c_str())); | 991 .c_str())); |
| 614 } | 992 } |
| 615 | 993 |
| 616 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { | 994 Statement* |
| 995 ResourcePrefetchPredictorTables::GetHostResourceMetadataUpdateStatement() { | |
| 617 return new Statement(DB()->GetCachedStatement( | 996 return new Statement(DB()->GetCachedStatement( |
| 618 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, | 997 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, |
| 619 kHostMetadataTableName) | 998 kHostResourceMetadataTableName) |
| 620 .c_str())); | 999 .c_str())); |
| 621 } | 1000 } |
| 622 | 1001 |
| 1002 Statement* | |
| 1003 ResourcePrefetchPredictorTables::GetHostRedirectDeleteStatement() { | |
| 1004 return new Statement(DB()->GetCachedStatement( | |
| 1005 SQL_FROM_HERE, | |
| 1006 base::StringPrintf(kDeleteStatementTemplate, kHostRedirectTableName) | |
| 1007 .c_str())); | |
| 1008 } | |
| 1009 | |
| 1010 Statement* | |
| 1011 ResourcePrefetchPredictorTables::GetHostRedirectUpdateStatement() { | |
| 1012 return new Statement(DB()->GetCachedStatement( | |
| 1013 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate, | |
| 1014 kHostRedirectTableName) | |
| 1015 .c_str())); | |
| 1016 } | |
| 1017 | |
| 1018 Statement* | |
| 1019 ResourcePrefetchPredictorTables::GetHostRedirectMetadataDeleteStatement() { | |
| 1020 return new Statement(DB()->GetCachedStatement( | |
| 1021 SQL_FROM_HERE, base::StringPrintf(kDeleteStatementTemplate, | |
| 1022 kHostRedirectMetadataTableName) | |
| 1023 .c_str())); | |
| 1024 } | |
| 1025 | |
| 1026 Statement* | |
| 1027 ResourcePrefetchPredictorTables::GetHostRedirectMetadataUpdateStatement() { | |
| 1028 return new Statement(DB()->GetCachedStatement( | |
| 1029 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, | |
| 1030 kHostRedirectMetadataTableName) | |
| 1031 .c_str())); | |
| 1032 } | |
| 1033 | |
| 623 } // namespace predictors | 1034 } // namespace predictors |
| OLD | NEW |