| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 const char kCreateGlobalMetadataStatementTemplate[] = | 30 const char kCreateGlobalMetadataStatementTemplate[] = |
| 31 "CREATE TABLE %s ( " | 31 "CREATE TABLE %s ( " |
| 32 "key TEXT, value INTEGER, " | 32 "key TEXT, value INTEGER, " |
| 33 "PRIMARY KEY (key))"; | 33 "PRIMARY KEY (key))"; |
| 34 const char kCreateProtoTableStatementTemplate[] = | 34 const char kCreateProtoTableStatementTemplate[] = |
| 35 "CREATE TABLE %s ( " | 35 "CREATE TABLE %s ( " |
| 36 "key TEXT, " | 36 "key TEXT, " |
| 37 "proto BLOB, " | 37 "proto BLOB, " |
| 38 "PRIMARY KEY(key))"; | 38 "PRIMARY KEY(key))"; |
| 39 const char kInsertProtoStatementTemplate[] = | |
| 40 "INSERT INTO %s (key, proto) VALUES (?,?)"; | |
| 41 const char kDeleteProtoStatementTemplate[] = "DELETE FROM %s WHERE key=?"; | |
| 42 const char kSelectAllStatementTemplate[] = "SELECT * FROM %s"; | |
| 43 | |
| 44 void BindProtoDataToStatement(const std::string& key, | |
| 45 const MessageLite& data, | |
| 46 sql::Statement* statement) { | |
| 47 int size = data.ByteSize(); | |
| 48 DCHECK_GT(size, 0); | |
| 49 std::vector<char> proto_buffer(size); | |
| 50 data.SerializeToArray(&proto_buffer[0], size); | |
| 51 | |
| 52 statement->BindString(0, key); | |
| 53 statement->BindBlob(1, &proto_buffer[0], size); | |
| 54 } | |
| 55 | |
| 56 bool StepAndInitializeProtoData(sql::Statement* statement, | |
| 57 std::string* key, | |
| 58 MessageLite* data) { | |
| 59 if (!statement->Step()) | |
| 60 return false; | |
| 61 | |
| 62 *key = statement->ColumnString(0); | |
| 63 | |
| 64 int size = statement->ColumnByteLength(1); | |
| 65 const void* blob = statement->ColumnBlob(1); | |
| 66 DCHECK(blob); | |
| 67 data->ParseFromArray(blob, size); | |
| 68 | |
| 69 return true; | |
| 70 } | |
| 71 | 39 |
| 72 } // namespace | 40 } // namespace |
| 73 | 41 |
| 74 namespace predictors { | 42 namespace predictors { |
| 75 | 43 |
| 76 using content::BrowserThread; | 44 using content::BrowserThread; |
| 77 | 45 |
| 78 // static | 46 // static |
| 79 void ResourcePrefetchPredictorTables::TrimResources( | 47 void ResourcePrefetchPredictorTables::TrimResources( |
| 80 PrefetchData* data, | 48 PrefetchData* data, |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 DCHECK(host_redirect_data_map); | 118 DCHECK(host_redirect_data_map); |
| 151 DCHECK(manifest_map); | 119 DCHECK(manifest_map); |
| 152 DCHECK(origin_data_map); | 120 DCHECK(origin_data_map); |
| 153 url_data_map->clear(); | 121 url_data_map->clear(); |
| 154 host_data_map->clear(); | 122 host_data_map->clear(); |
| 155 url_redirect_data_map->clear(); | 123 url_redirect_data_map->clear(); |
| 156 host_redirect_data_map->clear(); | 124 host_redirect_data_map->clear(); |
| 157 manifest_map->clear(); | 125 manifest_map->clear(); |
| 158 origin_data_map->clear(); | 126 origin_data_map->clear(); |
| 159 | 127 |
| 160 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map); | 128 url_resource_table_->GetAllData(url_data_map); |
| 161 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map); | 129 host_resource_table_->GetAllData(host_data_map); |
| 162 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); | 130 url_redirect_table_->GetAllData(url_redirect_data_map); |
| 163 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); | 131 host_redirect_table_->GetAllData(host_redirect_data_map); |
| 164 GetAllManifestDataHelper(manifest_map); | 132 manifest_table_->GetAllData(manifest_map); |
| 165 GetAllOriginDataHelper(origin_data_map); | 133 origin_table_->GetAllData(origin_data_map); |
| 166 } | 134 } |
| 167 | 135 |
| 168 void ResourcePrefetchPredictorTables::UpdateResourceData( | 136 void ResourcePrefetchPredictorTables::UpdateResourceData( |
| 169 const PrefetchData& data, | 137 const PrefetchData& data, |
| 170 PrefetchKeyType key_type) { | 138 PrefetchKeyType key_type) { |
| 171 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateResourceData"); | 139 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateResourceData"); |
| 172 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 140 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 173 if (CantAccessDatabase()) | 141 if (CantAccessDatabase()) |
| 174 return; | 142 return; |
| 175 | 143 |
| 176 UpdateDataHelper(key_type, PrefetchDataType::RESOURCE, data.primary_key(), | 144 if (key_type == PREFETCH_KEY_TYPE_URL) |
| 177 data); | 145 url_resource_table_->UpdateData(data.primary_key(), data); |
| 146 else |
| 147 host_resource_table_->UpdateData(data.primary_key(), data); |
| 178 } | 148 } |
| 179 | 149 |
| 180 void ResourcePrefetchPredictorTables::UpdateRedirectData( | 150 void ResourcePrefetchPredictorTables::UpdateRedirectData( |
| 181 const RedirectData& data, | 151 const RedirectData& data, |
| 182 PrefetchKeyType key_type) { | 152 PrefetchKeyType key_type) { |
| 183 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateRedirectData"); | 153 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateRedirectData"); |
| 184 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 154 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 185 if (CantAccessDatabase()) | 155 if (CantAccessDatabase()) |
| 186 return; | 156 return; |
| 187 | 157 |
| 188 UpdateDataHelper(key_type, PrefetchDataType::REDIRECT, data.primary_key(), | 158 if (key_type == PREFETCH_KEY_TYPE_URL) |
| 189 data); | 159 url_redirect_table_->UpdateData(data.primary_key(), data); |
| 160 else |
| 161 host_redirect_table_->UpdateData(data.primary_key(), data); |
| 190 } | 162 } |
| 191 | 163 |
| 192 void ResourcePrefetchPredictorTables::UpdateManifestData( | 164 void ResourcePrefetchPredictorTables::UpdateManifestData( |
| 193 const std::string& host, | 165 const std::string& host, |
| 194 const precache::PrecacheManifest& manifest_data) { | 166 const precache::PrecacheManifest& manifest_data) { |
| 195 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateManifestData"); | 167 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateManifestData"); |
| 196 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 168 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 197 if (CantAccessDatabase()) | 169 if (CantAccessDatabase()) |
| 198 return; | 170 return; |
| 199 | 171 |
| 200 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, | 172 manifest_table_->UpdateData(host, manifest_data); |
| 201 manifest_data); | |
| 202 } | 173 } |
| 203 | 174 |
| 204 void ResourcePrefetchPredictorTables::UpdateOriginData( | 175 void ResourcePrefetchPredictorTables::UpdateOriginData( |
| 205 const OriginData& origin_data) { | 176 const OriginData& origin_data) { |
| 206 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateOriginData"); | 177 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateOriginData"); |
| 207 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 178 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 208 if (CantAccessDatabase()) | 179 if (CantAccessDatabase()) |
| 209 return; | 180 return; |
| 210 | 181 |
| 211 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::ORIGIN, | 182 origin_table_->UpdateData(origin_data.host(), origin_data); |
| 212 origin_data.host(), origin_data); | |
| 213 } | 183 } |
| 214 | 184 |
| 215 void ResourcePrefetchPredictorTables::DeleteResourceData( | 185 void ResourcePrefetchPredictorTables::DeleteResourceData( |
| 216 const std::vector<std::string>& urls, | 186 const std::vector<std::string>& urls, |
| 217 const std::vector<std::string>& hosts) { | 187 const std::vector<std::string>& hosts) { |
| 218 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 188 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 219 if (CantAccessDatabase()) | 189 if (CantAccessDatabase()) |
| 220 return; | 190 return; |
| 221 | 191 |
| 222 DCHECK(!urls.empty() || !hosts.empty()); | 192 DCHECK(!urls.empty() || !hosts.empty()); |
| 223 | 193 |
| 224 if (!urls.empty()) | 194 if (!urls.empty()) |
| 225 DeleteDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::RESOURCE, urls); | 195 url_resource_table_->DeleteData(urls); |
| 226 if (!hosts.empty()) | 196 if (!hosts.empty()) |
| 227 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::RESOURCE, hosts); | 197 host_resource_table_->DeleteData(hosts); |
| 228 } | 198 } |
| 229 | 199 |
| 230 void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint( | 200 void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint( |
| 231 const std::string& key, | 201 const std::string& key, |
| 232 PrefetchKeyType key_type) { | 202 PrefetchKeyType key_type) { |
| 233 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 203 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 234 if (CantAccessDatabase()) | 204 if (CantAccessDatabase()) |
| 235 return; | 205 return; |
| 236 | 206 |
| 237 DeleteDataHelper(key_type, PrefetchDataType::RESOURCE, {key}); | 207 if (key_type == PREFETCH_KEY_TYPE_URL) |
| 208 url_resource_table_->DeleteData({key}); |
| 209 else |
| 210 host_resource_table_->DeleteData({key}); |
| 238 } | 211 } |
| 239 | 212 |
| 240 void ResourcePrefetchPredictorTables::DeleteRedirectData( | 213 void ResourcePrefetchPredictorTables::DeleteRedirectData( |
| 241 const std::vector<std::string>& urls, | 214 const std::vector<std::string>& urls, |
| 242 const std::vector<std::string>& hosts) { | 215 const std::vector<std::string>& hosts) { |
| 243 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 216 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 244 if (CantAccessDatabase()) | 217 if (CantAccessDatabase()) |
| 245 return; | 218 return; |
| 246 | 219 |
| 247 DCHECK(!urls.empty() || !hosts.empty()); | 220 DCHECK(!urls.empty() || !hosts.empty()); |
| 248 | 221 |
| 249 if (!urls.empty()) | 222 if (!urls.empty()) |
| 250 DeleteDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::REDIRECT, urls); | 223 url_redirect_table_->DeleteData(urls); |
| 251 if (!hosts.empty()) | 224 if (!hosts.empty()) |
| 252 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::REDIRECT, hosts); | 225 host_redirect_table_->DeleteData(hosts); |
| 253 } | 226 } |
| 254 | 227 |
| 255 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( | 228 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( |
| 256 const std::string& key, | 229 const std::string& key, |
| 257 PrefetchKeyType key_type) { | 230 PrefetchKeyType key_type) { |
| 258 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 231 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 259 if (CantAccessDatabase()) | 232 if (CantAccessDatabase()) |
| 260 return; | 233 return; |
| 261 | 234 |
| 262 DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key}); | 235 if (key_type == PREFETCH_KEY_TYPE_URL) |
| 236 url_redirect_table_->DeleteData({key}); |
| 237 else |
| 238 host_redirect_table_->DeleteData({key}); |
| 263 } | 239 } |
| 264 | 240 |
| 265 void ResourcePrefetchPredictorTables::DeleteManifestData( | 241 void ResourcePrefetchPredictorTables::DeleteManifestData( |
| 266 const std::vector<std::string>& hosts) { | 242 const std::vector<std::string>& hosts) { |
| 267 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 243 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 268 if (CantAccessDatabase()) | 244 if (CantAccessDatabase()) |
| 269 return; | 245 return; |
| 270 | 246 |
| 271 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, hosts); | 247 manifest_table_->DeleteData(hosts); |
| 272 } | 248 } |
| 273 | 249 |
| 274 void ResourcePrefetchPredictorTables::DeleteOriginData( | 250 void ResourcePrefetchPredictorTables::DeleteOriginData( |
| 275 const std::vector<std::string>& hosts) { | 251 const std::vector<std::string>& hosts) { |
| 276 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 252 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 277 if (CantAccessDatabase()) | 253 if (CantAccessDatabase()) |
| 278 return; | 254 return; |
| 279 | 255 |
| 280 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::ORIGIN, hosts); | 256 origin_table_->DeleteData(hosts); |
| 281 } | 257 } |
| 282 | 258 |
| 283 void ResourcePrefetchPredictorTables::DeleteAllData() { | 259 void ResourcePrefetchPredictorTables::DeleteAllData() { |
| 284 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 260 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 285 if (CantAccessDatabase()) | 261 if (CantAccessDatabase()) |
| 286 return; | 262 return; |
| 287 | 263 |
| 288 sql::Statement deleter; | 264 url_resource_table_->DeleteAllData(); |
| 289 for (const char* table_name : | 265 url_redirect_table_->DeleteAllData(); |
| 290 {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName, | 266 host_resource_table_->DeleteAllData(); |
| 291 kHostRedirectTableName, kManifestTableName}) { | 267 host_redirect_table_->DeleteAllData(); |
| 292 deleter.Assign(DB()->GetUniqueStatement( | 268 manifest_table_->DeleteAllData(); |
| 293 base::StringPrintf("DELETE FROM %s", table_name).c_str())); | 269 origin_table_->DeleteAllData(); |
| 294 deleter.Run(); | |
| 295 } | |
| 296 } | 270 } |
| 297 | 271 |
| 298 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() {} | 272 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() = default; |
| 299 | 273 |
| 300 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {} | 274 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() = default; |
| 301 | |
| 302 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper( | |
| 303 PrefetchKeyType key_type, | |
| 304 PrefetchDataMap* data_map) { | |
| 305 // Read the resources table and organize it per primary key. | |
| 306 const char* table_name = GetTableName(key_type, PrefetchDataType::RESOURCE); | |
| 307 sql::Statement resource_reader(DB()->GetUniqueStatement( | |
| 308 base::StringPrintf(kSelectAllStatementTemplate, table_name).c_str())); | |
| 309 | |
| 310 PrefetchData data; | |
| 311 std::string key; | |
| 312 while (StepAndInitializeProtoData(&resource_reader, &key, &data)) { | |
| 313 data_map->insert(std::make_pair(key, data)); | |
| 314 DCHECK_EQ(data.primary_key(), key); | |
| 315 } | |
| 316 | |
| 317 // Sort each of the resource vectors by score. | |
| 318 for (auto& kv : *data_map) { | |
| 319 SortResources(&(kv.second)); | |
| 320 } | |
| 321 } | |
| 322 | |
| 323 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( | |
| 324 PrefetchKeyType key_type, | |
| 325 RedirectDataMap* data_map) { | |
| 326 // Read the redirects table and organize it per primary key. | |
| 327 const char* table_name = GetTableName(key_type, PrefetchDataType::REDIRECT); | |
| 328 sql::Statement redirect_reader(DB()->GetUniqueStatement( | |
| 329 base::StringPrintf(kSelectAllStatementTemplate, table_name).c_str())); | |
| 330 | |
| 331 RedirectData data; | |
| 332 std::string key; | |
| 333 while (StepAndInitializeProtoData(&redirect_reader, &key, &data)) { | |
| 334 data_map->insert(std::make_pair(key, data)); | |
| 335 DCHECK_EQ(data.primary_key(), key); | |
| 336 } | |
| 337 } | |
| 338 | |
| 339 void ResourcePrefetchPredictorTables::GetAllManifestDataHelper( | |
| 340 ManifestDataMap* manifest_map) { | |
| 341 sql::Statement manifest_reader(DB()->GetUniqueStatement( | |
| 342 base::StringPrintf(kSelectAllStatementTemplate, kManifestTableName) | |
| 343 .c_str())); | |
| 344 | |
| 345 precache::PrecacheManifest data; | |
| 346 std::string key; | |
| 347 while (StepAndInitializeProtoData(&manifest_reader, &key, &data)) { | |
| 348 manifest_map->insert(std::make_pair(key, data)); | |
| 349 } | |
| 350 } | |
| 351 | |
| 352 void ResourcePrefetchPredictorTables::GetAllOriginDataHelper( | |
| 353 OriginDataMap* origin_map) { | |
| 354 sql::Statement reader(DB()->GetUniqueStatement( | |
| 355 base::StringPrintf(kSelectAllStatementTemplate, kOriginTableName) | |
| 356 .c_str())); | |
| 357 | |
| 358 OriginData data; | |
| 359 std::string key; | |
| 360 while (StepAndInitializeProtoData(&reader, &key, &data)) { | |
| 361 origin_map->insert({key, data}); | |
| 362 DCHECK_EQ(data.host(), key); | |
| 363 } | |
| 364 } | |
| 365 | |
| 366 void ResourcePrefetchPredictorTables::UpdateDataHelper( | |
| 367 PrefetchKeyType key_type, | |
| 368 PrefetchDataType data_type, | |
| 369 const std::string& key, | |
| 370 const MessageLite& data) { | |
| 371 DB()->BeginTransaction(); | |
| 372 | |
| 373 // Delete the older data from the table. | |
| 374 std::unique_ptr<sql::Statement> deleter( | |
| 375 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE)); | |
| 376 deleter->BindString(0, key); | |
| 377 bool success = deleter->Run(); | |
| 378 | |
| 379 if (success) { | |
| 380 // Add the new data to the table. | |
| 381 std::unique_ptr<sql::Statement> inserter(GetTableUpdateStatement( | |
| 382 key_type, data_type, TableOperationType::INSERT)); | |
| 383 BindProtoDataToStatement(key, data, inserter.get()); | |
| 384 success = inserter->Run(); | |
| 385 } | |
| 386 | |
| 387 if (!success) | |
| 388 DB()->RollbackTransaction(); | |
| 389 else | |
| 390 DB()->CommitTransaction(); | |
| 391 } | |
| 392 | |
| 393 void ResourcePrefetchPredictorTables::DeleteDataHelper( | |
| 394 PrefetchKeyType key_type, | |
| 395 PrefetchDataType data_type, | |
| 396 const std::vector<std::string>& keys) { | |
| 397 for (const std::string& key : keys) { | |
| 398 std::unique_ptr<sql::Statement> deleter(GetTableUpdateStatement( | |
| 399 key_type, data_type, TableOperationType::REMOVE)); | |
| 400 deleter->BindString(0, key); | |
| 401 deleter->Run(); | |
| 402 } | |
| 403 } | |
| 404 | 275 |
| 405 // static | 276 // static |
| 406 float ResourcePrefetchPredictorTables::ComputeResourceScore( | 277 float ResourcePrefetchPredictorTables::ComputeResourceScore( |
| 407 const ResourceData& data) { | 278 const ResourceData& data) { |
| 408 // The ranking is done by considering, in this order: | 279 // The ranking is done by considering, in this order: |
| 409 // 1. Resource Priority | 280 // 1. Resource Priority |
| 410 // 2. Request resource type | 281 // 2. Request resource type |
| 411 // 3. Finally, the average position, giving a higher priotity to earlier | 282 // 3. Finally, the average position, giving a higher priotity to earlier |
| 412 // resources. | 283 // resources. |
| 413 | 284 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 .c_str())); | 422 .c_str())); |
| 552 } | 423 } |
| 553 | 424 |
| 554 if (success) | 425 if (success) |
| 555 success = db->CommitTransaction(); | 426 success = db->CommitTransaction(); |
| 556 else | 427 else |
| 557 db->RollbackTransaction(); | 428 db->RollbackTransaction(); |
| 558 | 429 |
| 559 if (!success) | 430 if (!success) |
| 560 ResetDB(); | 431 ResetDB(); |
| 432 |
| 433 if (success) { |
| 434 url_resource_table_ = base::MakeUnique<GlowplugKeyValueTable<PrefetchData>>( |
| 435 kUrlResourceTableName, db); |
| 436 url_redirect_table_ = base::MakeUnique<GlowplugKeyValueTable<RedirectData>>( |
| 437 kUrlRedirectTableName, db); |
| 438 host_resource_table_ = |
| 439 base::MakeUnique<GlowplugKeyValueTable<PrefetchData>>( |
| 440 kHostResourceTableName, db); |
| 441 host_redirect_table_ = |
| 442 base::MakeUnique<GlowplugKeyValueTable<RedirectData>>( |
| 443 kHostRedirectTableName, db); |
| 444 manifest_table_ = |
| 445 base::MakeUnique<GlowplugKeyValueTable<precache::PrecacheManifest>>( |
| 446 kManifestTableName, db); |
| 447 origin_table_ = base::MakeUnique<GlowplugKeyValueTable<OriginData>>( |
| 448 kOriginTableName, db); |
| 449 } |
| 561 } | 450 } |
| 562 | 451 |
| 563 void ResourcePrefetchPredictorTables::LogDatabaseStats() { | 452 void ResourcePrefetchPredictorTables::LogDatabaseStats() { |
| 564 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 453 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 565 if (CantAccessDatabase()) | 454 if (CantAccessDatabase()) |
| 566 return; | 455 return; |
| 567 | 456 |
| 568 sql::Statement statement(DB()->GetUniqueStatement( | 457 sql::Statement statement(DB()->GetUniqueStatement( |
| 569 base::StringPrintf("SELECT count(*) FROM %s", kUrlResourceTableName) | 458 base::StringPrintf("SELECT count(*) FROM %s", kUrlResourceTableName) |
| 570 .c_str())); | 459 .c_str())); |
| 571 if (statement.Step()) | 460 if (statement.Step()) |
| 572 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount2", | 461 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount2", |
| 573 statement.ColumnInt(0)); | 462 statement.ColumnInt(0)); |
| 574 | 463 |
| 575 statement.Assign(DB()->GetUniqueStatement( | 464 statement.Assign(DB()->GetUniqueStatement( |
| 576 base::StringPrintf("SELECT count(*) FROM %s", kHostResourceTableName) | 465 base::StringPrintf("SELECT count(*) FROM %s", kHostResourceTableName) |
| 577 .c_str())); | 466 .c_str())); |
| 578 if (statement.Step()) | 467 if (statement.Step()) |
| 579 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount2", | 468 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount2", |
| 580 statement.ColumnInt(0)); | 469 statement.ColumnInt(0)); |
| 581 } | 470 } |
| 582 | 471 |
| 583 std::unique_ptr<sql::Statement> | |
| 584 ResourcePrefetchPredictorTables::GetTableUpdateStatement( | |
| 585 PrefetchKeyType key_type, | |
| 586 PrefetchDataType data_type, | |
| 587 TableOperationType op_type) { | |
| 588 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | | |
| 589 (static_cast<int>(op_type) << 3)); | |
| 590 const char* statement_template = | |
| 591 (op_type == TableOperationType::REMOVE ? kDeleteProtoStatementTemplate | |
| 592 : kInsertProtoStatementTemplate); | |
| 593 const char* table_name = GetTableName(key_type, data_type); | |
| 594 return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement( | |
| 595 id, base::StringPrintf(statement_template, table_name).c_str())); | |
| 596 } | |
| 597 | |
| 598 // static | |
| 599 const char* ResourcePrefetchPredictorTables::GetTableName( | |
| 600 PrefetchKeyType key_type, | |
| 601 PrefetchDataType data_type) { | |
| 602 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | |
| 603 switch (data_type) { | |
| 604 case PrefetchDataType::RESOURCE: | |
| 605 return is_host ? kHostResourceTableName : kUrlResourceTableName; | |
| 606 case PrefetchDataType::REDIRECT: | |
| 607 return is_host ? kHostRedirectTableName : kUrlRedirectTableName; | |
| 608 case PrefetchDataType::MANIFEST: | |
| 609 return kManifestTableName; | |
| 610 case PrefetchDataType::ORIGIN: | |
| 611 return kOriginTableName; | |
| 612 } | |
| 613 | |
| 614 NOTREACHED(); | |
| 615 return nullptr; | |
| 616 } | |
| 617 | |
| 618 } // namespace predictors | 472 } // namespace predictors |
| OLD | NEW |