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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 origin_data_map->clear(); | 158 origin_data_map->clear(); |
159 | 159 |
160 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map); | 160 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map); |
161 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map); | 161 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map); |
162 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); | 162 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); |
163 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); | 163 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); |
164 GetAllManifestDataHelper(manifest_map); | 164 GetAllManifestDataHelper(manifest_map); |
165 GetAllOriginDataHelper(origin_data_map); | 165 GetAllOriginDataHelper(origin_data_map); |
166 } | 166 } |
167 | 167 |
168 void ResourcePrefetchPredictorTables::UpdateData( | 168 void ResourcePrefetchPredictorTables::UpdateResourceData( |
169 const PrefetchData& url_data, | 169 const PrefetchData& data, |
170 const PrefetchData& host_data, | 170 PrefetchKeyType key_type) { |
171 const RedirectData& url_redirect_data, | 171 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateResourceData"); |
172 const RedirectData& host_redirect_data) { | |
173 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateData"); | |
174 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 172 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
175 if (CantAccessDatabase()) | 173 if (CantAccessDatabase()) |
176 return; | 174 return; |
177 | 175 |
178 DCHECK(url_data.has_primary_key() || host_data.has_primary_key() || | 176 UpdateDataHelper(key_type, PrefetchDataType::RESOURCE, data.primary_key(), |
179 url_redirect_data.has_primary_key() || | 177 data); |
180 host_redirect_data.has_primary_key()); | 178 } |
181 | 179 |
182 DB()->BeginTransaction(); | 180 void ResourcePrefetchPredictorTables::UpdateRedirectData( |
| 181 const RedirectData& data, |
| 182 PrefetchKeyType key_type) { |
| 183 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateRedirectData"); |
| 184 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 185 if (CantAccessDatabase()) |
| 186 return; |
183 | 187 |
184 bool success = | 188 UpdateDataHelper(key_type, PrefetchDataType::REDIRECT, data.primary_key(), |
185 (!url_data.has_primary_key() || | 189 data); |
186 UpdateDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::RESOURCE, | |
187 url_data.primary_key(), url_data)) && | |
188 (!host_data.has_primary_key() || | |
189 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::RESOURCE, | |
190 host_data.primary_key(), host_data)) && | |
191 (!url_redirect_data.has_primary_key() || | |
192 UpdateDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::REDIRECT, | |
193 url_redirect_data.primary_key(), url_redirect_data)) && | |
194 (!host_redirect_data.has_primary_key() || | |
195 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::REDIRECT, | |
196 host_redirect_data.primary_key(), host_redirect_data)); | |
197 if (!success) | |
198 DB()->RollbackTransaction(); | |
199 else | |
200 DB()->CommitTransaction(); | |
201 } | 190 } |
202 | 191 |
203 void ResourcePrefetchPredictorTables::UpdateManifestData( | 192 void ResourcePrefetchPredictorTables::UpdateManifestData( |
204 const std::string& host, | 193 const std::string& host, |
205 const precache::PrecacheManifest& manifest_data) { | 194 const precache::PrecacheManifest& manifest_data) { |
| 195 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateManifestData"); |
206 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 196 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
207 if (CantAccessDatabase()) | 197 if (CantAccessDatabase()) |
208 return; | 198 return; |
209 | 199 |
210 DB()->BeginTransaction(); | 200 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, |
211 bool success = UpdateDataHelper( | 201 manifest_data); |
212 PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, manifest_data); | |
213 | |
214 if (!success) | |
215 DB()->RollbackTransaction(); | |
216 else | |
217 DB()->CommitTransaction(); | |
218 } | 202 } |
219 | 203 |
220 void ResourcePrefetchPredictorTables::UpdateOriginData( | 204 void ResourcePrefetchPredictorTables::UpdateOriginData( |
221 const OriginData& origin_data) { | 205 const OriginData& origin_data) { |
| 206 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateOriginData"); |
222 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 207 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
223 if (CantAccessDatabase()) | 208 if (CantAccessDatabase()) |
224 return; | 209 return; |
225 | 210 |
226 std::string host = origin_data.host(); | 211 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::ORIGIN, |
227 DB()->BeginTransaction(); | 212 origin_data.host(), origin_data); |
228 bool success = UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, | |
229 PrefetchDataType::ORIGIN, host, origin_data); | |
230 | |
231 if (!success) | |
232 DB()->RollbackTransaction(); | |
233 else | |
234 DB()->CommitTransaction(); | |
235 } | 213 } |
236 | 214 |
237 void ResourcePrefetchPredictorTables::DeleteResourceData( | 215 void ResourcePrefetchPredictorTables::DeleteResourceData( |
238 const std::vector<std::string>& urls, | 216 const std::vector<std::string>& urls, |
239 const std::vector<std::string>& hosts) { | 217 const std::vector<std::string>& hosts) { |
240 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 218 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
241 if (CantAccessDatabase()) | 219 if (CantAccessDatabase()) |
242 return; | 220 return; |
243 | 221 |
244 DCHECK(!urls.empty() || !hosts.empty()); | 222 DCHECK(!urls.empty() || !hosts.empty()); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 .c_str())); | 356 .c_str())); |
379 | 357 |
380 OriginData data; | 358 OriginData data; |
381 std::string key; | 359 std::string key; |
382 while (StepAndInitializeProtoData(&reader, &key, &data)) { | 360 while (StepAndInitializeProtoData(&reader, &key, &data)) { |
383 origin_map->insert({key, data}); | 361 origin_map->insert({key, data}); |
384 DCHECK_EQ(data.host(), key); | 362 DCHECK_EQ(data.host(), key); |
385 } | 363 } |
386 } | 364 } |
387 | 365 |
388 bool ResourcePrefetchPredictorTables::UpdateDataHelper( | 366 void ResourcePrefetchPredictorTables::UpdateDataHelper( |
389 PrefetchKeyType key_type, | 367 PrefetchKeyType key_type, |
390 PrefetchDataType data_type, | 368 PrefetchDataType data_type, |
391 const std::string& key, | 369 const std::string& key, |
392 const MessageLite& data) { | 370 const MessageLite& data) { |
| 371 DB()->BeginTransaction(); |
| 372 |
393 // Delete the older data from the table. | 373 // Delete the older data from the table. |
394 std::unique_ptr<sql::Statement> deleter( | 374 std::unique_ptr<sql::Statement> deleter( |
395 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE)); | 375 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE)); |
396 deleter->BindString(0, key); | 376 deleter->BindString(0, key); |
397 if (!deleter->Run()) | 377 bool success = deleter->Run(); |
398 return false; | |
399 | 378 |
400 // Add the new data to the table. | 379 if (success) { |
401 std::unique_ptr<sql::Statement> inserter( | 380 // Add the new data to the table. |
402 GetTableUpdateStatement(key_type, data_type, TableOperationType::INSERT)); | 381 std::unique_ptr<sql::Statement> inserter(GetTableUpdateStatement( |
403 BindProtoDataToStatement(key, data, inserter.get()); | 382 key_type, data_type, TableOperationType::INSERT)); |
404 return inserter->Run(); | 383 BindProtoDataToStatement(key, data, inserter.get()); |
| 384 success = inserter->Run(); |
| 385 } |
| 386 |
| 387 if (!success) |
| 388 DB()->RollbackTransaction(); |
| 389 else |
| 390 DB()->CommitTransaction(); |
405 } | 391 } |
406 | 392 |
407 void ResourcePrefetchPredictorTables::DeleteDataHelper( | 393 void ResourcePrefetchPredictorTables::DeleteDataHelper( |
408 PrefetchKeyType key_type, | 394 PrefetchKeyType key_type, |
409 PrefetchDataType data_type, | 395 PrefetchDataType data_type, |
410 const std::vector<std::string>& keys) { | 396 const std::vector<std::string>& keys) { |
411 for (const std::string& key : keys) { | 397 for (const std::string& key : keys) { |
412 std::unique_ptr<sql::Statement> deleter(GetTableUpdateStatement( | 398 std::unique_ptr<sql::Statement> deleter(GetTableUpdateStatement( |
413 key_type, data_type, TableOperationType::REMOVE)); | 399 key_type, data_type, TableOperationType::REMOVE)); |
414 deleter->BindString(0, key); | 400 deleter->BindString(0, key); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 return kManifestTableName; | 609 return kManifestTableName; |
624 case PrefetchDataType::ORIGIN: | 610 case PrefetchDataType::ORIGIN: |
625 return kOriginTableName; | 611 return kOriginTableName; |
626 } | 612 } |
627 | 613 |
628 NOTREACHED(); | 614 NOTREACHED(); |
629 return nullptr; | 615 return nullptr; |
630 } | 616 } |
631 | 617 |
632 } // namespace predictors | 618 } // namespace predictors |
OLD | NEW |