| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 bool ok = getInt(db, maxObjectStoreIdKey, maxObjectStoreId, found); | 316 bool ok = getInt(db, maxObjectStoreIdKey, maxObjectStoreId, found); |
| 317 if (!ok) | 317 if (!ok) |
| 318 return false; | 318 return false; |
| 319 if (!found) | 319 if (!found) |
| 320 maxObjectStoreId = 0; | 320 maxObjectStoreId = 0; |
| 321 | 321 |
| 322 ASSERT(maxObjectStoreId >= 0); | 322 ASSERT(maxObjectStoreId >= 0); |
| 323 return true; | 323 return true; |
| 324 } | 324 } |
| 325 | 325 |
| 326 class DefaultLevelDBFactory : public LevelDBFactory { |
| 327 public: |
| 328 virtual PassOwnPtr<LevelDBDatabase> openLevelDB(const String& fileName, cons
t LevelDBComparator* comparator) |
| 329 { |
| 330 return LevelDBDatabase::open(fileName, comparator); |
| 331 } |
| 332 virtual bool destroyLevelDB(const String& fileName) |
| 333 { |
| 334 return LevelDBDatabase::destroy(fileName); |
| 335 } |
| 336 }; |
| 337 |
| 326 IDBBackingStore::IDBBackingStore(const String& identifier, IDBFactoryBackendImpl
* factory, PassOwnPtr<LevelDBDatabase> db) | 338 IDBBackingStore::IDBBackingStore(const String& identifier, IDBFactoryBackendImpl
* factory, PassOwnPtr<LevelDBDatabase> db) |
| 327 : m_identifier(identifier) | 339 : m_identifier(identifier) |
| 328 , m_factory(factory) | 340 , m_factory(factory) |
| 329 , m_db(db) | 341 , m_db(db) |
| 330 { | 342 { |
| 331 m_factory->addIDBBackingStore(identifier, this); | 343 m_factory->addIDBBackingStore(identifier, this); |
| 332 } | 344 } |
| 333 | 345 |
| 334 IDBBackingStore::IDBBackingStore() | 346 IDBBackingStore::IDBBackingStore() |
| 335 { | 347 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 353 IDBLevelDBBackingStoreOpenFailedUnknownSchema, | 365 IDBLevelDBBackingStoreOpenFailedUnknownSchema, |
| 354 IDBLevelDBBackingStoreOpenCleanupDestroyFailed, | 366 IDBLevelDBBackingStoreOpenCleanupDestroyFailed, |
| 355 IDBLevelDBBackingStoreOpenCleanupReopenFailed, | 367 IDBLevelDBBackingStoreOpenCleanupReopenFailed, |
| 356 IDBLevelDBBackingStoreOpenCleanupReopenSuccess, | 368 IDBLevelDBBackingStoreOpenCleanupReopenSuccess, |
| 357 IDBLevelDBBackingStoreOpenFailedIOErrCheckingSchema, | 369 IDBLevelDBBackingStoreOpenFailedIOErrCheckingSchema, |
| 358 IDBLevelDBBackingStoreOpenMax, | 370 IDBLevelDBBackingStoreOpenMax, |
| 359 }; | 371 }; |
| 360 | 372 |
| 361 PassRefPtr<IDBBackingStore> IDBBackingStore::open(SecurityOrigin* securityOrigin
, const String& pathBaseArg, const String& fileIdentifier, IDBFactoryBackendImpl
* factory) | 373 PassRefPtr<IDBBackingStore> IDBBackingStore::open(SecurityOrigin* securityOrigin
, const String& pathBaseArg, const String& fileIdentifier, IDBFactoryBackendImpl
* factory) |
| 362 { | 374 { |
| 375 DefaultLevelDBFactory levelDBFactory; |
| 376 return IDBBackingStore::open(securityOrigin, pathBaseArg, fileIdentifier, fa
ctory, &levelDBFactory); |
| 377 } |
| 378 |
| 379 PassRefPtr<IDBBackingStore> IDBBackingStore::open(SecurityOrigin* securityOrigin
, const String& pathBaseArg, const String& fileIdentifier, IDBFactoryBackendImpl
* factory, LevelDBFactory* levelDBFactory) |
| 380 { |
| 363 IDB_TRACE("IDBBackingStore::open"); | 381 IDB_TRACE("IDBBackingStore::open"); |
| 364 String pathBase = pathBaseArg; | 382 String pathBase = pathBaseArg; |
| 365 | 383 |
| 366 OwnPtr<LevelDBComparator> comparator = adoptPtr(new Comparator()); | 384 OwnPtr<LevelDBComparator> comparator = adoptPtr(new Comparator()); |
| 367 OwnPtr<LevelDBDatabase> db; | 385 OwnPtr<LevelDBDatabase> db; |
| 368 | 386 |
| 369 if (pathBase.isEmpty()) { | 387 if (pathBase.isEmpty()) { |
| 370 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingStore.O
penStatus", IDBLevelDBBackingStoreOpenMemory, IDBLevelDBBackingStoreOpenMax); | 388 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingStore.O
penStatus", IDBLevelDBBackingStoreOpenMemory, IDBLevelDBBackingStoreOpenMax); |
| 371 db = LevelDBDatabase::openInMemory(comparator.get()); | 389 db = LevelDBDatabase::openInMemory(comparator.get()); |
| 372 } else { | 390 } else { |
| 373 if (!makeAllDirectories(pathBase)) { | 391 if (!makeAllDirectories(pathBase)) { |
| 374 LOG_ERROR("Unable to create IndexedDB database path %s", pathBase.ut
f8().data()); | 392 LOG_ERROR("Unable to create IndexedDB database path %s", pathBase.ut
f8().data()); |
| 375 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingSto
re.OpenStatus", IDBLevelDBBackingStoreOpenFailedDirectory, IDBLevelDBBackingStor
eOpenMax); | 393 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingSto
re.OpenStatus", IDBLevelDBBackingStoreOpenFailedDirectory, IDBLevelDBBackingStor
eOpenMax); |
| 376 return PassRefPtr<IDBBackingStore>(); | 394 return PassRefPtr<IDBBackingStore>(); |
| 377 } | 395 } |
| 378 | 396 |
| 379 String path = pathByAppendingComponent(pathBase, securityOrigin->databas
eIdentifier() + ".indexeddb.leveldb"); | 397 String path = pathByAppendingComponent(pathBase, securityOrigin->databas
eIdentifier() + ".indexeddb.leveldb"); |
| 380 | 398 |
| 381 db = LevelDBDatabase::open(path, comparator.get()); | 399 db = levelDBFactory->openLevelDB(path, comparator.get()); |
| 382 if (db) { | 400 if (db) { |
| 383 bool known = false; | 401 bool known = false; |
| 384 bool ok = isSchemaKnown(db.get(), known); | 402 bool ok = isSchemaKnown(db.get(), known); |
| 385 if (!ok) { | 403 if (!ok) { |
| 404 LOG_ERROR("IndexedDB had IO error checking schema, treating it a
s failure to open"); |
| 386 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenFailedIOErrCheckingSchema, IDBLeve
lDBBackingStoreOpenMax); | 405 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenFailedIOErrCheckingSchema, IDBLeve
lDBBackingStoreOpenMax); |
| 387 return PassRefPtr<IDBBackingStore>(); | 406 db.clear(); |
| 388 } | 407 } else if (!known) { |
| 389 if (!known) { | |
| 390 LOG_ERROR("IndexedDB backing store had unknown schema, treating
it as failure to open"); | 408 LOG_ERROR("IndexedDB backing store had unknown schema, treating
it as failure to open"); |
| 391 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenFailedUnknownSchema, IDBLevelDBBac
kingStoreOpenMax); | 409 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenFailedUnknownSchema, IDBLevelDBBac
kingStoreOpenMax); |
| 392 db.clear(); | 410 db.clear(); |
| 393 } | 411 } |
| 394 } | 412 } |
| 395 | 413 |
| 396 if (db) | 414 if (db) |
| 397 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingSto
re.OpenStatus", IDBLevelDBBackingStoreOpenSuccess, IDBLevelDBBackingStoreOpenMax
); | 415 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingSto
re.OpenStatus", IDBLevelDBBackingStoreOpenSuccess, IDBLevelDBBackingStoreOpenMax
); |
| 398 else { | 416 else { |
| 399 LOG_ERROR("IndexedDB backing store open failed, attempting cleanup")
; | 417 LOG_ERROR("IndexedDB backing store open failed, attempting cleanup")
; |
| 400 bool success = LevelDBDatabase::destroy(path); | 418 bool success = levelDBFactory->destroyLevelDB(path); |
| 401 if (!success) { | 419 if (!success) { |
| 402 LOG_ERROR("IndexedDB backing store cleanup failed"); | 420 LOG_ERROR("IndexedDB backing store cleanup failed"); |
| 403 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenCleanupDestroyFailed, IDBLevelDBBa
ckingStoreOpenMax); | 421 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenCleanupDestroyFailed, IDBLevelDBBa
ckingStoreOpenMax); |
| 404 return PassRefPtr<IDBBackingStore>(); | 422 return PassRefPtr<IDBBackingStore>(); |
| 405 } | 423 } |
| 406 | 424 |
| 407 LOG_ERROR("IndexedDB backing store cleanup succeeded, reopening"); | 425 LOG_ERROR("IndexedDB backing store cleanup succeeded, reopening"); |
| 408 db = LevelDBDatabase::open(path, comparator.get()); | 426 db = levelDBFactory->openLevelDB(path, comparator.get()); |
| 409 if (!db) { | 427 if (!db) { |
| 410 LOG_ERROR("IndexedDB backing store reopen after recovery failed"
); | 428 LOG_ERROR("IndexedDB backing store reopen after recovery failed"
); |
| 411 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenCleanupReopenFailed, IDBLevelDBBac
kingStoreOpenMax); | 429 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.Backin
gStore.OpenStatus", IDBLevelDBBackingStoreOpenCleanupReopenFailed, IDBLevelDBBac
kingStoreOpenMax); |
| 412 return PassRefPtr<IDBBackingStore>(); | 430 return PassRefPtr<IDBBackingStore>(); |
| 413 } | 431 } |
| 414 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingSto
re.OpenStatus", IDBLevelDBBackingStoreOpenCleanupReopenSuccess, IDBLevelDBBackin
gStoreOpenMax); | 432 HistogramSupport::histogramEnumeration("WebCore.IndexedDB.BackingSto
re.OpenStatus", IDBLevelDBBackingStoreOpenCleanupReopenSuccess, IDBLevelDBBackin
gStoreOpenMax); |
| 415 } | 433 } |
| 416 } | 434 } |
| 417 | 435 |
| 418 if (!db) | 436 if (!db) |
| (...skipping 1439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1858 { | 1876 { |
| 1859 IDB_TRACE("IDBBackingStore::Transaction::rollback"); | 1877 IDB_TRACE("IDBBackingStore::Transaction::rollback"); |
| 1860 ASSERT(m_transaction); | 1878 ASSERT(m_transaction); |
| 1861 m_transaction->rollback(); | 1879 m_transaction->rollback(); |
| 1862 m_transaction.clear(); | 1880 m_transaction.clear(); |
| 1863 } | 1881 } |
| 1864 | 1882 |
| 1865 } // namespace WebCore | 1883 } // namespace WebCore |
| 1866 | 1884 |
| 1867 #endif // ENABLE(INDEXED_DATABASE) | 1885 #endif // ENABLE(INDEXED_DATABASE) |
| OLD | NEW |