OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/indexed_db/indexed_db_factory_impl.h" | 5 #include "content/browser/indexed_db/indexed_db_factory_impl.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 // All backing stores associated with this factory should be of the same | 390 // All backing stores associated with this factory should be of the same |
391 // type. | 391 // type. |
392 DCHECK_NE(session_only_backing_stores_.empty(), open_in_memory); | 392 DCHECK_NE(session_only_backing_stores_.empty(), open_in_memory); |
393 | 393 |
394 return backing_store; | 394 return backing_store; |
395 } | 395 } |
396 | 396 |
397 return 0; | 397 return 0; |
398 } | 398 } |
399 | 399 |
400 void IndexedDBFactoryImpl::Open(const base::string16& name, | 400 void IndexedDBFactoryImpl::Open( |
401 const IndexedDBPendingConnection& connection, | 401 const base::string16& name, |
402 net::URLRequestContext* request_context, | 402 std::unique_ptr<IndexedDBPendingConnection> connection, |
403 const Origin& origin, | 403 net::URLRequestContext* request_context, |
404 const base::FilePath& data_directory) { | 404 const Origin& origin, |
| 405 const base::FilePath& data_directory) { |
405 IDB_TRACE("IndexedDBFactoryImpl::Open"); | 406 IDB_TRACE("IndexedDBFactoryImpl::Open"); |
406 scoped_refptr<IndexedDBDatabase> database; | 407 scoped_refptr<IndexedDBDatabase> database; |
407 IndexedDBDatabase::Identifier unique_identifier(origin, name); | 408 IndexedDBDatabase::Identifier unique_identifier(origin, name); |
408 const auto& it = database_map_.find(unique_identifier); | 409 const auto& it = database_map_.find(unique_identifier); |
409 IndexedDBDataLossInfo data_loss_info; | 410 IndexedDBDataLossInfo data_loss_info; |
410 bool disk_full = false; | 411 bool disk_full = false; |
411 bool was_open = (it != database_map_.end()); | 412 bool was_open = (it != database_map_.end()); |
412 if (!was_open) { | 413 if (!was_open) { |
413 leveldb::Status s; | 414 leveldb::Status s; |
414 scoped_refptr<IndexedDBBackingStore> backing_store = | 415 scoped_refptr<IndexedDBBackingStore> backing_store = |
415 OpenBackingStore(origin, data_directory, request_context, | 416 OpenBackingStore(origin, data_directory, request_context, |
416 &data_loss_info, &disk_full, &s); | 417 &data_loss_info, &disk_full, &s); |
417 if (!backing_store.get()) { | 418 if (!backing_store.get()) { |
418 if (disk_full) { | 419 if (disk_full) { |
419 connection.callbacks->OnError( | 420 connection->callbacks->OnError(IndexedDBDatabaseError( |
420 IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionQuotaError, | 421 blink::WebIDBDatabaseExceptionQuotaError, |
421 ASCIIToUTF16( | 422 ASCIIToUTF16("Encountered full disk while opening " |
422 "Encountered full disk while opening " | 423 "backing store for indexedDB.open."))); |
423 "backing store for indexedDB.open."))); | |
424 return; | 424 return; |
425 } | 425 } |
426 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, | 426 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, |
427 ASCIIToUTF16( | 427 ASCIIToUTF16( |
428 "Internal error opening backing store" | 428 "Internal error opening backing store" |
429 " for indexedDB.open.")); | 429 " for indexedDB.open.")); |
430 connection.callbacks->OnError(error); | 430 connection->callbacks->OnError(error); |
431 if (s.IsCorruption()) { | 431 if (s.IsCorruption()) { |
432 HandleBackingStoreCorruption(origin, error); | 432 HandleBackingStoreCorruption(origin, error); |
433 } | 433 } |
434 return; | 434 return; |
435 } | 435 } |
436 | 436 |
437 database = IndexedDBDatabase::Create( | 437 database = IndexedDBDatabase::Create( |
438 name, backing_store.get(), this, unique_identifier, &s); | 438 name, backing_store.get(), this, unique_identifier, &s); |
439 if (!database.get()) { | 439 if (!database.get()) { |
440 DLOG(ERROR) << "Unable to create the database"; | 440 DLOG(ERROR) << "Unable to create the database"; |
441 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, | 441 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, |
442 ASCIIToUTF16( | 442 ASCIIToUTF16( |
443 "Internal error creating " | 443 "Internal error creating " |
444 "database backend for " | 444 "database backend for " |
445 "indexedDB.open.")); | 445 "indexedDB.open.")); |
446 connection.callbacks->OnError(error); | 446 connection->callbacks->OnError(error); |
447 if (s.IsCorruption()) { | 447 if (s.IsCorruption()) { |
448 backing_store = NULL; // Closes the LevelDB so that it can be deleted | 448 backing_store = NULL; // Closes the LevelDB so that it can be deleted |
449 HandleBackingStoreCorruption(origin, error); | 449 HandleBackingStoreCorruption(origin, error); |
450 } | 450 } |
451 return; | 451 return; |
452 } | 452 } |
453 } else { | 453 } else { |
454 database = it->second; | 454 database = it->second; |
455 } | 455 } |
456 | 456 |
457 if (data_loss_info.status != blink::WebIDBDataLossNone) | 457 connection->data_loss_info = data_loss_info; |
458 connection.callbacks->OnDataLoss(data_loss_info); | |
459 | 458 |
460 database->OpenConnection(connection); | 459 database->OpenConnection(std::move(connection)); |
461 | 460 |
462 if (!was_open && database->ConnectionCount() > 0) { | 461 if (!was_open && database->ConnectionCount() > 0) { |
463 database_map_[unique_identifier] = database.get(); | 462 database_map_[unique_identifier] = database.get(); |
464 origin_dbs_.insert(std::make_pair(origin, database.get())); | 463 origin_dbs_.insert(std::make_pair(origin, database.get())); |
465 } | 464 } |
466 } | 465 } |
467 | 466 |
468 std::pair<IndexedDBFactoryImpl::OriginDBMapIterator, | 467 std::pair<IndexedDBFactoryImpl::OriginDBMapIterator, |
469 IndexedDBFactoryImpl::OriginDBMapIterator> | 468 IndexedDBFactoryImpl::OriginDBMapIterator> |
470 IndexedDBFactoryImpl::GetOpenDatabasesForOrigin(const Origin& origin) const { | 469 IndexedDBFactoryImpl::GetOpenDatabasesForOrigin(const Origin& origin) const { |
471 return origin_dbs_.equal_range(origin); | 470 return origin_dbs_.equal_range(origin); |
472 } | 471 } |
473 | 472 |
474 size_t IndexedDBFactoryImpl::GetConnectionCount(const Origin& origin) const { | 473 size_t IndexedDBFactoryImpl::GetConnectionCount(const Origin& origin) const { |
475 size_t count(0); | 474 size_t count(0); |
476 | 475 |
477 OriginDBs range = GetOpenDatabasesForOrigin(origin); | 476 OriginDBs range = GetOpenDatabasesForOrigin(origin); |
478 for (OriginDBMapIterator it = range.first; it != range.second; ++it) | 477 for (OriginDBMapIterator it = range.first; it != range.second; ++it) |
479 count += it->second->ConnectionCount(); | 478 count += it->second->ConnectionCount(); |
480 | 479 |
481 return count; | 480 return count; |
482 } | 481 } |
483 | 482 |
484 } // namespace content | 483 } // namespace content |
OLD | NEW |