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

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

Issue 2388783002: predictors: Refactor resource_prefetch_predictor_tables. (Closed)
Patch Set: Created 4 years, 2 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_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 ResourceData = predictors::ResourceData; 26 using PrefetchData = predictors::PrefetchData;
27 using RedirectData = predictors::RedirectData; 27 using RedirectData = predictors::RedirectData;
28 28
29 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; 29 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata";
30 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 30 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url";
31 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; 31 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata";
32 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; 32 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect";
33 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 33 const char kHostResourceTableName[] = "resource_prefetch_predictor_host";
34 const char kHostMetadataTableName[] = 34 const char kHostMetadataTableName[] =
35 "resource_prefetch_predictor_host_metadata"; 35 "resource_prefetch_predictor_host_metadata";
36 const char kHostRedirectTableName[] = 36 const char kHostRedirectTableName[] =
37 "resource_prefetch_predictor_host_redirect"; 37 "resource_prefetch_predictor_host_redirect";
38 38
39 const char kCreateGlobalMetadataStatementTemplate[] = 39 const char kCreateGlobalMetadataStatementTemplate[] =
40 "CREATE TABLE %s ( " 40 "CREATE TABLE %s ( "
41 "key TEXT, value INTEGER, " 41 "key TEXT, value INTEGER, "
42 "PRIMARY KEY (key))"; 42 "PRIMARY KEY (key))";
43 const char kCreateResourceTableStatementTemplate[] = 43 const char kCreateResourceTableStatementTemplate[] =
Benoit L 2016/10/04 08:22:42 Can you remove the duplication here?
alexilin 2016/10/04 09:43:48 Done.
44 "CREATE TABLE %s ( " 44 "CREATE TABLE %s ( "
45 "main_page_url TEXT, " 45 "main_page_url TEXT, "
46 "resource_url TEXT, "
47 "proto BLOB, " 46 "proto BLOB, "
48 "PRIMARY KEY(main_page_url, resource_url))";
49 const char kCreateMetadataTableStatementTemplate[] =
50 "CREATE TABLE %s ( "
51 "main_page_url TEXT, "
52 "last_visit_time INTEGER, "
53 "PRIMARY KEY(main_page_url))"; 47 "PRIMARY KEY(main_page_url))";
54 const char kCreateRedirectTableStatementTemplate[] = 48 const char kCreateRedirectTableStatementTemplate[] =
55 "CREATE TABLE %s ( " 49 "CREATE TABLE %s ( "
56 "main_page_url TEXT, " 50 "main_page_url TEXT, "
57 "proto BLOB, " 51 "proto BLOB, "
58 "PRIMARY KEY(main_page_url))"; 52 "PRIMARY KEY(main_page_url))";
59 53
60 const char kInsertResourceTableStatementTemplate[] = 54 const char kInsertResourceTableStatementTemplate[] =
61 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; 55 "INSERT INTO %s (main_page_url, proto) VALUES (?,?)";
62 const char kInsertRedirectTableStatementTemplate[] = 56 const char kInsertRedirectTableStatementTemplate[] =
63 "INSERT INTO %s (main_page_url, proto) VALUES (?,?)"; 57 "INSERT INTO %s (main_page_url, proto) VALUES (?,?)";
64 const char kInsertMetadataTableStatementTemplate[] =
65 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)";
66 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; 58 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?";
67 59
68 void BindResourceDataToStatement(const ResourceData& data, 60 void BindPrefetchDataToStatement(const PrefetchData& data,
69 const std::string& primary_key,
70 Statement* statement) { 61 Statement* statement) {
71 int size = data.ByteSize(); 62 int size = data.ByteSize();
72 DCHECK_GT(size, 0); 63 DCHECK_GT(size, 0);
73 std::vector<char> proto_buffer(size); 64 std::vector<char> proto_buffer(size);
74 data.SerializeToArray(&proto_buffer[0], size); 65 data.SerializeToArray(&proto_buffer[0], size);
75 66
76 statement->BindString(0, primary_key); 67 statement->BindString(0, data.primary_key());
77 statement->BindString(1, data.resource_url()); 68 statement->BindBlob(1, &proto_buffer[0], size);
78 statement->BindBlob(2, &proto_buffer[0], size);
79 } 69 }
80 70
81 void BindRedirectDataToStatement(const RedirectData& data, 71 void BindRedirectDataToStatement(const RedirectData& data,
Benoit L 2016/10/04 08:22:42 This function is now identical to the one above. C
alexilin 2016/10/04 09:43:48 Done.
82 Statement* statement) { 72 Statement* statement) {
83 int size = data.ByteSize(); 73 int size = data.ByteSize();
84 DCHECK_GT(size, 0); 74 DCHECK_GT(size, 0);
85 std::vector<char> proto_buffer(size); 75 std::vector<char> proto_buffer(size);
86 data.SerializeToArray(&proto_buffer[0], size); 76 data.SerializeToArray(&proto_buffer[0], size);
87 77
88 statement->BindString(0, data.primary_key()); 78 statement->BindString(0, data.primary_key());
89 statement->BindBlob(1, &proto_buffer[0], size); 79 statement->BindBlob(1, &proto_buffer[0], size);
90 } 80 }
91 81
92 bool StepAndInitializeResourceData(Statement* statement, 82 bool StepAndInitializePrefetchData(Statement* statement,
93 ResourceData* data, 83 PrefetchData* data,
94 std::string* primary_key) { 84 std::string* primary_key) {
95 if (!statement->Step()) 85 if (!statement->Step())
96 return false; 86 return false;
97 87
98 *primary_key = statement->ColumnString(0); 88 *primary_key = statement->ColumnString(0);
99 int size = statement->ColumnByteLength(2); 89
100 const void* blob = statement->ColumnBlob(2); 90 int size = statement->ColumnByteLength(1);
91 const void* blob = statement->ColumnBlob(1);
101 DCHECK(blob); 92 DCHECK(blob);
102 data->ParseFromArray(blob, size); 93 data->ParseFromArray(blob, size);
103 94
104 std::string resource_url = statement->ColumnString(1); 95 DCHECK_EQ(data->primary_key(), *primary_key);
105 DCHECK(resource_url == data->resource_url());
106 96
107 return true; 97 return true;
108 } 98 }
109 99
110 bool StepAndInitializeRedirectData(Statement* statement, 100 bool StepAndInitializeRedirectData(Statement* statement,
Benoit L 2016/10/04 08:22:42 Ditto, can you remove the code duplication?
alexilin 2016/10/04 09:43:48 Done.
111 RedirectData* data, 101 RedirectData* data,
112 std::string* primary_key) { 102 std::string* primary_key) {
113 if (!statement->Step()) 103 if (!statement->Step())
114 return false; 104 return false;
115 105
116 *primary_key = statement->ColumnString(0); 106 *primary_key = statement->ColumnString(0);
117 107
118 int size = statement->ColumnByteLength(1); 108 int size = statement->ColumnByteLength(1);
119 const void* blob = statement->ColumnBlob(1); 109 const void* blob = statement->ColumnBlob(1);
120 DCHECK(blob); 110 DCHECK(blob);
(...skipping 19 matching lines...) Expand all
140 130
141 // static 131 // static
142 void ResourcePrefetchPredictorTables::SortRedirects( 132 void ResourcePrefetchPredictorTables::SortRedirects(
143 std::vector<RedirectStat>* redirects) { 133 std::vector<RedirectStat>* redirects) {
144 std::sort(redirects->begin(), redirects->end(), 134 std::sort(redirects->begin(), redirects->end(),
145 [](const RedirectStat& x, const RedirectStat& y) { 135 [](const RedirectStat& x, const RedirectStat& y) {
146 return ComputeRedirectScore(x) > ComputeRedirectScore(y); 136 return ComputeRedirectScore(x) > ComputeRedirectScore(y);
147 }); 137 });
148 } 138 }
149 139
150 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
151 PrefetchKeyType i_key_type,
152 const std::string& i_primary_key)
153 : key_type(i_key_type),
154 primary_key(i_primary_key) {
155 }
156
157 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
158 const PrefetchData& other)
159 : key_type(other.key_type),
160 primary_key(other.primary_key),
161 last_visit(other.last_visit),
162 resources(other.resources) {
163 }
164
165 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() {
166 }
167
168 void ResourcePrefetchPredictorTables::GetAllData( 140 void ResourcePrefetchPredictorTables::GetAllData(
169 PrefetchDataMap* url_data_map, 141 PrefetchDataMap* url_data_map,
170 PrefetchDataMap* host_data_map, 142 PrefetchDataMap* host_data_map,
171 RedirectDataMap* url_redirect_data_map, 143 RedirectDataMap* url_redirect_data_map,
172 RedirectDataMap* host_redirect_data_map) { 144 RedirectDataMap* host_redirect_data_map) {
173 DCHECK_CURRENTLY_ON(BrowserThread::DB); 145 DCHECK_CURRENTLY_ON(BrowserThread::DB);
174 if (CantAccessDatabase()) 146 if (CantAccessDatabase())
175 return; 147 return;
176 148
177 DCHECK(url_data_map); 149 DCHECK(url_data_map);
178 DCHECK(host_data_map); 150 DCHECK(host_data_map);
179 DCHECK(url_redirect_data_map); 151 DCHECK(url_redirect_data_map);
180 DCHECK(host_redirect_data_map); 152 DCHECK(host_redirect_data_map);
181 url_data_map->clear(); 153 url_data_map->clear();
182 host_data_map->clear(); 154 host_data_map->clear();
183 url_redirect_data_map->clear(); 155 url_redirect_data_map->clear();
184 host_redirect_data_map->clear(); 156 host_redirect_data_map->clear();
185 157
186 std::vector<std::string> urls_to_delete, hosts_to_delete; 158 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map);
187 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, 159 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map);
188 &urls_to_delete);
189 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map,
190 &hosts_to_delete);
191 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); 160 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map);
192 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); 161 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map);
193
194 if (!urls_to_delete.empty() || !hosts_to_delete.empty())
195 DeleteResourceData(urls_to_delete, hosts_to_delete);
196 } 162 }
197 163
198 void ResourcePrefetchPredictorTables::UpdateData( 164 void ResourcePrefetchPredictorTables::UpdateData(
199 const PrefetchData& url_data, 165 const PrefetchData& url_data,
200 const PrefetchData& host_data, 166 const PrefetchData& host_data,
201 const RedirectData& url_redirect_data, 167 const RedirectData& url_redirect_data,
202 const RedirectData& host_redirect_data) { 168 const RedirectData& host_redirect_data) {
203 DCHECK_CURRENTLY_ON(BrowserThread::DB); 169 DCHECK_CURRENTLY_ON(BrowserThread::DB);
204 if (CantAccessDatabase()) 170 if (CantAccessDatabase())
205 return; 171 return;
206 172
207 DCHECK(!url_data.is_host() && host_data.is_host()); 173 DCHECK(url_data.has_primary_key() || host_data.has_primary_key() ||
208 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty() ||
209 url_redirect_data.has_primary_key() || 174 url_redirect_data.has_primary_key() ||
210 host_redirect_data.has_primary_key()); 175 host_redirect_data.has_primary_key());
211 176
212 DB()->BeginTransaction(); 177 DB()->BeginTransaction();
213 178
214 bool success = 179 bool success =
215 (url_data.primary_key.empty() || 180 (!url_data.has_primary_key() ||
216 UpdateResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data)) && 181 UpdateResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data)) &&
217 (host_data.primary_key.empty() || 182 (!host_data.has_primary_key() ||
218 UpdateResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data)) && 183 UpdateResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data)) &&
219 (!url_redirect_data.has_primary_key() || 184 (!url_redirect_data.has_primary_key() ||
220 UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data)) && 185 UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data)) &&
221 (!host_redirect_data.has_primary_key() || 186 (!host_redirect_data.has_primary_key() ||
222 UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data)); 187 UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data));
223 if (!success) 188 if (!success)
224 DB()->RollbackTransaction(); 189 DB()->RollbackTransaction();
225 else 190 else
226 DB()->CommitTransaction(); 191 DB()->CommitTransaction();
227 } 192 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 240
276 DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key}); 241 DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key});
277 } 242 }
278 243
279 void ResourcePrefetchPredictorTables::DeleteAllData() { 244 void ResourcePrefetchPredictorTables::DeleteAllData() {
280 if (CantAccessDatabase()) 245 if (CantAccessDatabase())
281 return; 246 return;
282 247
283 Statement deleter; 248 Statement deleter;
284 for (const char* table_name : 249 for (const char* table_name :
285 {kUrlResourceTableName, kUrlMetadataTableName, kUrlRedirectTableName, 250 {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName,
286 kHostResourceTableName, kHostMetadataTableName,
287 kHostRedirectTableName}) { 251 kHostRedirectTableName}) {
288 deleter.Assign(DB()->GetUniqueStatement( 252 deleter.Assign(DB()->GetUniqueStatement(
289 base::StringPrintf("DELETE FROM %s", table_name).c_str())); 253 base::StringPrintf("DELETE FROM %s", table_name).c_str()));
290 deleter.Run(); 254 deleter.Run();
291 } 255 }
292 } 256 }
293 257
294 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() 258 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables()
295 : PredictorTableBase() { 259 : PredictorTableBase() {}
296 }
297 260
298 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { 261 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {}
299 }
300 262
301 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper( 263 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper(
302 PrefetchKeyType key_type, 264 PrefetchKeyType key_type,
303 PrefetchDataMap* data_map, 265 PrefetchDataMap* data_map) {
304 std::vector<std::string>* to_delete) {
305 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 266 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
306 267
307 // Read the resources table and organize it per primary key. 268 // Read the resources table and organize it per primary key.
308 const char* resource_table_name = is_host ? kHostResourceTableName : 269 const char* resource_table_name = is_host ? kHostResourceTableName :
309 kUrlResourceTableName; 270 kUrlResourceTableName;
310 Statement resource_reader(DB()->GetUniqueStatement( 271 Statement resource_reader(DB()->GetUniqueStatement(
311 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str())); 272 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str()));
312 273
313 ResourceData resource; 274 PrefetchData data;
314 std::string primary_key; 275 std::string primary_key;
315 while (StepAndInitializeResourceData(&resource_reader, &resource, 276 while (StepAndInitializePrefetchData(&resource_reader, &data, &primary_key))
316 &primary_key)) { 277 data_map->insert(std::make_pair(primary_key, data));
317 PrefetchDataMap::iterator it = data_map->find(primary_key);
318 if (it == data_map->end()) {
319 it = data_map->insert(std::make_pair(
320 primary_key, PrefetchData(key_type, primary_key))).first;
321 }
322 it->second.resources.push_back(resource);
323 }
324 278
325 // Sort each of the resource row vectors by score. 279 // Sort each of the resource vectors by score.
326 for (auto& kv : *data_map) 280 for (auto& kv : *data_map) {
327 SortResources(&(kv.second.resources)); 281 std::vector<ResourceData> resources(kv.second.resources().begin(),
Benoit L 2016/10/04 08:22:42 Is it possible to sort directly the .mutable_resou
alexilin 2016/10/04 09:43:48 Done.
328 282 kv.second.resources().end());
329 // Read the metadata and keep track of entries that have metadata, but no 283 SortResources(&resources);
330 // resource entries, so they can be deleted. 284 kv.second.clear_resources();
331 const char* metadata_table_name = 285 for (const ResourceData& resource : resources)
332 is_host ? kHostMetadataTableName : kUrlMetadataTableName; 286 kv.second.add_resources()->CopyFrom(resource);
333 Statement metadata_reader(DB()->GetUniqueStatement(
334 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str()));
335
336 while (metadata_reader.Step()) {
337 std::string primary_key = metadata_reader.ColumnString(0);
338
339 PrefetchDataMap::iterator it = data_map->find(primary_key);
340 if (it != data_map->end()) {
341 int64_t last_visit = metadata_reader.ColumnInt64(1);
342 it->second.last_visit = base::Time::FromInternalValue(last_visit);
343 } else {
344 to_delete->push_back(primary_key);
345 }
346 } 287 }
347 } 288 }
348 289
349 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( 290 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper(
350 PrefetchKeyType key_type, 291 PrefetchKeyType key_type,
351 RedirectDataMap* redirect_map) { 292 RedirectDataMap* redirect_map) {
352 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 293 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
353 294
354 const char* redirect_table_name = 295 const char* redirect_table_name =
355 is_host ? kHostRedirectTableName : kUrlRedirectTableName; 296 is_host ? kHostRedirectTableName : kUrlRedirectTableName;
356 Statement redirect_reader(DB()->GetUniqueStatement( 297 Statement redirect_reader(DB()->GetUniqueStatement(
357 base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str())); 298 base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str()));
358 299
359 RedirectData data; 300 RedirectData data;
360 std::string primary_key; 301 std::string primary_key;
361 while (StepAndInitializeRedirectData(&redirect_reader, &data, &primary_key)) { 302 while (StepAndInitializeRedirectData(&redirect_reader, &data, &primary_key)) {
362 auto result = redirect_map->insert(std::make_pair(primary_key, data)); 303 auto result = redirect_map->insert(std::make_pair(primary_key, data));
363 DCHECK(result.second); 304 DCHECK(result.second);
364 } 305 }
365 } 306 }
366 307
367 bool ResourcePrefetchPredictorTables::UpdateResourceDataHelper( 308 bool ResourcePrefetchPredictorTables::UpdateResourceDataHelper(
368 PrefetchKeyType key_type, 309 PrefetchKeyType key_type,
369 const PrefetchData& data) { 310 const PrefetchData& data) {
370 DCHECK(!data.primary_key.empty()); 311 DCHECK(data.has_primary_key());
371 312
372 if (!StringsAreSmallerThanDBLimit(data)) { 313 if (!StringsAreSmallerThanDBLimit(data)) {
373 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); 314 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
374 return false; 315 return false;
375 } 316 }
376 317
377 // Delete the older data from both the tables. 318 // Delete the older data from the table.
378 std::unique_ptr<Statement> deleter(GetTableUpdateStatement( 319 std::unique_ptr<Statement> deleter(GetTableUpdateStatement(
379 key_type, PrefetchDataType::RESOURCE, TableOperationType::REMOVE)); 320 key_type, PrefetchDataType::RESOURCE, TableOperationType::REMOVE));
380 deleter->BindString(0, data.primary_key); 321 deleter->BindString(0, data.primary_key());
381 if (!deleter->Run()) 322 if (!deleter->Run())
382 return false; 323 return false;
383 324
384 deleter = GetTableUpdateStatement(key_type, PrefetchDataType::METADATA, 325 // Add the new data to the table.
385 TableOperationType::REMOVE); 326 std::unique_ptr<Statement> inserter(GetTableUpdateStatement(
386 deleter->BindString(0, data.primary_key); 327 key_type, PrefetchDataType::RESOURCE, TableOperationType::INSERT));
387 if (!deleter->Run()) 328 BindPrefetchDataToStatement(data, inserter.get());
388 return false; 329 return inserter->Run();
389
390 // Add the new data to the tables.
391 for (const ResourceData& resource : data.resources) {
392 std::unique_ptr<Statement> resource_inserter(GetTableUpdateStatement(
393 key_type, PrefetchDataType::RESOURCE, TableOperationType::INSERT));
394 BindResourceDataToStatement(resource, data.primary_key,
395 resource_inserter.get());
396 if (!resource_inserter->Run())
397 return false;
398 }
399
400 std::unique_ptr<Statement> metadata_inserter(GetTableUpdateStatement(
401 key_type, PrefetchDataType::METADATA, TableOperationType::INSERT));
402 metadata_inserter->BindString(0, data.primary_key);
403 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue());
404 return metadata_inserter->Run();
405 } 330 }
406 331
407 bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper( 332 bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper(
408 PrefetchKeyType key_type, 333 PrefetchKeyType key_type,
409 const RedirectData& data) { 334 const RedirectData& data) {
410 DCHECK(data.has_primary_key()); 335 DCHECK(data.has_primary_key());
411 336
412 if (!StringsAreSmallerThanDBLimit(data)) { 337 if (!StringsAreSmallerThanDBLimit(data)) {
413 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); 338 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
414 return false; 339 return false;
(...skipping 10 matching lines...) Expand all
425 std::unique_ptr<Statement> inserter(GetTableUpdateStatement( 350 std::unique_ptr<Statement> inserter(GetTableUpdateStatement(
426 key_type, PrefetchDataType::REDIRECT, TableOperationType::INSERT)); 351 key_type, PrefetchDataType::REDIRECT, TableOperationType::INSERT));
427 BindRedirectDataToStatement(data, inserter.get()); 352 BindRedirectDataToStatement(data, inserter.get());
428 return inserter->Run(); 353 return inserter->Run();
429 } 354 }
430 355
431 void ResourcePrefetchPredictorTables::DeleteDataHelper( 356 void ResourcePrefetchPredictorTables::DeleteDataHelper(
432 PrefetchKeyType key_type, 357 PrefetchKeyType key_type,
433 PrefetchDataType data_type, 358 PrefetchDataType data_type,
434 const std::vector<std::string>& keys) { 359 const std::vector<std::string>& keys) {
435 bool is_resource = data_type == PrefetchDataType::RESOURCE;
436
437 for (const std::string& key : keys) { 360 for (const std::string& key : keys) {
438 std::unique_ptr<Statement> deleter(GetTableUpdateStatement( 361 std::unique_ptr<Statement> deleter(GetTableUpdateStatement(
439 key_type, data_type, TableOperationType::REMOVE)); 362 key_type, data_type, TableOperationType::REMOVE));
440 deleter->BindString(0, key); 363 deleter->BindString(0, key);
441 deleter->Run(); 364 deleter->Run();
442
443 if (is_resource) {
444 // Delete corresponding resource metadata as well.
445 deleter = GetTableUpdateStatement(key_type, PrefetchDataType::METADATA,
446 TableOperationType::REMOVE);
447 deleter->BindString(0, key);
448 deleter->Run();
449 }
450 } 365 }
451 } 366 }
452 367
453 // static 368 // static
454 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( 369 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
455 const PrefetchData& data) { 370 const PrefetchData& data) {
456 if (data.primary_key.length() > kMaxStringLength) 371 if (data.primary_key().length() > kMaxStringLength)
457 return false; 372 return false;
458 373
459 for (const ResourceData& resource : data.resources) { 374 for (const ResourceData& resource : data.resources()) {
460 if (resource.resource_url().length() > kMaxStringLength) 375 if (resource.resource_url().length() > kMaxStringLength)
461 return false; 376 return false;
462 } 377 }
463 return true; 378 return true;
464 } 379 }
465 380
466 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( 381 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
467 const RedirectData& data) { 382 const RedirectData& data) {
468 if (data.primary_key().length() > kMaxStringLength) 383 if (data.primary_key().length() > kMaxStringLength)
469 return false; 384 return false;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 bool success = transaction.Begin(); 485 bool success = transaction.Begin();
571 486
572 success = success && DropTablesIfOutdated(db); 487 success = success && DropTablesIfOutdated(db);
573 488
574 success = 489 success =
575 success && 490 success &&
576 (db->DoesTableExist(kUrlResourceTableName) || 491 (db->DoesTableExist(kUrlResourceTableName) ||
577 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, 492 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate,
578 kUrlResourceTableName) 493 kUrlResourceTableName)
579 .c_str())) && 494 .c_str())) &&
580 (db->DoesTableExist(kUrlMetadataTableName) ||
581 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
582 kUrlMetadataTableName)
583 .c_str())) &&
584 (db->DoesTableExist(kUrlRedirectTableName) || 495 (db->DoesTableExist(kUrlRedirectTableName) ||
585 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, 496 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
586 kUrlRedirectTableName) 497 kUrlRedirectTableName)
587 .c_str())) && 498 .c_str())) &&
588 (db->DoesTableExist(kHostResourceTableName) || 499 (db->DoesTableExist(kHostResourceTableName) ||
589 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, 500 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate,
590 kHostResourceTableName) 501 kHostResourceTableName)
591 .c_str())) && 502 .c_str())) &&
592 (db->DoesTableExist(kHostMetadataTableName) ||
593 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
594 kHostMetadataTableName)
595 .c_str())) &&
596 (db->DoesTableExist(kHostRedirectTableName) || 503 (db->DoesTableExist(kHostRedirectTableName) ||
597 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, 504 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
598 kHostRedirectTableName) 505 kHostRedirectTableName)
599 .c_str())); 506 .c_str()));
600 507
601 if (success) 508 if (success)
602 success = transaction.Commit(); 509 success = transaction.Commit();
603 else 510 else
604 transaction.Rollback(); 511 transaction.Rollback();
605 512
(...skipping 19 matching lines...) Expand all
625 if (statement.Step()) 532 if (statement.Step())
626 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", 533 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount",
627 statement.ColumnInt(0)); 534 statement.ColumnInt(0));
628 } 535 }
629 536
630 std::unique_ptr<Statement> 537 std::unique_ptr<Statement>
631 ResourcePrefetchPredictorTables::GetTableUpdateStatement( 538 ResourcePrefetchPredictorTables::GetTableUpdateStatement(
632 PrefetchKeyType key_type, 539 PrefetchKeyType key_type,
633 PrefetchDataType data_type, 540 PrefetchDataType data_type,
634 TableOperationType op_type) { 541 TableOperationType op_type) {
542 DCHECK(key_type == PREFETCH_KEY_TYPE_URL ||
543 key_type == PREFETCH_KEY_TYPE_HOST);
544 DCHECK(data_type == PrefetchDataType::RESOURCE ||
545 data_type == PrefetchDataType::REDIRECT);
546
635 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | 547 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) |
636 (static_cast<int>(op_type) << 3)); 548 (static_cast<int>(op_type) << 2));
637 const char* statement_template = 549 const char* statement_template =
638 GetTableUpdateStatementTemplate(op_type, data_type); 550 GetTableUpdateStatementTemplate(op_type, data_type);
639 const char* table_name = 551 const char* table_name =
640 GetTableUpdateStatementTableName(key_type, data_type); 552 GetTableUpdateStatementTableName(key_type, data_type);
641 return base::MakeUnique<Statement>(DB()->GetCachedStatement( 553 return base::MakeUnique<Statement>(DB()->GetCachedStatement(
642 id, base::StringPrintf(statement_template, table_name).c_str())); 554 id, base::StringPrintf(statement_template, table_name).c_str()));
643 } 555 }
644 556
645 // static 557 // static
646 const char* ResourcePrefetchPredictorTables::GetTableUpdateStatementTemplate( 558 const char* ResourcePrefetchPredictorTables::GetTableUpdateStatementTemplate(
647 TableOperationType op_type, 559 TableOperationType op_type,
648 PrefetchDataType data_type) { 560 PrefetchDataType data_type) {
649 switch (op_type) { 561 switch (op_type) {
650 case TableOperationType::REMOVE: 562 case TableOperationType::REMOVE:
651 return kDeleteStatementTemplate; 563 return kDeleteStatementTemplate;
652 case TableOperationType::INSERT: 564 case TableOperationType::INSERT:
653 switch (data_type) { 565 bool is_resource = data_type == PrefetchDataType::RESOURCE;
654 case PrefetchDataType::RESOURCE: 566 return is_resource ? kInsertResourceTableStatementTemplate
655 return kInsertResourceTableStatementTemplate; 567 : kInsertRedirectTableStatementTemplate;
656 case PrefetchDataType::REDIRECT:
657 return kInsertRedirectTableStatementTemplate;
658 case PrefetchDataType::METADATA:
659 return kInsertMetadataTableStatementTemplate;
660 }
661 } 568 }
662 569
663 NOTREACHED(); 570 NOTREACHED();
664 return nullptr; 571 return nullptr;
665 } 572 }
666 573
667 // static 574 // static
668 const char* ResourcePrefetchPredictorTables::GetTableUpdateStatementTableName( 575 const char* ResourcePrefetchPredictorTables::GetTableUpdateStatementTableName(
669 PrefetchKeyType key_type, 576 PrefetchKeyType key_type,
670 PrefetchDataType data_type) { 577 PrefetchDataType data_type) {
671 DCHECK(key_type == PREFETCH_KEY_TYPE_URL || 578 DCHECK(key_type == PREFETCH_KEY_TYPE_URL ||
672 key_type == PREFETCH_KEY_TYPE_HOST); 579 key_type == PREFETCH_KEY_TYPE_HOST);
673 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 580 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
674 switch (data_type) { 581 switch (data_type) {
675 case PrefetchDataType::RESOURCE: 582 case PrefetchDataType::RESOURCE:
676 return is_host ? kHostResourceTableName : kUrlResourceTableName; 583 return is_host ? kHostResourceTableName : kUrlResourceTableName;
677 case PrefetchDataType::REDIRECT: 584 case PrefetchDataType::REDIRECT:
678 return is_host ? kHostRedirectTableName : kUrlRedirectTableName; 585 return is_host ? kHostRedirectTableName : kUrlRedirectTableName;
679 case PrefetchDataType::METADATA:
680 return is_host ? kHostMetadataTableName : kUrlMetadataTableName;
681 } 586 }
682 587
683 NOTREACHED(); 588 NOTREACHED();
684 return nullptr; 589 return nullptr;
685 } 590 }
686 591
687 } // namespace predictors 592 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698