Index: chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
diff --git a/chrome/browser/predictors/resource_prefetch_predictor_tables.cc b/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
index 710325c29397cc661d42149b1af184cdff8f8472..519832357766237e4f2ea2e68b7c9cbf9fd16f2a 100644 |
--- a/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
+++ b/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
@@ -36,38 +36,6 @@ const char kCreateProtoTableStatementTemplate[] = |
"key TEXT, " |
"proto BLOB, " |
"PRIMARY KEY(key))"; |
-const char kInsertProtoStatementTemplate[] = |
- "INSERT INTO %s (key, proto) VALUES (?,?)"; |
-const char kDeleteProtoStatementTemplate[] = "DELETE FROM %s WHERE key=?"; |
-const char kSelectAllStatementTemplate[] = "SELECT * FROM %s"; |
- |
-void BindProtoDataToStatement(const std::string& key, |
- const MessageLite& data, |
- sql::Statement* statement) { |
- int size = data.ByteSize(); |
- DCHECK_GT(size, 0); |
- std::vector<char> proto_buffer(size); |
- data.SerializeToArray(&proto_buffer[0], size); |
- |
- statement->BindString(0, key); |
- statement->BindBlob(1, &proto_buffer[0], size); |
-} |
- |
-bool StepAndInitializeProtoData(sql::Statement* statement, |
- std::string* key, |
- MessageLite* data) { |
- if (!statement->Step()) |
- return false; |
- |
- *key = statement->ColumnString(0); |
- |
- int size = statement->ColumnByteLength(1); |
- const void* blob = statement->ColumnBlob(1); |
- DCHECK(blob); |
- data->ParseFromArray(blob, size); |
- |
- return true; |
-} |
} // namespace |
@@ -157,12 +125,12 @@ void ResourcePrefetchPredictorTables::GetAllData( |
manifest_map->clear(); |
origin_data_map->clear(); |
- GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map); |
- GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map); |
- GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); |
- GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); |
- GetAllManifestDataHelper(manifest_map); |
- GetAllOriginDataHelper(origin_data_map); |
+ url_resource_table_->GetAllData(url_data_map); |
+ host_resource_table_->GetAllData(host_data_map); |
+ url_redirect_table_->GetAllData(url_redirect_data_map); |
+ host_redirect_table_->GetAllData(host_redirect_data_map); |
+ manifest_table_->GetAllData(manifest_map); |
+ origin_table_->GetAllData(origin_data_map); |
} |
void ResourcePrefetchPredictorTables::UpdateResourceData( |
@@ -173,8 +141,10 @@ void ResourcePrefetchPredictorTables::UpdateResourceData( |
if (CantAccessDatabase()) |
return; |
- UpdateDataHelper(key_type, PrefetchDataType::RESOURCE, data.primary_key(), |
- data); |
+ if (key_type == PREFETCH_KEY_TYPE_URL) |
+ url_resource_table_->UpdateData(data.primary_key(), data); |
+ else |
+ host_resource_table_->UpdateData(data.primary_key(), data); |
} |
void ResourcePrefetchPredictorTables::UpdateRedirectData( |
@@ -185,8 +155,10 @@ void ResourcePrefetchPredictorTables::UpdateRedirectData( |
if (CantAccessDatabase()) |
return; |
- UpdateDataHelper(key_type, PrefetchDataType::REDIRECT, data.primary_key(), |
- data); |
+ if (key_type == PREFETCH_KEY_TYPE_URL) |
+ url_redirect_table_->UpdateData(data.primary_key(), data); |
+ else |
+ host_redirect_table_->UpdateData(data.primary_key(), data); |
} |
void ResourcePrefetchPredictorTables::UpdateManifestData( |
@@ -197,8 +169,7 @@ void ResourcePrefetchPredictorTables::UpdateManifestData( |
if (CantAccessDatabase()) |
return; |
- UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, |
- manifest_data); |
+ manifest_table_->UpdateData(host, manifest_data); |
} |
void ResourcePrefetchPredictorTables::UpdateOriginData( |
@@ -208,8 +179,7 @@ void ResourcePrefetchPredictorTables::UpdateOriginData( |
if (CantAccessDatabase()) |
return; |
- UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::ORIGIN, |
- origin_data.host(), origin_data); |
+ origin_table_->UpdateData(origin_data.host(), origin_data); |
} |
void ResourcePrefetchPredictorTables::DeleteResourceData( |
@@ -222,9 +192,9 @@ void ResourcePrefetchPredictorTables::DeleteResourceData( |
DCHECK(!urls.empty() || !hosts.empty()); |
if (!urls.empty()) |
- DeleteDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::RESOURCE, urls); |
+ url_resource_table_->DeleteData(urls); |
if (!hosts.empty()) |
- DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::RESOURCE, hosts); |
+ host_resource_table_->DeleteData(hosts); |
} |
void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint( |
@@ -234,7 +204,10 @@ void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint( |
if (CantAccessDatabase()) |
return; |
- DeleteDataHelper(key_type, PrefetchDataType::RESOURCE, {key}); |
+ if (key_type == PREFETCH_KEY_TYPE_URL) |
+ url_resource_table_->DeleteData({key}); |
+ else |
+ host_resource_table_->DeleteData({key}); |
} |
void ResourcePrefetchPredictorTables::DeleteRedirectData( |
@@ -247,9 +220,9 @@ void ResourcePrefetchPredictorTables::DeleteRedirectData( |
DCHECK(!urls.empty() || !hosts.empty()); |
if (!urls.empty()) |
- DeleteDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::REDIRECT, urls); |
+ url_redirect_table_->DeleteData(urls); |
if (!hosts.empty()) |
- DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::REDIRECT, hosts); |
+ host_redirect_table_->DeleteData(hosts); |
} |
void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( |
@@ -259,7 +232,10 @@ void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( |
if (CantAccessDatabase()) |
return; |
- DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key}); |
+ if (key_type == PREFETCH_KEY_TYPE_URL) |
+ url_redirect_table_->DeleteData({key}); |
+ else |
+ host_redirect_table_->DeleteData({key}); |
} |
void ResourcePrefetchPredictorTables::DeleteManifestData( |
@@ -268,7 +244,7 @@ void ResourcePrefetchPredictorTables::DeleteManifestData( |
if (CantAccessDatabase()) |
return; |
- DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, hosts); |
+ manifest_table_->DeleteData(hosts); |
} |
void ResourcePrefetchPredictorTables::DeleteOriginData( |
@@ -277,7 +253,7 @@ void ResourcePrefetchPredictorTables::DeleteOriginData( |
if (CantAccessDatabase()) |
return; |
- DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::ORIGIN, hosts); |
+ origin_table_->DeleteData(hosts); |
} |
void ResourcePrefetchPredictorTables::DeleteAllData() { |
@@ -285,122 +261,17 @@ void ResourcePrefetchPredictorTables::DeleteAllData() { |
if (CantAccessDatabase()) |
return; |
- sql::Statement deleter; |
- for (const char* table_name : |
- {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName, |
- kHostRedirectTableName, kManifestTableName}) { |
- deleter.Assign(DB()->GetUniqueStatement( |
- base::StringPrintf("DELETE FROM %s", table_name).c_str())); |
- deleter.Run(); |
- } |
-} |
- |
-ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() {} |
- |
-ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {} |
- |
-void ResourcePrefetchPredictorTables::GetAllResourceDataHelper( |
- PrefetchKeyType key_type, |
- PrefetchDataMap* data_map) { |
- // Read the resources table and organize it per primary key. |
- const char* table_name = GetTableName(key_type, PrefetchDataType::RESOURCE); |
- sql::Statement resource_reader(DB()->GetUniqueStatement( |
- base::StringPrintf(kSelectAllStatementTemplate, table_name).c_str())); |
- |
- PrefetchData data; |
- std::string key; |
- while (StepAndInitializeProtoData(&resource_reader, &key, &data)) { |
- data_map->insert(std::make_pair(key, data)); |
- DCHECK_EQ(data.primary_key(), key); |
- } |
- |
- // Sort each of the resource vectors by score. |
- for (auto& kv : *data_map) { |
- SortResources(&(kv.second)); |
- } |
-} |
- |
-void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( |
- PrefetchKeyType key_type, |
- RedirectDataMap* data_map) { |
- // Read the redirects table and organize it per primary key. |
- const char* table_name = GetTableName(key_type, PrefetchDataType::REDIRECT); |
- sql::Statement redirect_reader(DB()->GetUniqueStatement( |
- base::StringPrintf(kSelectAllStatementTemplate, table_name).c_str())); |
- |
- RedirectData data; |
- std::string key; |
- while (StepAndInitializeProtoData(&redirect_reader, &key, &data)) { |
- data_map->insert(std::make_pair(key, data)); |
- DCHECK_EQ(data.primary_key(), key); |
- } |
-} |
- |
-void ResourcePrefetchPredictorTables::GetAllManifestDataHelper( |
- ManifestDataMap* manifest_map) { |
- sql::Statement manifest_reader(DB()->GetUniqueStatement( |
- base::StringPrintf(kSelectAllStatementTemplate, kManifestTableName) |
- .c_str())); |
- |
- precache::PrecacheManifest data; |
- std::string key; |
- while (StepAndInitializeProtoData(&manifest_reader, &key, &data)) { |
- manifest_map->insert(std::make_pair(key, data)); |
- } |
+ url_resource_table_->DeleteAllData(); |
+ url_redirect_table_->DeleteAllData(); |
+ host_resource_table_->DeleteAllData(); |
+ host_redirect_table_->DeleteAllData(); |
+ manifest_table_->DeleteAllData(); |
+ origin_table_->DeleteAllData(); |
} |
-void ResourcePrefetchPredictorTables::GetAllOriginDataHelper( |
- OriginDataMap* origin_map) { |
- sql::Statement reader(DB()->GetUniqueStatement( |
- base::StringPrintf(kSelectAllStatementTemplate, kOriginTableName) |
- .c_str())); |
- |
- OriginData data; |
- std::string key; |
- while (StepAndInitializeProtoData(&reader, &key, &data)) { |
- origin_map->insert({key, data}); |
- DCHECK_EQ(data.host(), key); |
- } |
-} |
- |
-void ResourcePrefetchPredictorTables::UpdateDataHelper( |
- PrefetchKeyType key_type, |
- PrefetchDataType data_type, |
- const std::string& key, |
- const MessageLite& data) { |
- DB()->BeginTransaction(); |
- |
- // Delete the older data from the table. |
- std::unique_ptr<sql::Statement> deleter( |
- GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE)); |
- deleter->BindString(0, key); |
- bool success = deleter->Run(); |
- |
- if (success) { |
- // Add the new data to the table. |
- std::unique_ptr<sql::Statement> inserter(GetTableUpdateStatement( |
- key_type, data_type, TableOperationType::INSERT)); |
- BindProtoDataToStatement(key, data, inserter.get()); |
- success = inserter->Run(); |
- } |
+ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() = default; |
- if (!success) |
- DB()->RollbackTransaction(); |
- else |
- DB()->CommitTransaction(); |
-} |
- |
-void ResourcePrefetchPredictorTables::DeleteDataHelper( |
- PrefetchKeyType key_type, |
- PrefetchDataType data_type, |
- const std::vector<std::string>& keys) { |
- for (const std::string& key : keys) { |
- std::unique_ptr<sql::Statement> deleter(GetTableUpdateStatement( |
- key_type, data_type, TableOperationType::REMOVE)); |
- deleter->BindString(0, key); |
- deleter->Run(); |
- } |
-} |
+ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() = default; |
// static |
float ResourcePrefetchPredictorTables::ComputeResourceScore( |
@@ -558,6 +429,24 @@ void ResourcePrefetchPredictorTables::CreateTableIfNonExistent() { |
if (!success) |
ResetDB(); |
+ |
+ if (success) { |
+ url_resource_table_ = base::MakeUnique<GlowplugKeyValueTable<PrefetchData>>( |
+ kUrlResourceTableName, db); |
+ url_redirect_table_ = base::MakeUnique<GlowplugKeyValueTable<RedirectData>>( |
+ kUrlRedirectTableName, db); |
+ host_resource_table_ = |
+ base::MakeUnique<GlowplugKeyValueTable<PrefetchData>>( |
+ kHostResourceTableName, db); |
+ host_redirect_table_ = |
+ base::MakeUnique<GlowplugKeyValueTable<RedirectData>>( |
+ kHostRedirectTableName, db); |
+ manifest_table_ = |
+ base::MakeUnique<GlowplugKeyValueTable<precache::PrecacheManifest>>( |
+ kManifestTableName, db); |
+ origin_table_ = base::MakeUnique<GlowplugKeyValueTable<OriginData>>( |
+ kOriginTableName, db); |
+ } |
} |
void ResourcePrefetchPredictorTables::LogDatabaseStats() { |
@@ -580,39 +469,4 @@ void ResourcePrefetchPredictorTables::LogDatabaseStats() { |
statement.ColumnInt(0)); |
} |
-std::unique_ptr<sql::Statement> |
-ResourcePrefetchPredictorTables::GetTableUpdateStatement( |
- PrefetchKeyType key_type, |
- PrefetchDataType data_type, |
- TableOperationType op_type) { |
- sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | |
- (static_cast<int>(op_type) << 3)); |
- const char* statement_template = |
- (op_type == TableOperationType::REMOVE ? kDeleteProtoStatementTemplate |
- : kInsertProtoStatementTemplate); |
- const char* table_name = GetTableName(key_type, data_type); |
- return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement( |
- id, base::StringPrintf(statement_template, table_name).c_str())); |
-} |
- |
-// static |
-const char* ResourcePrefetchPredictorTables::GetTableName( |
- PrefetchKeyType key_type, |
- PrefetchDataType data_type) { |
- bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
- switch (data_type) { |
- case PrefetchDataType::RESOURCE: |
- return is_host ? kHostResourceTableName : kUrlResourceTableName; |
- case PrefetchDataType::REDIRECT: |
- return is_host ? kHostRedirectTableName : kUrlRedirectTableName; |
- case PrefetchDataType::MANIFEST: |
- return kManifestTableName; |
- case PrefetchDataType::ORIGIN: |
- return kOriginTableName; |
- } |
- |
- NOTREACHED(); |
- return nullptr; |
-} |
- |
} // namespace predictors |