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

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

Issue 2851473002: predictors: Extract sql key-value tables into separate class. (Closed)
Patch Set: Created 3 years, 7 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 <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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698