Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(403)

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor_tables.cc

Issue 2268283005: predictors: Refactor the resource_prefetch_predictor database handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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.h" 14 #include "base/metrics/histogram.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/statement.h" 17 #include "sql/statement.h"
18 18
19 using chrome_browser_predictors::ResourceData;
19 using content::BrowserThread; 20 using content::BrowserThread;
20 using sql::Statement; 21 using sql::Statement;
21 22
22 namespace { 23 namespace {
23 24
24 using ResourceRow = predictors::ResourcePrefetchPredictorTables::ResourceRow;
25
26 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 25 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url";
27 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; 26 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata";
28 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 27 const char kHostResourceTableName[] = "resource_prefetch_predictor_host";
29 const char kHostMetadataTableName[] = 28 const char kHostMetadataTableName[] =
30 "resource_prefetch_predictor_host_metadata"; 29 "resource_prefetch_predictor_host_metadata";
31 30
32 const char kInsertResourceTableStatementTemplate[] = 31 const char kInsertResourceTableStatementTemplate[] =
33 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; 32 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)";
34 const char kInsertMetadataTableStatementTemplate[] = 33 const char kInsertMetadataTableStatementTemplate[] =
35 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; 34 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)";
36 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; 35 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?";
37 36
38 void BindResourceRowToStatement(const ResourceRow& row, 37 void BindToStatement(const ResourceData& resource,
39 const std::string& primary_key, 38 const std::string& primary_key,
40 Statement* statement) { 39 Statement* statement) {
41 chrome_browser_predictors::ResourceData proto; 40 int size = resource.ByteSize();
42 row.ToProto(&proto); 41 std::vector<char> buffer(size);
43 int size = proto.ByteSize(); 42 resource.SerializeToArray(&buffer[0], size);
44 std::vector<char> proto_buffer(size);
45 proto.SerializeToArray(&proto_buffer[0], size);
46 43
47 statement->BindString(0, primary_key); 44 statement->BindString(0, primary_key);
48 statement->BindString(1, row.resource_url.spec()); 45 statement->BindString(1, resource.resource_url());
49 statement->BindBlob(2, &proto_buffer[0], size); 46 statement->BindBlob(2, &buffer[0], size);
50 } 47 }
51 48
52 bool StepAndInitializeResourceRow(Statement* statement, ResourceRow* row) { 49 bool StepAndInitializeResource(Statement* statement, ResourceData* resource) {
53 if (!statement->Step()) 50 if (!statement->Step())
54 return false; 51 return false;
52 std::string primary_key = statement->ColumnString(0);
53 std::string resource_url = statement->ColumnString(1);
55 54
56 int size = statement->ColumnByteLength(2); 55 int size = statement->ColumnByteLength(2);
57 const void* data = statement->ColumnBlob(2); 56 const void* data = statement->ColumnBlob(2);
58 DCHECK(data); 57 DCHECK(data);
59 chrome_browser_predictors::ResourceData proto; 58 resource->ParseFromArray(data, size);
60 proto.ParseFromArray(data, size); 59 resource->set_primary_key(primary_key);
61 ResourceRow::FromProto(proto, row); 60 DCHECK(resource_url == resource->resource_url());
62 61
63 row->primary_key = statement->ColumnString(0);
64 row->resource_url = GURL(statement->ColumnString(1));
65 return true; 62 return true;
66 } 63 }
67 64
68 } // namespace 65 } // namespace
69 66
70 namespace predictors { 67 namespace predictors {
71 68
72 // static 69 // static
73 const size_t ResourcePrefetchPredictorTables::kMaxStringLength = 1024; 70 void ResourcePrefetchPredictorTables::SortResources(
74 71 std::vector<ResourceData>* resources) {
75 ResourceRow::ResourceRow() 72 std::sort(resources->begin(), resources->end(),
76 : resource_type(content::RESOURCE_TYPE_LAST_TYPE), 73 [](const ResourceData& x, const ResourceData& y) {
77 number_of_hits(0), 74 return x.score() > y.score();
78 number_of_misses(0), 75 });
79 consecutive_misses(0),
80 average_position(0.0),
81 priority(net::IDLE),
82 has_validators(false),
83 always_revalidate(false),
84 score(0.0) {}
85
86 ResourceRow::ResourceRow(const ResourceRow& other)
87 : primary_key(other.primary_key),
88 resource_url(other.resource_url),
89 resource_type(other.resource_type),
90 number_of_hits(other.number_of_hits),
91 number_of_misses(other.number_of_misses),
92 consecutive_misses(other.consecutive_misses),
93 average_position(other.average_position),
94 priority(other.priority),
95 has_validators(other.has_validators),
96 always_revalidate(other.always_revalidate),
97 score(other.score) {}
98
99 ResourceRow::ResourceRow(const std::string& i_primary_key,
100 const std::string& i_resource_url,
101 content::ResourceType i_resource_type,
102 int i_number_of_hits,
103 int i_number_of_misses,
104 int i_consecutive_misses,
105 double i_average_position,
106 net::RequestPriority i_priority,
107 bool i_has_validators,
108 bool i_always_revalidate)
109 : primary_key(i_primary_key),
110 resource_url(i_resource_url),
111 resource_type(i_resource_type),
112 number_of_hits(i_number_of_hits),
113 number_of_misses(i_number_of_misses),
114 consecutive_misses(i_consecutive_misses),
115 average_position(i_average_position),
116 priority(i_priority),
117 has_validators(i_has_validators),
118 always_revalidate(i_always_revalidate) {
119 UpdateScore();
120 } 76 }
121 77
122 void ResourceRow::UpdateScore() { 78 // static
79 void ResourcePrefetchPredictorTables::UpdateResourceScore(
80 ResourceData* resource) {
123 // The score is calculated so that when the rows are sorted, stylesheets, 81 // The score is calculated so that when the rows are sorted, stylesheets,
124 // scripts and fonts appear first, sorted by position(ascending) and then the 82 // scripts and fonts appear first, sorted by position(ascending) and then the
125 // rest of the resources sorted by position (ascending). 83 // rest of the resources sorted by position (ascending).
126 static const int kMaxResourcesPerType = 100; 84 static const int kMaxResourcesPerType = 100;
85 content::ResourceType resource_type =
86 static_cast<content::ResourceType>(resource->resource_type());
127 switch (resource_type) { 87 switch (resource_type) {
128 case content::RESOURCE_TYPE_STYLESHEET: 88 case content::RESOURCE_TYPE_STYLESHEET:
129 case content::RESOURCE_TYPE_SCRIPT: 89 case content::RESOURCE_TYPE_SCRIPT:
130 case content::RESOURCE_TYPE_FONT_RESOURCE: 90 case content::RESOURCE_TYPE_FONT_RESOURCE:
131 score = (2 * kMaxResourcesPerType) - average_position; 91 resource->set_score((2 * kMaxResourcesPerType) -
92 resource->average_position());
132 break; 93 break;
133 94
134 case content::RESOURCE_TYPE_IMAGE: 95 case content::RESOURCE_TYPE_IMAGE:
135 default: 96 default:
136 score = kMaxResourcesPerType - average_position; 97 resource->set_score(kMaxResourcesPerType - resource->average_position());
137 break; 98 break;
138 } 99 }
139 // TODO(lizeb): Take priority into account. 100 // TODO(lizeb): Take priority into account.
140 } 101 }
141 102
142 bool ResourceRow::operator==(const ResourceRow& rhs) const {
143 return primary_key == rhs.primary_key && resource_url == rhs.resource_url &&
144 resource_type == rhs.resource_type &&
145 number_of_hits == rhs.number_of_hits &&
146 number_of_misses == rhs.number_of_misses &&
147 consecutive_misses == rhs.consecutive_misses &&
148 average_position == rhs.average_position && priority == rhs.priority &&
149 has_validators == rhs.has_validators &&
150 always_revalidate == rhs.always_revalidate && score == rhs.score;
151 }
152
153 void ResourceRow::ToProto(ResourceData* resource_data) const {
154 using chrome_browser_predictors::ResourceData_Priority;
155 using chrome_browser_predictors::ResourceData_ResourceType;
156
157 resource_data->set_primary_key(primary_key);
158 resource_data->set_resource_url(resource_url.spec());
159 resource_data->set_resource_type(
160 static_cast<ResourceData_ResourceType>(resource_type));
161 resource_data->set_number_of_hits(number_of_hits);
162 resource_data->set_number_of_misses(number_of_misses);
163 resource_data->set_consecutive_misses(consecutive_misses);
164 resource_data->set_average_position(average_position);
165 resource_data->set_priority(static_cast<ResourceData_Priority>(priority));
166 resource_data->set_has_validators(has_validators);
167 resource_data->set_always_revalidate(always_revalidate);
168 }
169
170 // static
171 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) {
172 DCHECK(proto.has_primary_key());
173 row->primary_key = proto.primary_key();
174 row->resource_url = GURL(proto.resource_url());
175 row->resource_type =
176 static_cast<content::ResourceType>(proto.resource_type());
177 row->number_of_hits = proto.number_of_hits();
178 row->number_of_misses = proto.number_of_misses();
179 row->consecutive_misses = proto.consecutive_misses();
180 row->average_position = proto.average_position();
181 row->priority = static_cast<net::RequestPriority>(proto.priority());
182 row->has_validators = proto.has_validators();
183 row->always_revalidate = proto.always_revalidate();
184 }
185
186 // static
187 void ResourcePrefetchPredictorTables::SortResourceRows(ResourceRows* rows) {
188 std::sort(rows->begin(), rows->end(),
189 [](const ResourceRow& x, const ResourceRow& y) {
190 return x.score > y.score;
191 });
192 }
193
194 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( 103 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
195 PrefetchKeyType i_key_type, 104 PrefetchKeyType i_key_type,
196 const std::string& i_primary_key) 105 const std::string& i_primary_key)
197 : key_type(i_key_type), 106 : key_type(i_key_type),
198 primary_key(i_primary_key) { 107 primary_key(i_primary_key) {
199 } 108 }
200 109
201 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( 110 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
202 const PrefetchData& other) 111 const PrefetchData& other)
203 : key_type(other.key_type), 112 : key_type(other.key_type),
204 primary_key(other.primary_key), 113 primary_key(other.primary_key),
205 last_visit(other.last_visit), 114 last_visit(other.last_visit),
206 resources(other.resources) { 115 resources(other.resources) {
207 } 116 }
208 117
209 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { 118 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() {}
210 }
211
212 bool ResourcePrefetchPredictorTables::PrefetchData::operator==(
213 const PrefetchData& rhs) const {
214 return key_type == rhs.key_type && primary_key == rhs.primary_key &&
215 resources == rhs.resources;
216 }
217 119
218 void ResourcePrefetchPredictorTables::GetAllData( 120 void ResourcePrefetchPredictorTables::GetAllData(
219 PrefetchDataMap* url_data_map, 121 PrefetchDataMap* url_data_map,
220 PrefetchDataMap* host_data_map) { 122 PrefetchDataMap* host_data_map) {
221 DCHECK_CURRENTLY_ON(BrowserThread::DB); 123 DCHECK_CURRENTLY_ON(BrowserThread::DB);
222 if (CantAccessDatabase()) 124 if (CantAccessDatabase())
223 return; 125 return;
224 126
225 DCHECK(url_data_map); 127 DCHECK(url_data_map);
226 DCHECK(host_data_map); 128 DCHECK(host_data_map);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 if (CantAccessDatabase()) 179 if (CantAccessDatabase())
278 return; 180 return;
279 181
280 DeleteDataHelper(key_type, std::vector<std::string>(1, key)); 182 DeleteDataHelper(key_type, std::vector<std::string>(1, key));
281 } 183 }
282 184
283 void ResourcePrefetchPredictorTables::DeleteAllData() { 185 void ResourcePrefetchPredictorTables::DeleteAllData() {
284 if (CantAccessDatabase()) 186 if (CantAccessDatabase())
285 return; 187 return;
286 188
287 Statement deleter(DB()->GetUniqueStatement( 189 Statement deleter;
288 base::StringPrintf("DELETE FROM %s", kUrlResourceTableName).c_str())); 190 for (const char* table_name :
289 deleter.Run(); 191 {kUrlResourceTableName, kUrlMetadataTableName, kHostResourceTableName,
290 deleter.Assign(DB()->GetUniqueStatement( 192 kHostMetadataTableName}) {
291 base::StringPrintf("DELETE FROM %s", kUrlMetadataTableName).c_str())); 193 deleter.Assign(DB()->GetUniqueStatement(
292 deleter.Run(); 194 base::StringPrintf("DELETE FROM %s", table_name).c_str()));
293 deleter.Assign(DB()->GetUniqueStatement( 195 deleter.Run();
294 base::StringPrintf("DELETE FROM %s", kHostResourceTableName).c_str())); 196 }
295 deleter.Run();
296 deleter.Assign(DB()->GetUniqueStatement(
297 base::StringPrintf("DELETE FROM %s", kHostMetadataTableName).c_str()));
298 deleter.Run();
299 } 197 }
300 198
301 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() 199 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables()
302 : PredictorTableBase() { 200 : PredictorTableBase() {
303 } 201 }
304 202
305 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { 203 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {
306 } 204 }
307 205
308 void ResourcePrefetchPredictorTables::GetAllDataHelper( 206 void ResourcePrefetchPredictorTables::GetAllDataHelper(
309 PrefetchKeyType key_type, 207 PrefetchKeyType key_type,
310 PrefetchDataMap* data_map, 208 PrefetchDataMap* data_map,
311 std::vector<std::string>* to_delete) { 209 std::vector<std::string>* to_delete) {
312 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 210 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
313 211
314 // Read the resources table and organize it per primary key. 212 // Read the resources table and organize it per primary key.
315 const char* resource_table_name = is_host ? kHostResourceTableName : 213 const char* resource_table_name = is_host ? kHostResourceTableName :
316 kUrlResourceTableName; 214 kUrlResourceTableName;
317 Statement resource_reader(DB()->GetUniqueStatement( 215 Statement resource_reader(DB()->GetUniqueStatement(
318 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str())); 216 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str()));
319 217
320 ResourceRow row; 218 ResourceData resource;
321 while (StepAndInitializeResourceRow(&resource_reader, &row)) { 219 while (StepAndInitializeResource(&resource_reader, &resource)) {
322 row.UpdateScore(); 220 UpdateResourceScore(&resource);
323 std::string primary_key = row.primary_key; 221 std::string primary_key = resource.primary_key();
324 // Don't need to store primary key since the data is grouped by primary key. 222 // Don't need to store primary key since the data is grouped by primary key.
325 row.primary_key.clear(); 223 resource.clear_primary_key();
326
327 PrefetchDataMap::iterator it = data_map->find(primary_key); 224 PrefetchDataMap::iterator it = data_map->find(primary_key);
328 if (it == data_map->end()) { 225 if (it == data_map->end()) {
329 it = data_map->insert(std::make_pair( 226 it = data_map->insert(std::make_pair(
330 primary_key, PrefetchData(key_type, primary_key))).first; 227 primary_key, PrefetchData(key_type, primary_key))).first;
331 } 228 }
332 it->second.resources.push_back(row); 229 it->second.resources.push_back(resource);
333 } 230 }
334 231
335 // Sort each of the resource row vectors by score. 232 // Sort each of the resource row vectors by score.
336 for (auto& kv : *data_map) 233 for (auto& kv : *data_map)
337 SortResourceRows(&(kv.second.resources)); 234 SortResources(&(kv.second.resources));
338 235
339 // Read the metadata and keep track of entries that have metadata, but no 236 // Read the metadata and keep track of entries that have metadata, but no
340 // resource entries, so they can be deleted. 237 // resource entries, so they can be deleted.
341 const char* metadata_table_name = is_host ? kHostMetadataTableName : 238 const char* metadata_table_name = is_host ? kHostMetadataTableName :
342 kUrlMetadataTableName; 239 kUrlMetadataTableName;
343 Statement metadata_reader(DB()->GetUniqueStatement( 240 Statement metadata_reader(DB()->GetUniqueStatement(
344 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); 241 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str()));
345 242
346 while (metadata_reader.Step()) { 243 while (metadata_reader.Step()) {
347 std::string primary_key = metadata_reader.ColumnString(0); 244 std::string primary_key = metadata_reader.ColumnString(0);
(...skipping 25 matching lines...) Expand all
373 if (!deleter->Run()) 270 if (!deleter->Run())
374 return false; 271 return false;
375 272
376 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() : 273 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() :
377 GetUrlMetadataDeleteStatement()); 274 GetUrlMetadataDeleteStatement());
378 deleter->BindString(0, data.primary_key); 275 deleter->BindString(0, data.primary_key);
379 if (!deleter->Run()) 276 if (!deleter->Run())
380 return false; 277 return false;
381 278
382 // Add the new data to the tables. 279 // Add the new data to the tables.
383 const ResourceRows& resources = data.resources; 280 for (const ResourceData& resource : data.resources) {
384 for (const ResourceRow& resource : resources) {
385 std::unique_ptr<Statement> resource_inserter( 281 std::unique_ptr<Statement> resource_inserter(
386 data.is_host() ? GetHostResourceUpdateStatement() 282 data.is_host() ? GetHostResourceUpdateStatement()
387 : GetUrlResourceUpdateStatement()); 283 : GetUrlResourceUpdateStatement());
388 BindResourceRowToStatement(resource, data.primary_key, 284 BindToStatement(resource, data.primary_key, resource_inserter.get());
389 resource_inserter.get());
390 if (!resource_inserter->Run()) 285 if (!resource_inserter->Run())
391 return false; 286 return false;
392 } 287 }
393 288
394 std::unique_ptr<Statement> metadata_inserter( 289 std::unique_ptr<Statement> metadata_inserter(
395 data.is_host() ? GetHostMetadataUpdateStatement() 290 data.is_host() ? GetHostMetadataUpdateStatement()
396 : GetUrlMetadataUpdateStatement()); 291 : GetUrlMetadataUpdateStatement());
397 metadata_inserter->BindString(0, data.primary_key); 292 metadata_inserter->BindString(0, data.primary_key);
398 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); 293 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue());
399 if (!metadata_inserter->Run()) 294 if (!metadata_inserter->Run())
400 return false; 295 return false;
401 296
402 return true; 297 return true;
403 } 298 }
404 299
405 void ResourcePrefetchPredictorTables::DeleteDataHelper( 300 void ResourcePrefetchPredictorTables::DeleteDataHelper(
406 PrefetchKeyType key_type, 301 PrefetchKeyType key_type,
407 const std::vector<std::string>& keys) { 302 const std::vector<std::string>& keys) {
408 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 303 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
409 304
410 for (std::vector<std::string>::const_iterator it = keys.begin(); 305 for (const std::string& key : keys) {
411 it != keys.end(); ++it) {
412 std::unique_ptr<Statement> deleter(is_host 306 std::unique_ptr<Statement> deleter(is_host
413 ? GetHostResourceDeleteStatement() 307 ? GetHostResourceDeleteStatement()
414 : GetUrlResourceDeleteStatement()); 308 : GetUrlResourceDeleteStatement());
415 deleter->BindString(0, *it); 309 deleter->BindString(0, key);
416 deleter->Run(); 310 deleter->Run();
417 311
418 deleter.reset(is_host ? GetHostMetadataDeleteStatement() : 312 deleter.reset(is_host ? GetHostMetadataDeleteStatement()
419 GetUrlMetadataDeleteStatement()); 313 : GetUrlMetadataDeleteStatement());
420 deleter->BindString(0, *it); 314 deleter->BindString(0, key);
421 deleter->Run(); 315 deleter->Run();
422 } 316 }
423 } 317 }
424 318
319 // static
425 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( 320 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
426 const PrefetchData& data) const { 321 const PrefetchData& data) {
427 if (data.primary_key.length() > kMaxStringLength) 322 if (data.primary_key.length() > kMaxStringLength)
428 return false; 323 return false;
429 324
430 for (ResourceRows::const_iterator it = data.resources.begin(); 325 for (const ResourceData& resource : data.resources) {
431 it != data.resources.end(); ++it) { 326 if (resource.resource_url().length() > kMaxStringLength)
432 if (it->resource_url.spec().length() > kMaxStringLength)
433 return false; 327 return false;
434 } 328 }
435 return true; 329 return true;
436 } 330 }
437 331
438 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( 332 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated(
439 sql::Connection* db) { 333 sql::Connection* db) {
440 bool success = true; 334 bool success = true;
441 for (const char* table_name : 335 for (const char* table_name :
442 {kUrlResourceTableName, kHostResourceTableName}) { 336 {kUrlResourceTableName, kHostResourceTableName}) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 } 460 }
567 461
568 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { 462 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() {
569 return new Statement(DB()->GetCachedStatement( 463 return new Statement(DB()->GetCachedStatement(
570 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, 464 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate,
571 kHostMetadataTableName) 465 kHostMetadataTableName)
572 .c_str())); 466 .c_str()));
573 } 467 }
574 468
575 } // namespace predictors 469 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698