Changeset 98749 in webkit
- Timestamp:
- Oct 28, 2011, 12:22:27 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 6 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/storage/indexeddb/open-during-transaction-expected.txt (added)
-
LayoutTests/storage/indexeddb/open-during-transaction.html (added)
-
LayoutTests/storage/indexeddb/version-change-abort-expected.txt (added)
-
LayoutTests/storage/indexeddb/version-change-abort.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/storage/IDBBackingStore.h (modified) (1 diff)
-
Source/WebCore/storage/IDBDatabaseBackendImpl.cpp (modified) (2 diffs)
-
Source/WebCore/storage/IDBLevelDBBackingStore.cpp (modified) (2 diffs)
-
Source/WebCore/storage/IDBLevelDBBackingStore.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r98746 r98749 1 2011-10-28 Joshua Bell <jsbell@chromium.org> 2 3 IndexedDB: Database metadata changes should be tied to transaction 4 https://bugs.webkit.org/show_bug.cgi?id=70974 5 6 Reviewed by Tony Chang. 7 8 * storage/indexeddb/open-during-transaction-expected.txt: Added. 9 * storage/indexeddb/open-during-transaction.html: Added. 10 * storage/indexeddb/version-change-abort-expected.txt: Added. 11 * storage/indexeddb/version-change-abort.html: Added. 12 1 13 2011-10-28 Simon Fraser <simon.fraser@apple.com> 2 14 -
trunk/Source/WebCore/ChangeLog
r98748 r98749 1 2011-10-28 Joshua Bell <jsbell@chromium.org> 2 3 IndexedDB: Database metadata changes should be tied to transaction 4 https://bugs.webkit.org/show_bug.cgi?id=70974 5 6 Reviewed by Tony Chang. 7 8 Database metadata (that is, the version string) was rolled back 9 on abort by an abort task. If the abort task didn't run e.g. 10 due to a crash, the metadata would not be reverted. All of the 11 other store/index/data changes were written into the transaction 12 itself, so the metadata now is too. Refactored the metadata 13 get/create/update methods for clarity as well. 14 15 Note that the new tests don't actually verify that the code handles 16 this case; that will need to be done with persistence tests 17 that span multiple runs of the browser and induce crashes. 18 The new tests do verify that these changes don't cause regressions 19 not caught by other tests. 20 21 Tests: storage/indexeddb/open-during-transaction.html 22 storage/indexeddb/version-change-abort.html 23 24 * storage/IDBBackingStore.h: 25 * storage/IDBDatabaseBackendImpl.cpp: 26 (WebCore::IDBDatabaseBackendImpl::IDBDatabaseBackendImpl): 27 (WebCore::IDBDatabaseBackendImpl::setVersionInternal): 28 * storage/IDBLevelDBBackingStore.cpp: 29 (WebCore::IDBLevelDBBackingStore::getIDBDatabaseMetaData): 30 (WebCore::IDBLevelDBBackingStore::createIDBDatabaseMetaData): 31 (WebCore::IDBLevelDBBackingStore::updateIDBDatabaseMetaData): 32 * storage/IDBLevelDBBackingStore.h: 33 1 34 2011-10-28 Luke Macpherson <macpherson@chromium.org> 2 35 -
trunk/Source/WebCore/storage/IDBBackingStore.h
r97453 r98749 48 48 49 49 virtual void getDatabaseNames(Vector<String>& foundNames) = 0; 50 virtual bool extractIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId) = 0; 51 virtual bool setIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId, bool invalidRowId) = 0; 50 virtual bool getIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId) = 0; 51 virtual bool createIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId) = 0; 52 virtual bool updateIDBDatabaseMetaData(int64_t rowId, const String& version) = 0; 52 53 53 54 virtual void getObjectStores(int64_t databaseId, Vector<int64_t>& foundIds, Vector<String>& foundNames, Vector<String>& foundKeyPaths, Vector<bool>& foundAutoIncrementFlags) = 0; -
trunk/Source/WebCore/storage/IDBDatabaseBackendImpl.cpp
r97417 r98749 89 89 ASSERT(!m_name.isNull()); 90 90 91 bool success = m_backingStore-> extractIDBDatabaseMetaData(m_name, m_version, m_id);92 ASSERT _UNUSED(success,success == (m_id != InvalidId));93 if (! m_backingStore->setIDBDatabaseMetaData(m_name, m_version, m_id, m_id == InvalidId))91 bool success = m_backingStore->getIDBDatabaseMetaData(m_name, m_version, m_id); 92 ASSERT(success == (m_id != InvalidId)); 93 if (!success && !m_backingStore->createIDBDatabaseMetaData(m_name, m_version, m_id)) 94 94 ASSERT_NOT_REACHED(); // FIXME: Need better error handling. 95 95 loadObjectStores(); … … 219 219 int64_t databaseId = database->id(); 220 220 database->m_version = version; 221 if (!database->m_backingStore-> setIDBDatabaseMetaData(database->m_name, database->m_version, databaseId, databaseId == InvalidId)) {221 if (!database->m_backingStore->updateIDBDatabaseMetaData(databaseId, database->m_version)) { 222 222 // FIXME: The Indexed Database specification does not have an error code dedicated to I/O errors. 223 223 callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Error writing data to stable storage.")); -
trunk/Source/WebCore/storage/IDBLevelDBBackingStore.cpp
r97453 r98749 187 187 } 188 188 189 bool IDBLevelDBBackingStore:: extractIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId)189 bool IDBLevelDBBackingStore::getIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId) 190 190 { 191 191 const Vector<char> key = DatabaseNameKey::encode(m_identifier, name); … … 217 217 } 218 218 219 bool IDBLevelDBBackingStore::setIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId, bool invalidRowId) 220 { 221 if (invalidRowId) { 222 rowId = getNewDatabaseId(m_db.get()); 223 if (rowId < 0) 224 return false; 225 226 const Vector<char> key = DatabaseNameKey::encode(m_identifier, name); 227 if (!putInt(m_db.get(), key, rowId)) 228 return false; 229 } 230 219 bool IDBLevelDBBackingStore::createIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId) 220 { 221 rowId = getNewDatabaseId(m_db.get()); 222 if (rowId < 0) 223 return false; 224 225 const Vector<char> key = DatabaseNameKey::encode(m_identifier, name); 226 if (!putInt(m_db.get(), key, rowId)) 227 return false; 231 228 if (!putString(m_db.get(), DatabaseMetaDataKey::encode(rowId, DatabaseMetaDataKey::kUserVersion), version)) 229 return false; 230 return true; 231 } 232 233 bool IDBLevelDBBackingStore::updateIDBDatabaseMetaData(int64_t rowId, const String& version) 234 { 235 ASSERT(m_currentTransaction); 236 if (!putString(m_currentTransaction.get(), DatabaseMetaDataKey::encode(rowId, DatabaseMetaDataKey::kUserVersion), version)) 232 237 return false; 233 238 -
trunk/Source/WebCore/storage/IDBLevelDBBackingStore.h
r97453 r98749 46 46 47 47 virtual void getDatabaseNames(Vector<String>& foundNames); 48 virtual bool extractIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId); 49 virtual bool setIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId, bool invalidRowId); 48 virtual bool getIDBDatabaseMetaData(const String& name, String& foundVersion, int64_t& foundId); 49 virtual bool createIDBDatabaseMetaData(const String& name, const String& version, int64_t& rowId); 50 virtual bool updateIDBDatabaseMetaData(int64_t rowId, const String& version); 50 51 51 52 virtual void getObjectStores(int64_t databaseId, Vector<int64_t>& foundIds, Vector<String>& foundNames, Vector<String>& foundKeyPaths, Vector<bool>& foundAutoIncrementFlags);
Note:
See TracChangeset
for help on using the changeset viewer.