| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/appcache/appcache_database.h" | 5 #include "content/browser/appcache/appcache_database.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "content/browser/appcache/appcache_entry.h" | 13 #include "content/browser/appcache/appcache_entry.h" |
| 14 #include "content/browser/appcache/appcache_histograms.h" | 14 #include "content/browser/appcache/appcache_histograms.h" |
| 15 #include "sql/connection.h" | 15 #include "sql/connection.h" |
| 16 #include "sql/error_delegate_util.h" | 16 #include "sql/error_delegate_util.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 namespace content { | 21 namespace content { |
| 22 | 22 |
| 23 // Schema ------------------------------------------------------------------- | 23 // Schema ------------------------------------------------------------------- |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 #if defined(APPCACHE_USE_SIMPLE_CACHE) | 26 const int kCurrentVersion = 7; |
| 27 const int kCurrentVersion = 6; | 27 const int kCompatibleVersion = 7; |
| 28 const int kCompatibleVersion = 6; | 28 const bool kCreateIfNeeded = true; |
| 29 #else | 29 const bool kDontCreate = false; |
| 30 const int kCurrentVersion = 5; | |
| 31 const int kCompatibleVersion = 5; | |
| 32 #endif | |
| 33 | 30 |
| 34 // A mechanism to run experiments that may affect in data being persisted | 31 // A mechanism to run experiments that may affect in data being persisted |
| 35 // in different ways such that when the experiment is toggled on/off via | 32 // in different ways such that when the experiment is toggled on/off via |
| 36 // cmd line flags, the database gets reset. The active flags are stored at | 33 // cmd line flags, the database gets reset. The active flags are stored at |
| 37 // the time of database creation and compared when reopening. If different | 34 // the time of database creation and compared when reopening. If different |
| 38 // the database is reset. | 35 // the database is reset. |
| 39 const char kExperimentFlagsKey[] = "ExperimentFlags"; | 36 const char kExperimentFlagsKey[] = "ExperimentFlags"; |
| 40 | 37 |
| 41 const char kGroupsTable[] = "Groups"; | 38 const char kGroupsTable[] = "Groups"; |
| 42 const char kCachesTable[] = "Caches"; | 39 const char kCachesTable[] = "Caches"; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 56 const char* columns; | 53 const char* columns; |
| 57 bool unique; | 54 bool unique; |
| 58 }; | 55 }; |
| 59 | 56 |
| 60 const TableInfo kTables[] = { | 57 const TableInfo kTables[] = { |
| 61 { kGroupsTable, | 58 { kGroupsTable, |
| 62 "(group_id INTEGER PRIMARY KEY," | 59 "(group_id INTEGER PRIMARY KEY," |
| 63 " origin TEXT," | 60 " origin TEXT," |
| 64 " manifest_url TEXT," | 61 " manifest_url TEXT," |
| 65 " creation_time INTEGER," | 62 " creation_time INTEGER," |
| 66 " last_access_time INTEGER)" }, | 63 " last_access_time INTEGER," |
| 64 " last_full_update_check_time INTEGER," |
| 65 " first_evictable_error_time INTEGER)" }, |
| 67 | 66 |
| 68 { kCachesTable, | 67 { kCachesTable, |
| 69 "(cache_id INTEGER PRIMARY KEY," | 68 "(cache_id INTEGER PRIMARY KEY," |
| 70 " group_id INTEGER," | 69 " group_id INTEGER," |
| 71 " online_wildcard INTEGER CHECK(online_wildcard IN (0, 1))," | 70 " online_wildcard INTEGER CHECK(online_wildcard IN (0, 1))," |
| 72 " update_time INTEGER," | 71 " update_time INTEGER," |
| 73 " cache_size INTEGER)" }, // intentionally not normalized | 72 " cache_size INTEGER)" }, // intentionally not normalized |
| 74 | 73 |
| 75 { kEntriesTable, | 74 { kEntriesTable, |
| 76 "(cache_id INTEGER," | 75 "(cache_id INTEGER," |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 return false; | 238 return false; |
| 240 for (std::set<GURL>::const_iterator origin = origins.begin(); | 239 for (std::set<GURL>::const_iterator origin = origins.begin(); |
| 241 origin != origins.end(); ++origin) { | 240 origin != origins.end(); ++origin) { |
| 242 (*usage_map)[*origin] = GetOriginUsage(*origin); | 241 (*usage_map)[*origin] = GetOriginUsage(*origin); |
| 243 } | 242 } |
| 244 return true; | 243 return true; |
| 245 } | 244 } |
| 246 | 245 |
| 247 bool AppCacheDatabase::FindOriginsWithGroups(std::set<GURL>* origins) { | 246 bool AppCacheDatabase::FindOriginsWithGroups(std::set<GURL>* origins) { |
| 248 DCHECK(origins && origins->empty()); | 247 DCHECK(origins && origins->empty()); |
| 249 if (!LazyOpen(false)) | 248 if (!LazyOpen(kDontCreate)) |
| 250 return false; | 249 return false; |
| 251 | 250 |
| 252 const char* kSql = | 251 const char kSql[] = |
| 253 "SELECT DISTINCT(origin) FROM Groups"; | 252 "SELECT DISTINCT(origin) FROM Groups"; |
| 254 | 253 |
| 255 sql::Statement statement(db_->GetUniqueStatement(kSql)); | 254 sql::Statement statement(db_->GetUniqueStatement(kSql)); |
| 256 | 255 |
| 257 while (statement.Step()) | 256 while (statement.Step()) |
| 258 origins->insert(GURL(statement.ColumnString(0))); | 257 origins->insert(GURL(statement.ColumnString(0))); |
| 259 | 258 |
| 260 return statement.Succeeded(); | 259 return statement.Succeeded(); |
| 261 } | 260 } |
| 262 | 261 |
| 263 bool AppCacheDatabase::FindLastStorageIds( | 262 bool AppCacheDatabase::FindLastStorageIds( |
| 264 int64* last_group_id, int64* last_cache_id, int64* last_response_id, | 263 int64* last_group_id, int64* last_cache_id, int64* last_response_id, |
| 265 int64* last_deletable_response_rowid) { | 264 int64* last_deletable_response_rowid) { |
| 266 DCHECK(last_group_id && last_cache_id && last_response_id && | 265 DCHECK(last_group_id && last_cache_id && last_response_id && |
| 267 last_deletable_response_rowid); | 266 last_deletable_response_rowid); |
| 268 | 267 |
| 269 *last_group_id = 0; | 268 *last_group_id = 0; |
| 270 *last_cache_id = 0; | 269 *last_cache_id = 0; |
| 271 *last_response_id = 0; | 270 *last_response_id = 0; |
| 272 *last_deletable_response_rowid = 0; | 271 *last_deletable_response_rowid = 0; |
| 273 | 272 |
| 274 if (!LazyOpen(false)) | 273 if (!LazyOpen(kDontCreate)) |
| 275 return false; | 274 return false; |
| 276 | 275 |
| 277 const char* kMaxGroupIdSql = "SELECT MAX(group_id) FROM Groups"; | 276 const char* kMaxGroupIdSql = "SELECT MAX(group_id) FROM Groups"; |
| 278 const char* kMaxCacheIdSql = "SELECT MAX(cache_id) FROM Caches"; | 277 const char* kMaxCacheIdSql = "SELECT MAX(cache_id) FROM Caches"; |
| 279 const char* kMaxResponseIdFromEntriesSql = | 278 const char* kMaxResponseIdFromEntriesSql = |
| 280 "SELECT MAX(response_id) FROM Entries"; | 279 "SELECT MAX(response_id) FROM Entries"; |
| 281 const char* kMaxResponseIdFromDeletablesSql = | 280 const char* kMaxResponseIdFromDeletablesSql = |
| 282 "SELECT MAX(response_id) FROM DeletableResponseIds"; | 281 "SELECT MAX(response_id) FROM DeletableResponseIds"; |
| 283 const char* kMaxDeletableResponseRowIdSql = | 282 const char* kMaxDeletableResponseRowIdSql = |
| 284 "SELECT MAX(rowid) FROM DeletableResponseIds"; | 283 "SELECT MAX(rowid) FROM DeletableResponseIds"; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 301 *last_group_id = max_group_id; | 300 *last_group_id = max_group_id; |
| 302 *last_cache_id = max_cache_id; | 301 *last_cache_id = max_cache_id; |
| 303 *last_response_id = std::max(max_response_id_from_entries, | 302 *last_response_id = std::max(max_response_id_from_entries, |
| 304 max_response_id_from_deletables); | 303 max_response_id_from_deletables); |
| 305 *last_deletable_response_rowid = max_deletable_response_rowid; | 304 *last_deletable_response_rowid = max_deletable_response_rowid; |
| 306 return true; | 305 return true; |
| 307 } | 306 } |
| 308 | 307 |
| 309 bool AppCacheDatabase::FindGroup(int64 group_id, GroupRecord* record) { | 308 bool AppCacheDatabase::FindGroup(int64 group_id, GroupRecord* record) { |
| 310 DCHECK(record); | 309 DCHECK(record); |
| 311 if (!LazyOpen(false)) | 310 if (!LazyOpen(kDontCreate)) |
| 312 return false; | 311 return false; |
| 313 | 312 |
| 314 const char* kSql = | 313 const char kSql[] = |
| 315 "SELECT group_id, origin, manifest_url," | 314 "SELECT group_id, origin, manifest_url," |
| 316 " creation_time, last_access_time" | 315 " creation_time, last_access_time," |
| 316 " last_full_update_check_time," |
| 317 " first_evictable_error_time" |
| 317 " FROM Groups WHERE group_id = ?"; | 318 " FROM Groups WHERE group_id = ?"; |
| 318 | 319 |
| 319 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 320 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 320 | 321 |
| 321 statement.BindInt64(0, group_id); | 322 statement.BindInt64(0, group_id); |
| 322 if (!statement.Step()) | 323 if (!statement.Step()) |
| 323 return false; | 324 return false; |
| 324 | 325 |
| 325 ReadGroupRecord(statement, record); | 326 ReadGroupRecord(statement, record); |
| 326 DCHECK(record->group_id == group_id); | 327 DCHECK(record->group_id == group_id); |
| 327 return true; | 328 return true; |
| 328 } | 329 } |
| 329 | 330 |
| 330 bool AppCacheDatabase::FindGroupForManifestUrl( | 331 bool AppCacheDatabase::FindGroupForManifestUrl( |
| 331 const GURL& manifest_url, GroupRecord* record) { | 332 const GURL& manifest_url, GroupRecord* record) { |
| 332 DCHECK(record); | 333 DCHECK(record); |
| 333 if (!LazyOpen(false)) | 334 if (!LazyOpen(kDontCreate)) |
| 334 return false; | 335 return false; |
| 335 | 336 |
| 336 const char* kSql = | 337 const char kSql[] = |
| 337 "SELECT group_id, origin, manifest_url," | 338 "SELECT group_id, origin, manifest_url," |
| 338 " creation_time, last_access_time" | 339 " creation_time, last_access_time," |
| 340 " last_full_update_check_time," |
| 341 " first_evictable_error_time" |
| 339 " FROM Groups WHERE manifest_url = ?"; | 342 " FROM Groups WHERE manifest_url = ?"; |
| 340 | 343 |
| 341 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 344 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 342 statement.BindString(0, manifest_url.spec()); | 345 statement.BindString(0, manifest_url.spec()); |
| 343 | 346 |
| 344 if (!statement.Step()) | 347 if (!statement.Step()) |
| 345 return false; | 348 return false; |
| 346 | 349 |
| 347 ReadGroupRecord(statement, record); | 350 ReadGroupRecord(statement, record); |
| 348 DCHECK(record->manifest_url == manifest_url); | 351 DCHECK(record->manifest_url == manifest_url); |
| 349 return true; | 352 return true; |
| 350 } | 353 } |
| 351 | 354 |
| 352 bool AppCacheDatabase::FindGroupsForOrigin( | 355 bool AppCacheDatabase::FindGroupsForOrigin( |
| 353 const GURL& origin, std::vector<GroupRecord>* records) { | 356 const GURL& origin, std::vector<GroupRecord>* records) { |
| 354 DCHECK(records && records->empty()); | 357 DCHECK(records && records->empty()); |
| 355 if (!LazyOpen(false)) | 358 if (!LazyOpen(kDontCreate)) |
| 356 return false; | 359 return false; |
| 357 | 360 |
| 358 const char* kSql = | 361 const char kSql[] = |
| 359 "SELECT group_id, origin, manifest_url," | 362 "SELECT group_id, origin, manifest_url," |
| 360 " creation_time, last_access_time" | 363 " creation_time, last_access_time," |
| 364 " last_full_update_check_time," |
| 365 " first_evictable_error_time" |
| 361 " FROM Groups WHERE origin = ?"; | 366 " FROM Groups WHERE origin = ?"; |
| 362 | 367 |
| 363 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 368 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 364 statement.BindString(0, origin.spec()); | 369 statement.BindString(0, origin.spec()); |
| 365 | 370 |
| 366 while (statement.Step()) { | 371 while (statement.Step()) { |
| 367 records->push_back(GroupRecord()); | 372 records->push_back(GroupRecord()); |
| 368 ReadGroupRecord(statement, &records->back()); | 373 ReadGroupRecord(statement, &records->back()); |
| 369 DCHECK(records->back().origin == origin); | 374 DCHECK(records->back().origin == origin); |
| 370 } | 375 } |
| 371 | 376 |
| 372 return statement.Succeeded(); | 377 return statement.Succeeded(); |
| 373 } | 378 } |
| 374 | 379 |
| 375 bool AppCacheDatabase::FindGroupForCache(int64 cache_id, GroupRecord* record) { | 380 bool AppCacheDatabase::FindGroupForCache(int64 cache_id, GroupRecord* record) { |
| 376 DCHECK(record); | 381 DCHECK(record); |
| 377 if (!LazyOpen(false)) | 382 if (!LazyOpen(kDontCreate)) |
| 378 return false; | 383 return false; |
| 379 | 384 |
| 380 const char* kSql = | 385 const char kSql[] = |
| 381 "SELECT g.group_id, g.origin, g.manifest_url," | 386 "SELECT g.group_id, g.origin, g.manifest_url," |
| 382 " g.creation_time, g.last_access_time" | 387 " g.creation_time, g.last_access_time," |
| 388 " g.last_full_update_check_time," |
| 389 " g.first_evictable_error_time" |
| 383 " FROM Groups g, Caches c" | 390 " FROM Groups g, Caches c" |
| 384 " WHERE c.cache_id = ? AND c.group_id = g.group_id"; | 391 " WHERE c.cache_id = ? AND c.group_id = g.group_id"; |
| 385 | 392 |
| 386 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 393 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 387 statement.BindInt64(0, cache_id); | 394 statement.BindInt64(0, cache_id); |
| 388 | 395 |
| 389 if (!statement.Step()) | 396 if (!statement.Step()) |
| 390 return false; | 397 return false; |
| 391 | 398 |
| 392 ReadGroupRecord(statement, record); | 399 ReadGroupRecord(statement, record); |
| 393 return true; | 400 return true; |
| 394 } | 401 } |
| 395 | 402 |
| 403 bool AppCacheDatabase::InsertGroup(const GroupRecord* record) { |
| 404 if (!LazyOpen(kCreateIfNeeded)) |
| 405 return false; |
| 406 |
| 407 const char kSql[] = |
| 408 "INSERT INTO Groups" |
| 409 " (group_id, origin, manifest_url, creation_time, last_access_time," |
| 410 " last_full_update_check_time, first_evictable_error_time)" |
| 411 " VALUES(?, ?, ?, ?, ?, ?, ?)"; |
| 412 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 413 statement.BindInt64(0, record->group_id); |
| 414 statement.BindString(1, record->origin.spec()); |
| 415 statement.BindString(2, record->manifest_url.spec()); |
| 416 statement.BindInt64(3, record->creation_time.ToInternalValue()); |
| 417 statement.BindInt64(4, record->last_access_time.ToInternalValue()); |
| 418 statement.BindInt64(5, record->last_full_update_check_time.ToInternalValue()); |
| 419 statement.BindInt64(6, record->first_evictable_error_time.ToInternalValue()); |
| 420 return statement.Run(); |
| 421 } |
| 422 |
| 423 bool AppCacheDatabase::DeleteGroup(int64 group_id) { |
| 424 if (!LazyOpen(kDontCreate)) |
| 425 return false; |
| 426 |
| 427 const char kSql[] = |
| 428 "DELETE FROM Groups WHERE group_id = ?"; |
| 429 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 430 statement.BindInt64(0, group_id); |
| 431 return statement.Run(); |
| 432 } |
| 433 |
| 396 bool AppCacheDatabase::UpdateLastAccessTime( | 434 bool AppCacheDatabase::UpdateLastAccessTime( |
| 397 int64 group_id, base::Time time) { | 435 int64 group_id, base::Time time) { |
| 398 if (!LazyOpen(true)) | 436 if (!LazyUpdateLastAccessTime(group_id, time)) |
| 399 return false; | 437 return false; |
| 400 | 438 return CommitLazyLastAccessTimes(); |
| 401 const char* kSql = | |
| 402 "UPDATE Groups SET last_access_time = ? WHERE group_id = ?"; | |
| 403 | |
| 404 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | |
| 405 statement.BindInt64(0, time.ToInternalValue()); | |
| 406 statement.BindInt64(1, group_id); | |
| 407 | |
| 408 return statement.Run(); | |
| 409 } | 439 } |
| 410 | 440 |
| 411 bool AppCacheDatabase::LazyUpdateLastAccessTime( | 441 bool AppCacheDatabase::LazyUpdateLastAccessTime( |
| 412 int64 group_id, base::Time time) { | 442 int64 group_id, base::Time time) { |
| 413 if (!LazyOpen(true)) | 443 if (!LazyOpen(kCreateIfNeeded)) |
| 414 return false; | 444 return false; |
| 415 lazy_last_access_times_[group_id] = time; | 445 lazy_last_access_times_[group_id] = time; |
| 416 return true; | 446 return true; |
| 417 } | 447 } |
| 418 | 448 |
| 419 bool AppCacheDatabase::CommitLazyLastAccessTimes() { | 449 bool AppCacheDatabase::CommitLazyLastAccessTimes() { |
| 420 if (lazy_last_access_times_.empty()) | 450 if (lazy_last_access_times_.empty()) |
| 421 return true; | 451 return true; |
| 422 if (!LazyOpen(false)) | 452 if (!LazyOpen(kDontCreate)) |
| 423 return false; | 453 return false; |
| 424 | 454 |
| 425 sql::Transaction transaction(db_.get()); | 455 sql::Transaction transaction(db_.get()); |
| 426 if (!transaction.Begin()) | 456 if (!transaction.Begin()) |
| 427 return false; | 457 return false; |
| 428 for (const auto& pair : lazy_last_access_times_) | 458 for (const auto& pair : lazy_last_access_times_) { |
| 429 UpdateLastAccessTime(pair.first, pair.second); | 459 const char kSql[] = |
| 460 "UPDATE Groups SET last_access_time = ? WHERE group_id = ?"; |
| 461 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 462 statement.BindInt64(0, pair.second.ToInternalValue()); // time |
| 463 statement.BindInt64(1, pair.first); // group_id |
| 464 statement.Run(); |
| 465 } |
| 430 lazy_last_access_times_.clear(); | 466 lazy_last_access_times_.clear(); |
| 431 return transaction.Commit(); | 467 return transaction.Commit(); |
| 432 } | 468 } |
| 433 | 469 |
| 434 bool AppCacheDatabase::InsertGroup(const GroupRecord* record) { | 470 bool AppCacheDatabase::UpdateEvictionTimes( |
| 435 if (!LazyOpen(true)) | 471 int64 group_id, |
| 472 base::Time last_full_update_check_time, |
| 473 base::Time first_evictable_error_time) { |
| 474 if (!LazyOpen(kCreateIfNeeded)) |
| 436 return false; | 475 return false; |
| 437 | 476 |
| 438 const char* kSql = | 477 const char kSql[] = |
| 439 "INSERT INTO Groups" | 478 "UPDATE Groups" |
| 440 " (group_id, origin, manifest_url, creation_time, last_access_time)" | 479 " SET last_full_update_check_time = ?, first_evictable_error_time = ?" |
| 441 " VALUES(?, ?, ?, ?, ?)"; | 480 " WHERE group_id = ?"; |
| 442 | |
| 443 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 481 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 444 statement.BindInt64(0, record->group_id); | 482 statement.BindInt64(0, last_full_update_check_time.ToInternalValue()); |
| 445 statement.BindString(1, record->origin.spec()); | 483 statement.BindInt64(1, first_evictable_error_time.ToInternalValue()); |
| 446 statement.BindString(2, record->manifest_url.spec()); | 484 statement.BindInt64(2, group_id); |
| 447 statement.BindInt64(3, record->creation_time.ToInternalValue()); | 485 return statement.Run(); // Will succeed even if group_id is invalid. |
| 448 statement.BindInt64(4, record->last_access_time.ToInternalValue()); | |
| 449 | |
| 450 return statement.Run(); | |
| 451 } | |
| 452 | |
| 453 bool AppCacheDatabase::DeleteGroup(int64 group_id) { | |
| 454 if (!LazyOpen(false)) | |
| 455 return false; | |
| 456 | |
| 457 const char* kSql = | |
| 458 "DELETE FROM Groups WHERE group_id = ?"; | |
| 459 | |
| 460 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | |
| 461 statement.BindInt64(0, group_id); | |
| 462 | |
| 463 return statement.Run(); | |
| 464 } | 486 } |
| 465 | 487 |
| 466 bool AppCacheDatabase::FindCache(int64 cache_id, CacheRecord* record) { | 488 bool AppCacheDatabase::FindCache(int64 cache_id, CacheRecord* record) { |
| 467 DCHECK(record); | 489 DCHECK(record); |
| 468 if (!LazyOpen(false)) | 490 if (!LazyOpen(kDontCreate)) |
| 469 return false; | 491 return false; |
| 470 | 492 |
| 471 const char* kSql = | 493 const char kSql[] = |
| 472 "SELECT cache_id, group_id, online_wildcard, update_time, cache_size" | 494 "SELECT cache_id, group_id, online_wildcard, update_time, cache_size" |
| 473 " FROM Caches WHERE cache_id = ?"; | 495 " FROM Caches WHERE cache_id = ?"; |
| 474 | 496 |
| 475 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 497 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 476 statement.BindInt64(0, cache_id); | 498 statement.BindInt64(0, cache_id); |
| 477 | 499 |
| 478 if (!statement.Step()) | 500 if (!statement.Step()) |
| 479 return false; | 501 return false; |
| 480 | 502 |
| 481 ReadCacheRecord(statement, record); | 503 ReadCacheRecord(statement, record); |
| 482 return true; | 504 return true; |
| 483 } | 505 } |
| 484 | 506 |
| 485 bool AppCacheDatabase::FindCacheForGroup(int64 group_id, CacheRecord* record) { | 507 bool AppCacheDatabase::FindCacheForGroup(int64 group_id, CacheRecord* record) { |
| 486 DCHECK(record); | 508 DCHECK(record); |
| 487 if (!LazyOpen(false)) | 509 if (!LazyOpen(kDontCreate)) |
| 488 return false; | 510 return false; |
| 489 | 511 |
| 490 const char* kSql = | 512 const char kSql[] = |
| 491 "SELECT cache_id, group_id, online_wildcard, update_time, cache_size" | 513 "SELECT cache_id, group_id, online_wildcard, update_time, cache_size" |
| 492 " FROM Caches WHERE group_id = ?"; | 514 " FROM Caches WHERE group_id = ?"; |
| 493 | 515 |
| 494 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 516 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 495 statement.BindInt64(0, group_id); | 517 statement.BindInt64(0, group_id); |
| 496 | 518 |
| 497 if (!statement.Step()) | 519 if (!statement.Step()) |
| 498 return false; | 520 return false; |
| 499 | 521 |
| 500 ReadCacheRecord(statement, record); | 522 ReadCacheRecord(statement, record); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 512 std::vector<GroupRecord>::const_iterator iter = group_records.begin(); | 534 std::vector<GroupRecord>::const_iterator iter = group_records.begin(); |
| 513 while (iter != group_records.end()) { | 535 while (iter != group_records.end()) { |
| 514 if (FindCacheForGroup(iter->group_id, &cache_record)) | 536 if (FindCacheForGroup(iter->group_id, &cache_record)) |
| 515 records->push_back(cache_record); | 537 records->push_back(cache_record); |
| 516 ++iter; | 538 ++iter; |
| 517 } | 539 } |
| 518 return true; | 540 return true; |
| 519 } | 541 } |
| 520 | 542 |
| 521 bool AppCacheDatabase::InsertCache(const CacheRecord* record) { | 543 bool AppCacheDatabase::InsertCache(const CacheRecord* record) { |
| 522 if (!LazyOpen(true)) | 544 if (!LazyOpen(kCreateIfNeeded)) |
| 523 return false; | 545 return false; |
| 524 | 546 |
| 525 const char* kSql = | 547 const char kSql[] = |
| 526 "INSERT INTO Caches (cache_id, group_id, online_wildcard," | 548 "INSERT INTO Caches (cache_id, group_id, online_wildcard," |
| 527 " update_time, cache_size)" | 549 " update_time, cache_size)" |
| 528 " VALUES(?, ?, ?, ?, ?)"; | 550 " VALUES(?, ?, ?, ?, ?)"; |
| 529 | 551 |
| 530 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 552 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 531 statement.BindInt64(0, record->cache_id); | 553 statement.BindInt64(0, record->cache_id); |
| 532 statement.BindInt64(1, record->group_id); | 554 statement.BindInt64(1, record->group_id); |
| 533 statement.BindBool(2, record->online_wildcard); | 555 statement.BindBool(2, record->online_wildcard); |
| 534 statement.BindInt64(3, record->update_time.ToInternalValue()); | 556 statement.BindInt64(3, record->update_time.ToInternalValue()); |
| 535 statement.BindInt64(4, record->cache_size); | 557 statement.BindInt64(4, record->cache_size); |
| 536 | 558 |
| 537 return statement.Run(); | 559 return statement.Run(); |
| 538 } | 560 } |
| 539 | 561 |
| 540 bool AppCacheDatabase::DeleteCache(int64 cache_id) { | 562 bool AppCacheDatabase::DeleteCache(int64 cache_id) { |
| 541 if (!LazyOpen(false)) | 563 if (!LazyOpen(kDontCreate)) |
| 542 return false; | 564 return false; |
| 543 | 565 |
| 544 const char* kSql = | 566 const char kSql[] = |
| 545 "DELETE FROM Caches WHERE cache_id = ?"; | 567 "DELETE FROM Caches WHERE cache_id = ?"; |
| 546 | 568 |
| 547 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 569 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 548 statement.BindInt64(0, cache_id); | 570 statement.BindInt64(0, cache_id); |
| 549 | 571 |
| 550 return statement.Run(); | 572 return statement.Run(); |
| 551 } | 573 } |
| 552 | 574 |
| 553 bool AppCacheDatabase::FindEntriesForCache( | 575 bool AppCacheDatabase::FindEntriesForCache( |
| 554 int64 cache_id, std::vector<EntryRecord>* records) { | 576 int64 cache_id, std::vector<EntryRecord>* records) { |
| 555 DCHECK(records && records->empty()); | 577 DCHECK(records && records->empty()); |
| 556 if (!LazyOpen(false)) | 578 if (!LazyOpen(kDontCreate)) |
| 557 return false; | 579 return false; |
| 558 | 580 |
| 559 const char* kSql = | 581 const char kSql[] = |
| 560 "SELECT cache_id, url, flags, response_id, response_size FROM Entries" | 582 "SELECT cache_id, url, flags, response_id, response_size FROM Entries" |
| 561 " WHERE cache_id = ?"; | 583 " WHERE cache_id = ?"; |
| 562 | 584 |
| 563 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 585 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 564 statement.BindInt64(0, cache_id); | 586 statement.BindInt64(0, cache_id); |
| 565 | 587 |
| 566 while (statement.Step()) { | 588 while (statement.Step()) { |
| 567 records->push_back(EntryRecord()); | 589 records->push_back(EntryRecord()); |
| 568 ReadEntryRecord(statement, &records->back()); | 590 ReadEntryRecord(statement, &records->back()); |
| 569 DCHECK(records->back().cache_id == cache_id); | 591 DCHECK(records->back().cache_id == cache_id); |
| 570 } | 592 } |
| 571 | 593 |
| 572 return statement.Succeeded(); | 594 return statement.Succeeded(); |
| 573 } | 595 } |
| 574 | 596 |
| 575 bool AppCacheDatabase::FindEntriesForUrl( | 597 bool AppCacheDatabase::FindEntriesForUrl( |
| 576 const GURL& url, std::vector<EntryRecord>* records) { | 598 const GURL& url, std::vector<EntryRecord>* records) { |
| 577 DCHECK(records && records->empty()); | 599 DCHECK(records && records->empty()); |
| 578 if (!LazyOpen(false)) | 600 if (!LazyOpen(kDontCreate)) |
| 579 return false; | 601 return false; |
| 580 | 602 |
| 581 const char* kSql = | 603 const char kSql[] = |
| 582 "SELECT cache_id, url, flags, response_id, response_size FROM Entries" | 604 "SELECT cache_id, url, flags, response_id, response_size FROM Entries" |
| 583 " WHERE url = ?"; | 605 " WHERE url = ?"; |
| 584 | 606 |
| 585 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 607 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 586 statement.BindString(0, url.spec()); | 608 statement.BindString(0, url.spec()); |
| 587 | 609 |
| 588 while (statement.Step()) { | 610 while (statement.Step()) { |
| 589 records->push_back(EntryRecord()); | 611 records->push_back(EntryRecord()); |
| 590 ReadEntryRecord(statement, &records->back()); | 612 ReadEntryRecord(statement, &records->back()); |
| 591 DCHECK(records->back().url == url); | 613 DCHECK(records->back().url == url); |
| 592 } | 614 } |
| 593 | 615 |
| 594 return statement.Succeeded(); | 616 return statement.Succeeded(); |
| 595 } | 617 } |
| 596 | 618 |
| 597 bool AppCacheDatabase::FindEntry( | 619 bool AppCacheDatabase::FindEntry( |
| 598 int64 cache_id, const GURL& url, EntryRecord* record) { | 620 int64 cache_id, const GURL& url, EntryRecord* record) { |
| 599 DCHECK(record); | 621 DCHECK(record); |
| 600 if (!LazyOpen(false)) | 622 if (!LazyOpen(kDontCreate)) |
| 601 return false; | 623 return false; |
| 602 | 624 |
| 603 const char* kSql = | 625 const char kSql[] = |
| 604 "SELECT cache_id, url, flags, response_id, response_size FROM Entries" | 626 "SELECT cache_id, url, flags, response_id, response_size FROM Entries" |
| 605 " WHERE cache_id = ? AND url = ?"; | 627 " WHERE cache_id = ? AND url = ?"; |
| 606 | 628 |
| 607 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 629 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 608 statement.BindInt64(0, cache_id); | 630 statement.BindInt64(0, cache_id); |
| 609 statement.BindString(1, url.spec()); | 631 statement.BindString(1, url.spec()); |
| 610 | 632 |
| 611 if (!statement.Step()) | 633 if (!statement.Step()) |
| 612 return false; | 634 return false; |
| 613 | 635 |
| 614 ReadEntryRecord(statement, record); | 636 ReadEntryRecord(statement, record); |
| 615 DCHECK(record->cache_id == cache_id); | 637 DCHECK(record->cache_id == cache_id); |
| 616 DCHECK(record->url == url); | 638 DCHECK(record->url == url); |
| 617 return true; | 639 return true; |
| 618 } | 640 } |
| 619 | 641 |
| 620 bool AppCacheDatabase::InsertEntry(const EntryRecord* record) { | 642 bool AppCacheDatabase::InsertEntry(const EntryRecord* record) { |
| 621 if (!LazyOpen(true)) | 643 if (!LazyOpen(kCreateIfNeeded)) |
| 622 return false; | 644 return false; |
| 623 | 645 |
| 624 const char* kSql = | 646 const char kSql[] = |
| 625 "INSERT INTO Entries (cache_id, url, flags, response_id, response_size)" | 647 "INSERT INTO Entries (cache_id, url, flags, response_id, response_size)" |
| 626 " VALUES(?, ?, ?, ?, ?)"; | 648 " VALUES(?, ?, ?, ?, ?)"; |
| 627 | 649 |
| 628 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 650 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 629 statement.BindInt64(0, record->cache_id); | 651 statement.BindInt64(0, record->cache_id); |
| 630 statement.BindString(1, record->url.spec()); | 652 statement.BindString(1, record->url.spec()); |
| 631 statement.BindInt(2, record->flags); | 653 statement.BindInt(2, record->flags); |
| 632 statement.BindInt64(3, record->response_id); | 654 statement.BindInt64(3, record->response_id); |
| 633 statement.BindInt64(4, record->response_size); | 655 statement.BindInt64(4, record->response_size); |
| 634 | 656 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 645 std::vector<EntryRecord>::const_iterator iter = records.begin(); | 667 std::vector<EntryRecord>::const_iterator iter = records.begin(); |
| 646 while (iter != records.end()) { | 668 while (iter != records.end()) { |
| 647 if (!InsertEntry(&(*iter))) | 669 if (!InsertEntry(&(*iter))) |
| 648 return false; | 670 return false; |
| 649 ++iter; | 671 ++iter; |
| 650 } | 672 } |
| 651 return transaction.Commit(); | 673 return transaction.Commit(); |
| 652 } | 674 } |
| 653 | 675 |
| 654 bool AppCacheDatabase::DeleteEntriesForCache(int64 cache_id) { | 676 bool AppCacheDatabase::DeleteEntriesForCache(int64 cache_id) { |
| 655 if (!LazyOpen(false)) | 677 if (!LazyOpen(kDontCreate)) |
| 656 return false; | 678 return false; |
| 657 | 679 |
| 658 const char* kSql = | 680 const char kSql[] = |
| 659 "DELETE FROM Entries WHERE cache_id = ?"; | 681 "DELETE FROM Entries WHERE cache_id = ?"; |
| 660 | 682 |
| 661 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 683 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 662 statement.BindInt64(0, cache_id); | 684 statement.BindInt64(0, cache_id); |
| 663 | 685 |
| 664 return statement.Run(); | 686 return statement.Run(); |
| 665 } | 687 } |
| 666 | 688 |
| 667 bool AppCacheDatabase::AddEntryFlags( | 689 bool AppCacheDatabase::AddEntryFlags( |
| 668 const GURL& entry_url, int64 cache_id, int additional_flags) { | 690 const GURL& entry_url, int64 cache_id, int additional_flags) { |
| 669 if (!LazyOpen(false)) | 691 if (!LazyOpen(kDontCreate)) |
| 670 return false; | 692 return false; |
| 671 | 693 |
| 672 const char* kSql = | 694 const char kSql[] = |
| 673 "UPDATE Entries SET flags = flags | ? WHERE cache_id = ? AND url = ?"; | 695 "UPDATE Entries SET flags = flags | ? WHERE cache_id = ? AND url = ?"; |
| 674 | 696 |
| 675 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 697 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 676 statement.BindInt(0, additional_flags); | 698 statement.BindInt(0, additional_flags); |
| 677 statement.BindInt64(1, cache_id); | 699 statement.BindInt64(1, cache_id); |
| 678 statement.BindString(2, entry_url.spec()); | 700 statement.BindString(2, entry_url.spec()); |
| 679 | 701 |
| 680 return statement.Run() && db_->GetLastChangeCount(); | 702 return statement.Run() && db_->GetLastChangeCount(); |
| 681 } | 703 } |
| 682 | 704 |
| 683 bool AppCacheDatabase::FindNamespacesForOrigin( | 705 bool AppCacheDatabase::FindNamespacesForOrigin( |
| 684 const GURL& origin, | 706 const GURL& origin, |
| 685 std::vector<NamespaceRecord>* intercepts, | 707 std::vector<NamespaceRecord>* intercepts, |
| 686 std::vector<NamespaceRecord>* fallbacks) { | 708 std::vector<NamespaceRecord>* fallbacks) { |
| 687 DCHECK(intercepts && intercepts->empty()); | 709 DCHECK(intercepts && intercepts->empty()); |
| 688 DCHECK(fallbacks && fallbacks->empty()); | 710 DCHECK(fallbacks && fallbacks->empty()); |
| 689 if (!LazyOpen(false)) | 711 if (!LazyOpen(kDontCreate)) |
| 690 return false; | 712 return false; |
| 691 | 713 |
| 692 const char* kSql = | 714 const char kSql[] = |
| 693 "SELECT cache_id, origin, type, namespace_url, target_url, is_pattern" | 715 "SELECT cache_id, origin, type, namespace_url, target_url, is_pattern" |
| 694 " FROM Namespaces WHERE origin = ?"; | 716 " FROM Namespaces WHERE origin = ?"; |
| 695 | 717 |
| 696 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 718 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 697 statement.BindString(0, origin.spec()); | 719 statement.BindString(0, origin.spec()); |
| 698 | 720 |
| 699 ReadNamespaceRecords(&statement, intercepts, fallbacks); | 721 ReadNamespaceRecords(&statement, intercepts, fallbacks); |
| 700 | 722 |
| 701 return statement.Succeeded(); | 723 return statement.Succeeded(); |
| 702 } | 724 } |
| 703 | 725 |
| 704 bool AppCacheDatabase::FindNamespacesForCache( | 726 bool AppCacheDatabase::FindNamespacesForCache( |
| 705 int64 cache_id, | 727 int64 cache_id, |
| 706 std::vector<NamespaceRecord>* intercepts, | 728 std::vector<NamespaceRecord>* intercepts, |
| 707 std::vector<NamespaceRecord>* fallbacks) { | 729 std::vector<NamespaceRecord>* fallbacks) { |
| 708 DCHECK(intercepts && intercepts->empty()); | 730 DCHECK(intercepts && intercepts->empty()); |
| 709 DCHECK(fallbacks && fallbacks->empty()); | 731 DCHECK(fallbacks && fallbacks->empty()); |
| 710 if (!LazyOpen(false)) | 732 if (!LazyOpen(kDontCreate)) |
| 711 return false; | 733 return false; |
| 712 | 734 |
| 713 const char* kSql = | 735 const char kSql[] = |
| 714 "SELECT cache_id, origin, type, namespace_url, target_url, is_pattern" | 736 "SELECT cache_id, origin, type, namespace_url, target_url, is_pattern" |
| 715 " FROM Namespaces WHERE cache_id = ?"; | 737 " FROM Namespaces WHERE cache_id = ?"; |
| 716 | 738 |
| 717 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 739 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 718 statement.BindInt64(0, cache_id); | 740 statement.BindInt64(0, cache_id); |
| 719 | 741 |
| 720 ReadNamespaceRecords(&statement, intercepts, fallbacks); | 742 ReadNamespaceRecords(&statement, intercepts, fallbacks); |
| 721 | 743 |
| 722 return statement.Succeeded(); | 744 return statement.Succeeded(); |
| 723 } | 745 } |
| 724 | 746 |
| 725 bool AppCacheDatabase::InsertNamespace( | 747 bool AppCacheDatabase::InsertNamespace( |
| 726 const NamespaceRecord* record) { | 748 const NamespaceRecord* record) { |
| 727 if (!LazyOpen(true)) | 749 if (!LazyOpen(kCreateIfNeeded)) |
| 728 return false; | 750 return false; |
| 729 | 751 |
| 730 const char* kSql = | 752 const char kSql[] = |
| 731 "INSERT INTO Namespaces" | 753 "INSERT INTO Namespaces" |
| 732 " (cache_id, origin, type, namespace_url, target_url, is_pattern)" | 754 " (cache_id, origin, type, namespace_url, target_url, is_pattern)" |
| 733 " VALUES (?, ?, ?, ?, ?, ?)"; | 755 " VALUES (?, ?, ?, ?, ?, ?)"; |
| 734 | 756 |
| 735 // Note: quick and dirty storage for the 'executable' bit w/o changing | 757 // Note: quick and dirty storage for the 'executable' bit w/o changing |
| 736 // schemas, we use the high bit of 'type' field. | 758 // schemas, we use the high bit of 'type' field. |
| 737 int type_with_executable_bit = record->namespace_.type; | 759 int type_with_executable_bit = record->namespace_.type; |
| 738 if (record->namespace_.is_executable) { | 760 if (record->namespace_.is_executable) { |
| 739 type_with_executable_bit |= 0x8000000; | 761 type_with_executable_bit |= 0x8000000; |
| 740 DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 762 DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 761 std::vector<NamespaceRecord>::const_iterator iter = records.begin(); | 783 std::vector<NamespaceRecord>::const_iterator iter = records.begin(); |
| 762 while (iter != records.end()) { | 784 while (iter != records.end()) { |
| 763 if (!InsertNamespace(&(*iter))) | 785 if (!InsertNamespace(&(*iter))) |
| 764 return false; | 786 return false; |
| 765 ++iter; | 787 ++iter; |
| 766 } | 788 } |
| 767 return transaction.Commit(); | 789 return transaction.Commit(); |
| 768 } | 790 } |
| 769 | 791 |
| 770 bool AppCacheDatabase::DeleteNamespacesForCache(int64 cache_id) { | 792 bool AppCacheDatabase::DeleteNamespacesForCache(int64 cache_id) { |
| 771 if (!LazyOpen(false)) | 793 if (!LazyOpen(kDontCreate)) |
| 772 return false; | 794 return false; |
| 773 | 795 |
| 774 const char* kSql = | 796 const char kSql[] = |
| 775 "DELETE FROM Namespaces WHERE cache_id = ?"; | 797 "DELETE FROM Namespaces WHERE cache_id = ?"; |
| 776 | 798 |
| 777 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 799 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 778 statement.BindInt64(0, cache_id); | 800 statement.BindInt64(0, cache_id); |
| 779 | 801 |
| 780 return statement.Run(); | 802 return statement.Run(); |
| 781 } | 803 } |
| 782 | 804 |
| 783 bool AppCacheDatabase::FindOnlineWhiteListForCache( | 805 bool AppCacheDatabase::FindOnlineWhiteListForCache( |
| 784 int64 cache_id, std::vector<OnlineWhiteListRecord>* records) { | 806 int64 cache_id, std::vector<OnlineWhiteListRecord>* records) { |
| 785 DCHECK(records && records->empty()); | 807 DCHECK(records && records->empty()); |
| 786 if (!LazyOpen(false)) | 808 if (!LazyOpen(kDontCreate)) |
| 787 return false; | 809 return false; |
| 788 | 810 |
| 789 const char* kSql = | 811 const char kSql[] = |
| 790 "SELECT cache_id, namespace_url, is_pattern FROM OnlineWhiteLists" | 812 "SELECT cache_id, namespace_url, is_pattern FROM OnlineWhiteLists" |
| 791 " WHERE cache_id = ?"; | 813 " WHERE cache_id = ?"; |
| 792 | 814 |
| 793 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 815 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 794 statement.BindInt64(0, cache_id); | 816 statement.BindInt64(0, cache_id); |
| 795 | 817 |
| 796 while (statement.Step()) { | 818 while (statement.Step()) { |
| 797 records->push_back(OnlineWhiteListRecord()); | 819 records->push_back(OnlineWhiteListRecord()); |
| 798 this->ReadOnlineWhiteListRecord(statement, &records->back()); | 820 this->ReadOnlineWhiteListRecord(statement, &records->back()); |
| 799 DCHECK(records->back().cache_id == cache_id); | 821 DCHECK(records->back().cache_id == cache_id); |
| 800 } | 822 } |
| 801 return statement.Succeeded(); | 823 return statement.Succeeded(); |
| 802 } | 824 } |
| 803 | 825 |
| 804 bool AppCacheDatabase::InsertOnlineWhiteList( | 826 bool AppCacheDatabase::InsertOnlineWhiteList( |
| 805 const OnlineWhiteListRecord* record) { | 827 const OnlineWhiteListRecord* record) { |
| 806 if (!LazyOpen(true)) | 828 if (!LazyOpen(kCreateIfNeeded)) |
| 807 return false; | 829 return false; |
| 808 | 830 |
| 809 const char* kSql = | 831 const char kSql[] = |
| 810 "INSERT INTO OnlineWhiteLists (cache_id, namespace_url, is_pattern)" | 832 "INSERT INTO OnlineWhiteLists (cache_id, namespace_url, is_pattern)" |
| 811 " VALUES (?, ?, ?)"; | 833 " VALUES (?, ?, ?)"; |
| 812 | 834 |
| 813 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 835 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 814 statement.BindInt64(0, record->cache_id); | 836 statement.BindInt64(0, record->cache_id); |
| 815 statement.BindString(1, record->namespace_url.spec()); | 837 statement.BindString(1, record->namespace_url.spec()); |
| 816 statement.BindBool(2, record->is_pattern); | 838 statement.BindBool(2, record->is_pattern); |
| 817 | 839 |
| 818 return statement.Run(); | 840 return statement.Run(); |
| 819 } | 841 } |
| 820 | 842 |
| 821 bool AppCacheDatabase::InsertOnlineWhiteListRecords( | 843 bool AppCacheDatabase::InsertOnlineWhiteListRecords( |
| 822 const std::vector<OnlineWhiteListRecord>& records) { | 844 const std::vector<OnlineWhiteListRecord>& records) { |
| 823 if (records.empty()) | 845 if (records.empty()) |
| 824 return true; | 846 return true; |
| 825 sql::Transaction transaction(db_.get()); | 847 sql::Transaction transaction(db_.get()); |
| 826 if (!transaction.Begin()) | 848 if (!transaction.Begin()) |
| 827 return false; | 849 return false; |
| 828 std::vector<OnlineWhiteListRecord>::const_iterator iter = records.begin(); | 850 std::vector<OnlineWhiteListRecord>::const_iterator iter = records.begin(); |
| 829 while (iter != records.end()) { | 851 while (iter != records.end()) { |
| 830 if (!InsertOnlineWhiteList(&(*iter))) | 852 if (!InsertOnlineWhiteList(&(*iter))) |
| 831 return false; | 853 return false; |
| 832 ++iter; | 854 ++iter; |
| 833 } | 855 } |
| 834 return transaction.Commit(); | 856 return transaction.Commit(); |
| 835 } | 857 } |
| 836 | 858 |
| 837 bool AppCacheDatabase::DeleteOnlineWhiteListForCache(int64 cache_id) { | 859 bool AppCacheDatabase::DeleteOnlineWhiteListForCache(int64 cache_id) { |
| 838 if (!LazyOpen(false)) | 860 if (!LazyOpen(kDontCreate)) |
| 839 return false; | 861 return false; |
| 840 | 862 |
| 841 const char* kSql = | 863 const char kSql[] = |
| 842 "DELETE FROM OnlineWhiteLists WHERE cache_id = ?"; | 864 "DELETE FROM OnlineWhiteLists WHERE cache_id = ?"; |
| 843 | 865 |
| 844 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 866 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 845 statement.BindInt64(0, cache_id); | 867 statement.BindInt64(0, cache_id); |
| 846 | 868 |
| 847 return statement.Run(); | 869 return statement.Run(); |
| 848 } | 870 } |
| 849 | 871 |
| 850 bool AppCacheDatabase::GetDeletableResponseIds( | 872 bool AppCacheDatabase::GetDeletableResponseIds( |
| 851 std::vector<int64>* response_ids, int64 max_rowid, int limit) { | 873 std::vector<int64>* response_ids, int64 max_rowid, int limit) { |
| 852 if (!LazyOpen(false)) | 874 if (!LazyOpen(kDontCreate)) |
| 853 return false; | 875 return false; |
| 854 | 876 |
| 855 const char* kSql = | 877 const char kSql[] = |
| 856 "SELECT response_id FROM DeletableResponseIds " | 878 "SELECT response_id FROM DeletableResponseIds " |
| 857 " WHERE rowid <= ?" | 879 " WHERE rowid <= ?" |
| 858 " LIMIT ?"; | 880 " LIMIT ?"; |
| 859 | 881 |
| 860 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 882 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 861 statement.BindInt64(0, max_rowid); | 883 statement.BindInt64(0, max_rowid); |
| 862 statement.BindInt64(1, limit); | 884 statement.BindInt64(1, limit); |
| 863 | 885 |
| 864 while (statement.Step()) | 886 while (statement.Step()) |
| 865 response_ids->push_back(statement.ColumnInt64(0)); | 887 response_ids->push_back(statement.ColumnInt64(0)); |
| 866 return statement.Succeeded(); | 888 return statement.Succeeded(); |
| 867 } | 889 } |
| 868 | 890 |
| 869 bool AppCacheDatabase::InsertDeletableResponseIds( | 891 bool AppCacheDatabase::InsertDeletableResponseIds( |
| 870 const std::vector<int64>& response_ids) { | 892 const std::vector<int64>& response_ids) { |
| 871 const char* kSql = | 893 const char kSql[] = |
| 872 "INSERT INTO DeletableResponseIds (response_id) VALUES (?)"; | 894 "INSERT INTO DeletableResponseIds (response_id) VALUES (?)"; |
| 873 return RunCachedStatementWithIds(SQL_FROM_HERE, kSql, response_ids); | 895 return RunCachedStatementWithIds(SQL_FROM_HERE, kSql, response_ids); |
| 874 } | 896 } |
| 875 | 897 |
| 876 bool AppCacheDatabase::DeleteDeletableResponseIds( | 898 bool AppCacheDatabase::DeleteDeletableResponseIds( |
| 877 const std::vector<int64>& response_ids) { | 899 const std::vector<int64>& response_ids) { |
| 878 const char* kSql = | 900 const char kSql[] = |
| 879 "DELETE FROM DeletableResponseIds WHERE response_id = ?"; | 901 "DELETE FROM DeletableResponseIds WHERE response_id = ?"; |
| 880 return RunCachedStatementWithIds(SQL_FROM_HERE, kSql, response_ids); | 902 return RunCachedStatementWithIds(SQL_FROM_HERE, kSql, response_ids); |
| 881 } | 903 } |
| 882 | 904 |
| 883 bool AppCacheDatabase::RunCachedStatementWithIds( | 905 bool AppCacheDatabase::RunCachedStatementWithIds( |
| 884 const sql::StatementID& statement_id, const char* sql, | 906 const sql::StatementID& statement_id, const char* sql, |
| 885 const std::vector<int64>& ids) { | 907 const std::vector<int64>& ids) { |
| 886 DCHECK(sql); | 908 DCHECK(sql); |
| 887 if (!LazyOpen(true)) | 909 if (!LazyOpen(kCreateIfNeeded)) |
| 888 return false; | 910 return false; |
| 889 | 911 |
| 890 sql::Transaction transaction(db_.get()); | 912 sql::Transaction transaction(db_.get()); |
| 891 if (!transaction.Begin()) | 913 if (!transaction.Begin()) |
| 892 return false; | 914 return false; |
| 893 | 915 |
| 894 sql::Statement statement(db_->GetCachedStatement(statement_id, sql)); | 916 sql::Statement statement(db_->GetCachedStatement(statement_id, sql)); |
| 895 | 917 |
| 896 std::vector<int64>::const_iterator iter = ids.begin(); | 918 std::vector<int64>::const_iterator iter = ids.begin(); |
| 897 while (iter != ids.end()) { | 919 while (iter != ids.end()) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 914 } | 936 } |
| 915 *result = statement.ColumnInt64(0); | 937 *result = statement.ColumnInt64(0); |
| 916 return true; | 938 return true; |
| 917 } | 939 } |
| 918 | 940 |
| 919 bool AppCacheDatabase::FindResponseIdsForCacheHelper( | 941 bool AppCacheDatabase::FindResponseIdsForCacheHelper( |
| 920 int64 cache_id, std::vector<int64>* ids_vector, | 942 int64 cache_id, std::vector<int64>* ids_vector, |
| 921 std::set<int64>* ids_set) { | 943 std::set<int64>* ids_set) { |
| 922 DCHECK(ids_vector || ids_set); | 944 DCHECK(ids_vector || ids_set); |
| 923 DCHECK(!(ids_vector && ids_set)); | 945 DCHECK(!(ids_vector && ids_set)); |
| 924 if (!LazyOpen(false)) | 946 if (!LazyOpen(kDontCreate)) |
| 925 return false; | 947 return false; |
| 926 | 948 |
| 927 const char* kSql = | 949 const char kSql[] = |
| 928 "SELECT response_id FROM Entries WHERE cache_id = ?"; | 950 "SELECT response_id FROM Entries WHERE cache_id = ?"; |
| 929 | 951 |
| 930 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 952 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 931 | 953 |
| 932 statement.BindInt64(0, cache_id); | 954 statement.BindInt64(0, cache_id); |
| 933 while (statement.Step()) { | 955 while (statement.Step()) { |
| 934 int64 id = statement.ColumnInt64(0); | 956 int64 id = statement.ColumnInt64(0); |
| 935 if (ids_set) | 957 if (ids_set) |
| 936 ids_set->insert(id); | 958 ids_set->insert(id); |
| 937 else | 959 else |
| (...skipping 11 matching lines...) Expand all Loading... |
| 949 record->creation_time = | 971 record->creation_time = |
| 950 base::Time::FromInternalValue(statement.ColumnInt64(3)); | 972 base::Time::FromInternalValue(statement.ColumnInt64(3)); |
| 951 | 973 |
| 952 const auto found = lazy_last_access_times_.find(record->group_id); | 974 const auto found = lazy_last_access_times_.find(record->group_id); |
| 953 if (found != lazy_last_access_times_.end()) { | 975 if (found != lazy_last_access_times_.end()) { |
| 954 record->last_access_time = found->second; | 976 record->last_access_time = found->second; |
| 955 } else { | 977 } else { |
| 956 record->last_access_time = | 978 record->last_access_time = |
| 957 base::Time::FromInternalValue(statement.ColumnInt64(4)); | 979 base::Time::FromInternalValue(statement.ColumnInt64(4)); |
| 958 } | 980 } |
| 981 |
| 982 record->last_full_update_check_time = |
| 983 base::Time::FromInternalValue(statement.ColumnInt64(5)); |
| 984 record->first_evictable_error_time = |
| 985 base::Time::FromInternalValue(statement.ColumnInt64(6)); |
| 959 } | 986 } |
| 960 | 987 |
| 961 void AppCacheDatabase::ReadCacheRecord( | 988 void AppCacheDatabase::ReadCacheRecord( |
| 962 const sql::Statement& statement, CacheRecord* record) { | 989 const sql::Statement& statement, CacheRecord* record) { |
| 963 record->cache_id = statement.ColumnInt64(0); | 990 record->cache_id = statement.ColumnInt64(0); |
| 964 record->group_id = statement.ColumnInt64(1); | 991 record->group_id = statement.ColumnInt64(1); |
| 965 record->online_wildcard = statement.ColumnBool(2); | 992 record->online_wildcard = statement.ColumnBool(2); |
| 966 record->update_time = | 993 record->update_time = |
| 967 base::Time::FromInternalValue(statement.ColumnInt64(3)); | 994 base::Time::FromInternalValue(statement.ColumnInt64(3)); |
| 968 record->cache_size = statement.ColumnInt64(4); | 995 record->cache_size = statement.ColumnInt64(4); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 for (int i = 0; i < kIndexCount; ++i) { | 1154 for (int i = 0; i < kIndexCount; ++i) { |
| 1128 if (!CreateIndex(db_.get(), kIndexes[i])) | 1155 if (!CreateIndex(db_.get(), kIndexes[i])) |
| 1129 return false; | 1156 return false; |
| 1130 } | 1157 } |
| 1131 | 1158 |
| 1132 return transaction.Commit(); | 1159 return transaction.Commit(); |
| 1133 } | 1160 } |
| 1134 | 1161 |
| 1135 bool AppCacheDatabase::UpgradeSchema() { | 1162 bool AppCacheDatabase::UpgradeSchema() { |
| 1136 #if defined(APPCACHE_USE_SIMPLE_CACHE) | 1163 #if defined(APPCACHE_USE_SIMPLE_CACHE) |
| 1137 return DeleteExistingAndCreateNewDatabase(); | 1164 if (meta_table_->GetVersionNumber() < 6) |
| 1138 #else | 1165 return DeleteExistingAndCreateNewDatabase(); |
| 1166 #endif |
| 1139 if (meta_table_->GetVersionNumber() == 3) { | 1167 if (meta_table_->GetVersionNumber() == 3) { |
| 1140 // version 3 was pre 12/17/2011 | 1168 // version 3 was pre 12/17/2011 |
| 1141 DCHECK_EQ(strcmp(kNamespacesTable, kTables[3].table_name), 0); | 1169 DCHECK_EQ(strcmp(kNamespacesTable, kTables[3].table_name), 0); |
| 1142 DCHECK_EQ(strcmp(kNamespacesTable, kIndexes[6].table_name), 0); | 1170 DCHECK_EQ(strcmp(kNamespacesTable, kIndexes[6].table_name), 0); |
| 1143 DCHECK_EQ(strcmp(kNamespacesTable, kIndexes[7].table_name), 0); | 1171 DCHECK_EQ(strcmp(kNamespacesTable, kIndexes[7].table_name), 0); |
| 1144 DCHECK_EQ(strcmp(kNamespacesTable, kIndexes[8].table_name), 0); | 1172 DCHECK_EQ(strcmp(kNamespacesTable, kIndexes[8].table_name), 0); |
| 1145 | 1173 |
| 1146 const TableInfo kNamespaceTable_v4 = { | 1174 const TableInfo kNamespaceTable_v4 = { |
| 1147 kNamespacesTable, | 1175 kNamespacesTable, |
| 1148 "(cache_id INTEGER," | 1176 "(cache_id INTEGER," |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 " is_pattern INTEGER CHECK(is_pattern IN (0, 1))")) { | 1228 " is_pattern INTEGER CHECK(is_pattern IN (0, 1))")) { |
| 1201 return false; | 1229 return false; |
| 1202 } | 1230 } |
| 1203 if (!db_->Execute( | 1231 if (!db_->Execute( |
| 1204 "ALTER TABLE OnlineWhitelists ADD COLUMN" | 1232 "ALTER TABLE OnlineWhitelists ADD COLUMN" |
| 1205 " is_pattern INTEGER CHECK(is_pattern IN (0, 1))")) { | 1233 " is_pattern INTEGER CHECK(is_pattern IN (0, 1))")) { |
| 1206 return false; | 1234 return false; |
| 1207 } | 1235 } |
| 1208 meta_table_->SetVersionNumber(5); | 1236 meta_table_->SetVersionNumber(5); |
| 1209 meta_table_->SetCompatibleVersionNumber(5); | 1237 meta_table_->SetCompatibleVersionNumber(5); |
| 1238 if (!transaction.Commit()) |
| 1239 return false; |
| 1240 } |
| 1241 |
| 1242 #if defined(APPCACHE_USE_SIMPLE_CACHE) |
| 1243 // The schema version number was increased to 6 when we switched to the |
| 1244 // SimpleCache for Android, but the SQL part of the schema is identical |
| 1245 // to v5 on desktop chrome. |
| 1246 if (meta_table_->GetVersionNumber() == 6) { |
| 1247 #else |
| 1248 if (meta_table_->GetVersionNumber() == 5) { |
| 1249 #endif |
| 1250 // Versions 5 and 6 were pre-July 2015. |
| 1251 // Version 7 adds support for expiring caches that are failing to update. |
| 1252 sql::Transaction transaction(db_.get()); |
| 1253 if (!transaction.Begin() || |
| 1254 !db_->Execute( |
| 1255 "ALTER TABLE Groups ADD COLUMN" |
| 1256 " last_full_update_check_time INTEGER") || |
| 1257 !db_->Execute( |
| 1258 "ALTER TABLE Groups ADD COLUMN" |
| 1259 " first_evictable_error_time INTEGER") || |
| 1260 !db_->Execute( |
| 1261 "UPDATE Groups" |
| 1262 " SET last_full_update_check_time =" |
| 1263 " (SELECT update_time FROM Caches" |
| 1264 " WHERE Caches.group_id = Groups.group_id)")) { |
| 1265 return false; |
| 1266 } |
| 1267 meta_table_->SetVersionNumber(7); |
| 1268 meta_table_->SetCompatibleVersionNumber(7); |
| 1210 return transaction.Commit(); | 1269 return transaction.Commit(); |
| 1211 } | 1270 } |
| 1212 | 1271 |
| 1213 // If there is no upgrade path for the version on disk to the current | 1272 // If there is no upgrade path for the version on disk to the current |
| 1214 // version, nuke everything and start over. | 1273 // version, nuke everything and start over. |
| 1215 return DeleteExistingAndCreateNewDatabase(); | 1274 return DeleteExistingAndCreateNewDatabase(); |
| 1216 #endif | |
| 1217 } | 1275 } |
| 1218 | 1276 |
| 1219 void AppCacheDatabase::ResetConnectionAndTables() { | 1277 void AppCacheDatabase::ResetConnectionAndTables() { |
| 1220 meta_table_.reset(); | 1278 meta_table_.reset(); |
| 1221 db_.reset(); | 1279 db_.reset(); |
| 1222 } | 1280 } |
| 1223 | 1281 |
| 1224 bool AppCacheDatabase::DeleteExistingAndCreateNewDatabase() { | 1282 bool AppCacheDatabase::DeleteExistingAndCreateNewDatabase() { |
| 1225 DCHECK(!db_file_path_.empty()); | 1283 DCHECK(!db_file_path_.empty()); |
| 1226 DCHECK(base::PathExists(db_file_path_)); | 1284 DCHECK(base::PathExists(db_file_path_)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1238 return false; | 1296 return false; |
| 1239 | 1297 |
| 1240 if (!base::CreateDirectory(directory)) | 1298 if (!base::CreateDirectory(directory)) |
| 1241 return false; | 1299 return false; |
| 1242 | 1300 |
| 1243 // So we can't go recursive. | 1301 // So we can't go recursive. |
| 1244 if (is_recreating_) | 1302 if (is_recreating_) |
| 1245 return false; | 1303 return false; |
| 1246 | 1304 |
| 1247 base::AutoReset<bool> auto_reset(&is_recreating_, true); | 1305 base::AutoReset<bool> auto_reset(&is_recreating_, true); |
| 1248 return LazyOpen(true); | 1306 return LazyOpen(kCreateIfNeeded); |
| 1249 } | 1307 } |
| 1250 | 1308 |
| 1251 void AppCacheDatabase::OnDatabaseError(int err, sql::Statement* stmt) { | 1309 void AppCacheDatabase::OnDatabaseError(int err, sql::Statement* stmt) { |
| 1252 was_corruption_detected_ |= sql::IsErrorCatastrophic(err); | 1310 was_corruption_detected_ |= sql::IsErrorCatastrophic(err); |
| 1253 if (!db_->ShouldIgnoreSqliteError(err)) | 1311 if (!db_->ShouldIgnoreSqliteError(err)) |
| 1254 DLOG(ERROR) << db_->GetErrorMessage(); | 1312 DLOG(ERROR) << db_->GetErrorMessage(); |
| 1255 // TODO: Maybe use non-catostrophic errors to trigger a full integrity check? | 1313 // TODO: Maybe use non-catostrophic errors to trigger a full integrity check? |
| 1256 } | 1314 } |
| 1257 | 1315 |
| 1258 } // namespace content | 1316 } // namespace content |
| OLD | NEW |