indexed_db_database.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_database.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <math.h> 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <set> 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/auto_reset.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/logging.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/stl_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_connection.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_cursor.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_factory.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_index_writer.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_pending_connection.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_tracing.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_transaction.h" 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/browser/indexed_db/indexed_db_value.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_key_path.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_key_range.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using base::Int64ToString16; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeNumber; 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// PendingUpgradeCall has a scoped_ptr<IndexedDBConnection> because it owns the 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in-progress connection. 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass IndexedDBDatabase::PendingUpgradeCall { 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PendingUpgradeCall(scoped_refptr<IndexedDBCallbacks> callbacks, 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<IndexedDBConnection> connection, 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 transaction_id, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 version) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : callbacks_(callbacks), 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch connection_(connection.Pass()), 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch version_(version), 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch transaction_id_(transaction_id) {} 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks() const { return callbacks_; } 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Takes ownership of the connection object. 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<IndexedDBConnection> ReleaseConnection() WARN_UNUSED_RESULT { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return connection_.Pass(); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 version() const { return version_; } 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 transaction_id() const { return transaction_id_; } 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks_; 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<IndexedDBConnection> connection_; 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 version_; 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const int64 transaction_id_; 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// PendingSuccessCall has a IndexedDBConnection* because the connection is now 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// owned elsewhere, but we need to cancel the success call if that connection 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// closes before it is sent. 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass IndexedDBDatabase::PendingSuccessCall { 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PendingSuccessCall(scoped_refptr<IndexedDBCallbacks> callbacks, 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IndexedDBConnection* connection, 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 version) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : callbacks_(callbacks), connection_(connection), version_(version) {} 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks() const { return callbacks_; } 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IndexedDBConnection* connection() const { return connection_; } 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 version() const { return version_; } 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks_; 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IndexedDBConnection* connection_; 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 version_; 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class IndexedDBDatabase::PendingDeleteCall { 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch explicit PendingDeleteCall(scoped_refptr<IndexedDBCallbacks> callbacks) 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : callbacks_(callbacks) {} 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks() const { return callbacks_; } 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks_; 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)scoped_refptr<IndexedDBDatabase> IndexedDBDatabase::Create( 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& name, 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IndexedDBBackingStore* backing_store, 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBFactory* factory, 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Identifier& unique_identifier) { 95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_refptr<IndexedDBDatabase> database = 96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new IndexedDBDatabase(name, backing_store, factory, unique_identifier); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!database->OpenInternal().ok()) 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return 0; 99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return database; 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace { 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const base::string16::value_type kNoStringVersion[] = {0}; 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IndexedDBDatabase::IndexedDBDatabase(const base::string16& name, 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBBackingStore* backing_store, 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBFactory* factory, 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const Identifier& unique_identifier) 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : backing_store_(backing_store), 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_(name, 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kInvalidId, 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kNoStringVersion, 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBDatabaseMetadata::NO_INT_VERSION, 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kInvalidId), 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) identifier_(unique_identifier), 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) factory_(factory) { 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::AddObjectStore( 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store, 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 new_max_object_store_id) { 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(metadata_.object_stores.find(object_store.id) == 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores.end()); 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (new_max_object_store_id != IndexedDBObjectStoreMetadata::kInvalidId) { 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_LT(metadata_.max_object_store_id, new_max_object_store_id); 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.max_object_store_id = new_max_object_store_id; 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores[object_store.id] = object_store; 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::RemoveObjectStore(int64 object_store_id) { 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(metadata_.object_stores.find(object_store_id) != 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores.end()); 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores.erase(object_store_id); 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::AddIndex(int64 object_store_id, 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBIndexMetadata& index, 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 new_max_index_id) { 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(metadata_.object_stores.find(object_store_id) != 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores.end()); 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBObjectStoreMetadata object_store = 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores[object_store_id]; 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(object_store.indexes.find(index.id) == object_store.indexes.end()); 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store.indexes[index.id] = index; 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (new_max_index_id != IndexedDBIndexMetadata::kInvalidId) { 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_LT(object_store.max_index_id, new_max_index_id); 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store.max_index_id = new_max_index_id; 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores[object_store_id] = object_store; 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::RemoveIndex(int64 object_store_id, int64 index_id) { 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(metadata_.object_stores.find(object_store_id) != 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores.end()); 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBObjectStoreMetadata object_store = 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores[object_store_id]; 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(object_store.indexes.find(index_id) != object_store.indexes.end()); 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store.indexes.erase(index_id); 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores[object_store_id] = object_store; 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)leveldb::Status IndexedDBDatabase::OpenInternal() { 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool success = false; 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = backing_store_->GetIDBDatabaseMetaData( 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.name, &metadata_, &success); 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(success == (metadata_.id != kInvalidId)) << "success = " << success 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch << " id = " << metadata_.id; 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return s; 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (success) 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return backing_store_->GetObjectStores(metadata_.id, 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &metadata_.object_stores); 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return backing_store_->CreateIDBDatabaseMetaData( 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.name, metadata_.version, metadata_.int_version, &metadata_.id); 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IndexedDBDatabase::~IndexedDBDatabase() { 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(transactions_.empty()); 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(pending_open_calls_.empty()); 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(pending_delete_calls_.empty()); 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_ptr<IndexedDBConnection> IndexedDBDatabase::CreateConnection( 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int child_process_id) { 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<IndexedDBConnection> connection( 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new IndexedDBConnection(this, database_callbacks)); 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connections_.insert(connection.get()); 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /* TODO(ericu): Grant child process permissions here so that the connection 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * can create Blobs. 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return connection.Pass(); 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIndexedDBTransaction* IndexedDBDatabase::GetTransaction( 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 transaction_id) const { 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TransactionMap::const_iterator trans_iterator = 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transactions_.find(transaction_id); 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (trans_iterator == transactions_.end()) 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return NULL; 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return trans_iterator->second; 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool IndexedDBDatabase::ValidateObjectStoreId(int64 object_store_id) const { 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ContainsKey(metadata_.object_stores, object_store_id)) { 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DLOG(ERROR) << "Invalid object_store_id"; 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool IndexedDBDatabase::ValidateObjectStoreIdAndIndexId(int64 object_store_id, 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 index_id) const { 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreId(object_store_id)) 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const IndexedDBObjectStoreMetadata& object_store_metadata = 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch metadata_.object_stores.find(object_store_id)->second; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ContainsKey(object_store_metadata.indexes, index_id)) { 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DLOG(ERROR) << "Invalid index_id"; 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool IndexedDBDatabase::ValidateObjectStoreIdAndOptionalIndexId( 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 object_store_id, 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 index_id) const { 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreId(object_store_id)) 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const IndexedDBObjectStoreMetadata& object_store_metadata = 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch metadata_.object_stores.find(object_store_id)->second; 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (index_id != IndexedDBIndexMetadata::kInvalidId && 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !ContainsKey(object_store_metadata.indexes, index_id)) { 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DLOG(ERROR) << "Invalid index_id"; 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool IndexedDBDatabase::ValidateObjectStoreIdAndNewIndexId( 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 object_store_id, 2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 index_id) const { 2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreId(object_store_id)) 2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const IndexedDBObjectStoreMetadata& object_store_metadata = 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch metadata_.object_stores.find(object_store_id)->second; 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ContainsKey(object_store_metadata.indexes, index_id)) { 2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DLOG(ERROR) << "Invalid index_id"; 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::CreateObjectStore(int64 transaction_id, 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& name, 262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKeyPath& key_path, 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool auto_increment) { 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::CreateObjectStore"); 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ContainsKey(metadata_.object_stores, object_store_id)) { 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DLOG(ERROR) << "Invalid object_store_id"; 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBObjectStoreMetadata object_store_metadata( 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) name, 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_id, 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) key_path, 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) auto_increment, 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBDatabase::kMinimumIndexId); 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->ScheduleTask( 2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::CreateObjectStoreOperation, 2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata), 2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::CreateObjectStoreAbortOperation, 2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id)); 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddObjectStore(object_store_metadata, object_store_id); 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::CreateObjectStoreOperation( 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store_metadata, 2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::CreateObjectStoreOperation"); 297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_->CreateObjectStore( 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->database()->id(), 3003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata.id, 3013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata.name, 3023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata.key_path, 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) object_store_metadata.auto_increment).ok()) { 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(IndexedDBDatabaseError( 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASCIIToUTF16("Internal error creating object store '") + 3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata.name + ASCIIToUTF16("'."))); 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::DeleteObjectStore(int64 transaction_id, 313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id) { 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::DeleteObjectStore"); 3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreId(object_store_id)) 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store_metadata = 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores[object_store_id]; 325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->ScheduleTask( 3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::DeleteObjectStoreOperation, 3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata), 3303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::DeleteObjectStoreAbortOperation, 3313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 3323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata)); 333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemoveObjectStore(object_store_id); 334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::CreateIndex(int64 transaction_id, 337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 index_id, 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& name, 340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKeyPath& key_path, 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool unique, 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool multi_entry) { 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::CreateIndex"); 3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreIdAndNewIndexId(object_store_id, index_id)) 3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBIndexMetadata index_metadata( 352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) name, index_id, key_path, unique, multi_entry); 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->ScheduleTask( 3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::CreateIndexOperation, 3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_metadata), 3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::CreateIndexAbortOperation, 3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_id)); 363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddIndex(object_store_id, index_metadata, index_id); 365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::CreateIndexOperation( 3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBIndexMetadata& index_metadata, 3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::CreateIndexOperation"); 372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_->CreateIndex(transaction->BackingStoreTransaction(), 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->database()->id(), 3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_metadata.id, 3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_metadata.name, 3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_metadata.key_path, 3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_metadata.unique, 379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) index_metadata.multi_entry).ok()) { 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 error_string = 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASCIIToUTF16("Internal error creating index '") + 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) index_metadata.name + ASCIIToUTF16("'."); 383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(IndexedDBDatabaseError( 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, error_string)); 385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::CreateIndexAbortOperation( 3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 3913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 index_id, 3923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 3933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::CreateIndexAbortOperation"); 394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!transaction); 3953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RemoveIndex(object_store_id, index_id); 396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::DeleteIndex(int64 transaction_id, 399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 index_id) { 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::DeleteIndex"); 4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreIdAndIndexId(object_store_id, index_id)) 4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const IndexedDBIndexMetadata& index_metadata = 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch metadata_.object_stores[object_store_id].indexes[index_id]; 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->ScheduleTask( 4133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::DeleteIndexOperation, 4143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 4163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_metadata), 4173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::DeleteIndexAbortOperation, 4183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 4193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_metadata)); 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemoveIndex(object_store_id, index_id); 423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::DeleteIndexOperation( 4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 4273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBIndexMetadata& index_metadata, 4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::DeleteIndexOperation"); 430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = 431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) backing_store_->DeleteIndex(transaction->BackingStoreTransaction(), 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transaction->database()->id(), 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) object_store_id, 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) index_metadata.id); 435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 error_string = 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASCIIToUTF16("Internal error deleting index '") + 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) index_metadata.name + ASCIIToUTF16("'."); 439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(IndexedDBDatabaseError( 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, error_string)); 441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::DeleteIndexAbortOperation( 4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBIndexMetadata& index_metadata, 4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::DeleteIndexAbortOperation"); 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!transaction); 4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddIndex(object_store_id, index_metadata, IndexedDBIndexMetadata::kInvalidId); 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::Commit(int64 transaction_id) { 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The frontend suggests that we commit, but we may have previously initiated 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // an abort, and so have disposed of the transaction. on_abort has already 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // been dispatched to the frontend, so it will find out about that 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // asynchronously. 4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (transaction) 4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transaction->Commit(); 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::Abort(int64 transaction_id) { 464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the transaction is unknown, then it has already been aborted by the 465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // backend before this call so it is safe to ignore it. 4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (transaction) 4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transaction->Abort(); 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::Abort(int64 transaction_id, 472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBDatabaseError& error) { 473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the transaction is unknown, then it has already been aborted by the 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // backend before this call so it is safe to ignore it. 4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (transaction) 4777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transaction->Abort(error); 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid IndexedDBDatabase::Get(int64 transaction_id, 481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 object_store_id, 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 index_id, 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<IndexedDBKeyRange> key_range, 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool key_only, 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks) { 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::Get"); 4877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreIdAndOptionalIndexId(object_store_id, index_id)) 4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction->ScheduleTask(base::Bind( 4953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &IndexedDBDatabase::GetOperation, 4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_id, 498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) index_id, 4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Passed(&key_range), 500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) key_only ? indexed_db::CURSOR_KEY_ONLY : indexed_db::CURSOR_KEY_AND_VALUE, 501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callbacks)); 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::GetOperation( 5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 index_id, 5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<IndexedDBKeyRange> key_range, 5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) indexed_db::CursorType cursor_type, 5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks, 5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 5113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::GetOperation"); 5123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(metadata_.object_stores.find(object_store_id) != 5143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.object_stores.end()); 5153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store_metadata = 5163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.object_stores[object_store_id]; 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKey* key; 519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor; 5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (key_range->IsOnlyKey()) { 5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) key = &key_range->lower(); 523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 5243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (index_id == IndexedDBIndexMetadata::kInvalidId) { 5253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_NE(cursor_type, indexed_db::CURSOR_KEY_ONLY); 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ObjectStore Retrieval Operation 527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_cursor = backing_store_->OpenObjectStoreCursor( 528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 5293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 5303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 5313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key_range, 532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::CURSOR_NEXT); 5333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else if (cursor_type == indexed_db::CURSOR_KEY_ONLY) { 534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Index Value Retrieval Operation 535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_cursor = backing_store_->OpenIndexKeyCursor( 536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 5373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 5383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_id, 5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key_range, 541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::CURSOR_NEXT); 542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Index Referenced Value Retrieval Operation 544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_cursor = backing_store_->OpenIndexCursor( 545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 5463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 5473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 5483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_id, 5493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key_range, 550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::CURSOR_NEXT); 551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_cursor) { 5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(); 555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) key = &backing_store_cursor->key(); 559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBKey> primary_key; 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s; 5633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (index_id == IndexedDBIndexMetadata::kInvalidId) { 564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Object Store Retrieval Operation 56523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IndexedDBValue value; 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) s = backing_store_->GetRecord(transaction->BackingStoreTransaction(), 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id(), 568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) object_store_id, 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *key, 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &value); 571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnError( 573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Internal error in GetRecord.")); 575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (value.empty()) { 5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(); 580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (object_store_metadata.auto_increment && 5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !object_store_metadata.key_path.IsNull()) { 5853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(&value, *key, object_store_metadata.key_path); 586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(&value); 590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // From here we are dealing only with indexes. 594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) s = backing_store_->GetPrimaryKeyViaIndex( 595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 5963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_id, 599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *key, 600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &primary_key); 601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnError( 603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Internal error in GetPrimaryKeyViaIndex.")); 605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!primary_key) { 6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(); 609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (cursor_type == indexed_db::CURSOR_KEY_ONLY) { 612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Index Value Retrieval Operation 6133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(*primary_key); 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Index Referenced Value Retrieval Operation 61823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IndexedDBValue value; 619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) s = backing_store_->GetRecord(transaction->BackingStoreTransaction(), 620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id(), 621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) object_store_id, 622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *primary_key, 623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &value); 624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 6253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnError( 626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "Internal error in GetRecord.")); 628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (value.empty()) { 6323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(); 633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 6353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (object_store_metadata.auto_increment && 6363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !object_store_metadata.key_path.IsNull()) { 6373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(&value, *primary_key, object_store_metadata.key_path); 638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 6403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(&value); 641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static scoped_ptr<IndexedDBKey> GenerateKey( 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IndexedDBBackingStore* backing_store, 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IndexedDBTransaction* transaction, 646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id) { 648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int64 max_generator_value = 649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9007199254740992LL; // Maximum integer storable as ECMAScript number. 650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 current_number; 651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = backing_store->GetKeyGeneratorCurrentNumber( 652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) database_id, 654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_id, 655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ¤t_number); 656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LOG(ERROR) << "Failed to GetKeyGeneratorCurrentNumber"; 658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return make_scoped_ptr(new IndexedDBKey()); 659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (current_number < 0 || current_number > max_generator_value) 661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return make_scoped_ptr(new IndexedDBKey()); 662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new IndexedDBKey(current_number, WebIDBKeyTypeNumber)); 664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static leveldb::Status UpdateKeyGenerator(IndexedDBBackingStore* backing_store, 667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBTransaction* transaction, 668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBKey& key, 671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool check_current) { 6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(WebIDBKeyTypeNumber, key.type()); 673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return backing_store->MaybeUpdateKeyGeneratorCurrentNumber( 674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) database_id, 676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_id, 6773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static_cast<int64>(floor(key.number())) + 1, 678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) check_current); 679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct IndexedDBDatabase::PutOperationParams { 6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PutOperationParams() {} 6833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id; 68423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IndexedDBValue value; 6853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<IndexedDBKey> key; 6863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBDatabase::PutMode put_mode; 6873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks; 6883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<IndexKeys> index_keys; 6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 6913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PutOperationParams); 6923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 6933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::Put(int64 transaction_id, 695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 69623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IndexedDBValue* value, 697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBKey> key, 698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PutMode put_mode, 699eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks, 700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<IndexKeys>& index_keys) { 701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::Put"); 7027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 7037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_NE(transaction->mode(), indexed_db::TRANSACTION_READ_ONLY); 706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreId(object_store_id)) 7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(key); 7113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<PutOperationParams> params(new PutOperationParams()); 7123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->object_store_id = object_store_id; 7133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->value.swap(*value); 7143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->key = key.Pass(); 7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->put_mode = put_mode; 7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks = callbacks; 7173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->index_keys = index_keys; 7183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction->ScheduleTask(base::Bind( 7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &IndexedDBDatabase::PutOperation, this, base::Passed(¶ms))); 7203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::PutOperation(scoped_ptr<PutOperationParams> params, 7233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 7243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::PutOperation"); 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_NE(transaction->mode(), indexed_db::TRANSACTION_READ_ONLY); 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool key_was_generated = false; 727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(metadata_.object_stores.find(params->object_store_id) != 7293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.object_stores.end()); 7303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store = 7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.object_stores[params->object_store_id]; 7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(object_store.auto_increment || params->key->IsValid()); 7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBKey> key; 7353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (params->put_mode != IndexedDBDatabase::CURSOR_UPDATE && 7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store.auto_increment && !params->key->IsValid()) { 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<IndexedDBKey> auto_inc_key = GenerateKey( 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) backing_store_.get(), transaction, id(), params->object_store_id); 739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) key_was_generated = true; 740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!auto_inc_key->IsValid()) { 7413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnError( 742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionConstraintError, 743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Maximum key generator value reached.")); 744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) key = auto_inc_key.Pass(); 747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 7483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) key = params->key.Pass(); 749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(key->IsValid()); 752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::RecordIdentifier record_identifier; 7543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (params->put_mode == IndexedDBDatabase::ADD_ONLY) { 755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool found = false; 756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = backing_store_->KeyExistsInObjectStore( 757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 7583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 7593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->object_store_id, 7603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key, 761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &record_identifier, 762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &found); 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 7643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnError( 765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error checking key existence.")); 767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (found) { 7703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnError( 771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionConstraintError, 772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Key already exists in the object store.")); 773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScopedVector<IndexWriter> index_writers; 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 error_message; 779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool obeys_constraints = false; 780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool backing_store_success = MakeIndexWriters(transaction, 7813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) backing_store_.get(), 7823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 7833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store, 784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *key, 785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch key_was_generated, 7863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->index_keys, 787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &index_writers, 788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &error_message, 789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &obeys_constraints); 790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_success) { 7913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnError(IndexedDBDatabaseError( 792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, 793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error: backing store error updating index keys.")); 794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!obeys_constraints) { 7973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnError(IndexedDBDatabaseError( 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionConstraintError, error_message)); 799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 800868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Before this point, don't do any mutation. After this point, rollback the 803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // transaction in case of error. 804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = 805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_->PutRecord(transaction->BackingStoreTransaction(), 8063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 8073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->object_store_id, 8083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key, 8093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->value, 810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &record_identifier); 811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 8123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnError(IndexedDBDatabaseError( 813f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, 814868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error: backing store error performing put/add.")); 815868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 816868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 817868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 818868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < index_writers.size(); ++i) { 819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IndexWriter* index_writer = index_writers[i]; 820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) index_writer->WriteIndexKeys(record_identifier, 8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) backing_store_.get(), 822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 8233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 8243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->object_store_id); 825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (object_store.auto_increment && 8283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->put_mode != IndexedDBDatabase::CURSOR_UPDATE && 829ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch key->type() == WebIDBKeyTypeNumber) { 830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = UpdateKeyGenerator(backing_store_.get(), 831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transaction, 832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id(), 833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params->object_store_id, 834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *key, 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !key_was_generated); 836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 8373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnError( 838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error updating key generator.")); 840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 842868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnSuccess(*key); 845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::SetIndexKeys(int64 transaction_id, 848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBKey> primary_key, 850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<IndexKeys>& index_keys) { 851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::SetIndexKeys"); 8527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 8537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(alecflett): This method could be asynchronous, but we need to 858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // evaluate if it's worth the extra complexity. 859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::RecordIdentifier record_identifier; 860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool found = false; 861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = backing_store_->KeyExistsInObjectStore( 8621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) transaction->BackingStoreTransaction(), 8631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) metadata_.id, 8641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) object_store_id, 8651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *primary_key, 8661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &record_identifier, 8671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &found); 868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort( 870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error setting index keys.")); 872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!found) { 875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(IndexedDBDatabaseError( 876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, 877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error setting index keys for object store.")); 878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScopedVector<IndexWriter> index_writers; 882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 error_message; 883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool obeys_constraints = false; 884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(metadata_.object_stores.find(object_store_id) != 885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores.end()); 886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store_metadata = 887868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores[object_store_id]; 888eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool backing_store_success = MakeIndexWriters(transaction, 8891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) backing_store_, 890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch id(), 891eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch object_store_metadata, 892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *primary_key, 893eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false, 894eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch index_keys, 895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &index_writers, 896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &error_message, 897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &obeys_constraints); 898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_success) { 899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(IndexedDBDatabaseError( 900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, 901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error: backing store error updating index keys.")); 902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!obeys_constraints) { 905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(IndexedDBDatabaseError( 906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionConstraintError, error_message)); 907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < index_writers.size(); ++i) { 911eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IndexWriter* index_writer = index_writers[i]; 912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) index_writer->WriteIndexKeys(record_identifier, 9131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) backing_store_, 914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) id(), 916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_id); 917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::SetIndexesReady(int64 transaction_id, 921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64, 922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<int64>& index_ids) { 923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::SetIndexesReady"); 9247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 9257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 9277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction->ScheduleTask( 9303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBDatabase::PREEMPTIVE_TASK, 9313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&IndexedDBDatabase::SetIndexesReadyOperation, 9323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 9333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_ids.size())); 934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::SetIndexesReadyOperation( 9373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t index_count, 9383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 9393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::SetIndexesReadyOperation"); 9403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < index_count; ++i) 941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->DidCompletePreemptiveEvent(); 942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 943868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct IndexedDBDatabase::OpenCursorOperationParams { 9453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) OpenCursorOperationParams() {} 9463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id; 9473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 index_id; 9483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<IndexedDBKeyRange> key_range; 9493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) indexed_db::CursorDirection direction; 9503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) indexed_db::CursorType cursor_type; 9513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBDatabase::TaskType task_type; 9523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks; 9533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 9553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OpenCursorOperationParams); 9563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 9573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::OpenCursor( 959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 transaction_id, 960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 index_id, 962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBKeyRange> key_range, 963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::CursorDirection direction, 964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool key_only, 965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TaskType task_type, 966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks) { 967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::OpenCursor"); 9687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 9697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 9707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 9717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreIdAndOptionalIndexId(object_store_id, index_id)) 973868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<OpenCursorOperationParams> params(new OpenCursorOperationParams()); 9763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->object_store_id = object_store_id; 9773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->index_id = index_id; 9783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->key_range = key_range.Pass(); 9793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->direction = direction; 9803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->cursor_type = 9813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) key_only ? indexed_db::CURSOR_KEY_ONLY : indexed_db::CURSOR_KEY_AND_VALUE; 9823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->task_type = task_type; 9833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks = callbacks; 9843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction->ScheduleTask(base::Bind( 9853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &IndexedDBDatabase::OpenCursorOperation, this, base::Passed(¶ms))); 9863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 9873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::OpenCursorOperation( 9893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<OpenCursorOperationParams> params, 9903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 9913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::OpenCursorOperation"); 992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The frontend has begun indexing, so this pauses the transaction 994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // until the indexing is complete. This can't happen any earlier 995868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // because we don't want to switch to early mode in case multiple 996868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // indexes are being created in a row, with Put()'s in between. 9973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (params->task_type == IndexedDBDatabase::PREEMPTIVE_TASK) 998868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->AddPreemptiveEvent(); 999868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1000868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor; 10013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (params->index_id == IndexedDBIndexMetadata::kInvalidId) { 1002424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (params->cursor_type == indexed_db::CURSOR_KEY_ONLY) { 1003424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK_EQ(params->task_type, IndexedDBDatabase::NORMAL_TASK); 1004424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) backing_store_cursor = backing_store_->OpenObjectStoreKeyCursor( 1005424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) transaction->BackingStoreTransaction(), 1006424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) id(), 1007424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) params->object_store_id, 1008424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *params->key_range, 1009424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) params->direction); 1010424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 1011424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) backing_store_cursor = backing_store_->OpenObjectStoreCursor( 1012424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) transaction->BackingStoreTransaction(), 1013424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) id(), 1014424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) params->object_store_id, 1015424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *params->key_range, 10163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->direction); 1017424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 10193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(params->task_type, IndexedDBDatabase::NORMAL_TASK); 10203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (params->cursor_type == indexed_db::CURSOR_KEY_ONLY) { 1021868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_cursor = backing_store_->OpenIndexKeyCursor( 1022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 10233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 10243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->object_store_id, 10253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->index_id, 10263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *params->key_range, 10273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->direction); 1028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 1029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_cursor = backing_store_->OpenIndexCursor( 1030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 10313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 10323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->object_store_id, 10333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->index_id, 10343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *params->key_range, 10353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->direction); 1036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_cursor) { 104023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) params->callbacks->OnSuccess(static_cast<IndexedDBValue*>(NULL)); 1041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCursor> cursor = 10453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new IndexedDBCursor(backing_store_cursor.Pass(), 10463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->cursor_type, 10473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->task_type, 10483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction); 10493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->callbacks->OnSuccess( 1050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cursor, cursor->key(), cursor->primary_key(), cursor->Value()); 1051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1053eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid IndexedDBDatabase::Count(int64 transaction_id, 1054eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 object_store_id, 1055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 index_id, 1056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<IndexedDBKeyRange> key_range, 1057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks) { 1058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::Count"); 10597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 10607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 10617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 10627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreIdAndOptionalIndexId(object_store_id, index_id)) 1064868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1065868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction->ScheduleTask(base::Bind(&IndexedDBDatabase::CountOperation, 10673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 10683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 10693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_id, 10703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Passed(&key_range), 10713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks)); 1072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::CountOperation( 10753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 10763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 index_id, 10773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<IndexedDBKeyRange> key_range, 10783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks, 10793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 10803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::CountOperation"); 1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint32 count = 0; 1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor; 1083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (index_id == IndexedDBIndexMetadata::kInvalidId) { 1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_cursor = backing_store_->OpenObjectStoreKeyCursor( 1086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 10873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 10883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 10893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key_range, 1090868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::CURSOR_NEXT); 1091868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 1092868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_cursor = backing_store_->OpenIndexKeyCursor( 1093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 10943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 10953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 10963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) index_id, 10973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key_range, 1098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::CURSOR_NEXT); 1099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_cursor) { 11013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(count); 1102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) do { 1106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++count; 11077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } while (backing_store_cursor->Continue()); 1108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(count); 1110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::DeleteRange( 1113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 transaction_id, 1114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 1115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBKeyRange> key_range, 1116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks) { 1117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::DeleteRange"); 11187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 11197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 11207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 11217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_NE(transaction->mode(), indexed_db::TRANSACTION_READ_ONLY); 11227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreId(object_store_id)) 1124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction->ScheduleTask(base::Bind(&IndexedDBDatabase::DeleteRangeOperation, 11273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) this, 11283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 11293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Passed(&key_range), 11303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks)); 1131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::DeleteRangeOperation( 11343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 11353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<IndexedDBKeyRange> key_range, 11363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks, 11373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 11383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::DeleteRangeOperation"); 1139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor = 1140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_->OpenObjectStoreCursor( 1141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 11423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 11433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_id, 11443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *key_range, 1145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::CURSOR_NEXT); 1146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (backing_store_cursor) { 1147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) do { 1148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_->DeleteRecord( 1149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transaction->BackingStoreTransaction(), 1150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id(), 1151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) object_store_id, 1152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) backing_store_cursor->record_identifier()) 1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .ok()) { 11543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnError( 1155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 1156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error deleting data in range")); 1157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 11597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } while (backing_store_cursor->Continue()); 1160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(); 1163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid IndexedDBDatabase::Clear(int64 transaction_id, 1166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int64 object_store_id, 1167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks) { 1168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDB_TRACE("IndexedDBDatabase::Clear"); 11697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IndexedDBTransaction* transaction = GetTransaction(transaction_id); 11707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!transaction) 1171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_NE(transaction->mode(), indexed_db::TRANSACTION_READ_ONLY); 1173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!ValidateObjectStoreId(object_store_id)) 11757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 11767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transaction->ScheduleTask(base::Bind( 11783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &IndexedDBDatabase::ClearOperation, this, object_store_id, callbacks)); 1179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::ClearOperation( 11823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 11833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks, 11843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 11853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::ObjectStoreClearOperation"); 1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!backing_store_->ClearObjectStore(transaction->BackingStoreTransaction(), 1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id(), 1188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) object_store_id).ok()) { 11893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnError( 1190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 1191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error clearing object store")); 1192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 11943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnSuccess(); 1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::DeleteObjectStoreOperation( 11983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store_metadata, 11993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBTransaction* transaction) { 12003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::DeleteObjectStoreOperation"); 1201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = 1202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_->DeleteObjectStore(transaction->BackingStoreTransaction(), 1203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->database()->id(), 12043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata.id); 1205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!s.ok()) { 1206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 error_string = 1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASCIIToUTF16("Internal error deleting object store '") + 12083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) object_store_metadata.name + ASCIIToUTF16("'."); 1209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(IndexedDBDatabaseError( 1210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, error_string)); 1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::VersionChangeOperation( 12153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 version, 12163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<IndexedDBCallbacks> callbacks, 12173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<IndexedDBConnection> connection, 1218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBTransaction* transaction) { 12193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::VersionChangeOperation"); 12203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 old_version = metadata_.int_version; 12213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_GT(version, old_version); 12223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.int_version = version; 12233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!backing_store_->UpdateIDBDatabaseIntVersion( 1224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->BackingStoreTransaction(), 12253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) id(), 12263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.int_version)) { 1227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBDatabaseError error( 1228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, 12297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASCIIToUTF16( 12307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "Internal error writing data to stable storage when " 12317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "updating version.")); 12323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callbacks->OnError(error); 1233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction->Abort(error); 1234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 12363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(!pending_second_half_open_); 1237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_second_half_open_.reset( 1238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new PendingSuccessCall(callbacks, connection.get(), version)); 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callbacks->OnUpgradeNeeded(old_version, connection.Pass(), metadata()); 1240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void IndexedDBDatabase::TransactionFinished(IndexedDBTransaction* transaction, 12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool committed) { 1244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(transactions_.find(transaction->id()) != transactions_.end()); 1245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(transactions_[transaction->id()], transaction); 1246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transactions_.erase(transaction->id()); 1247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (transaction->mode() == indexed_db::TRANSACTION_VERSION_CHANGE) { 1249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (pending_second_half_open_) { 12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (committed) { 12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(pending_second_half_open_->version(), metadata_.int_version); 12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(metadata_.id != kInvalidId); 12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Connection was already minted for OnUpgradeNeeded callback. 12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<IndexedDBConnection> connection; 12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_second_half_open_->callbacks()->OnSuccess(connection.Pass(), 12575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this->metadata()); 12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_second_half_open_->callbacks()->OnError( 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionAbortError, 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Version change transaction was aborted in " 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "upgradeneeded event handler.")); 12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_second_half_open_.reset(); 1265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Connection queue is now unblocked. 1268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ProcessPendingCalls(); 1269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void IndexedDBDatabase::TransactionCommitFailed() { 12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Factory may be null in unit tests. 12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!factory_) 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) factory_->HandleBackingStoreFailure(backing_store_->origin_url()); 12771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 12781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t IndexedDBDatabase::ConnectionCount() const { 1280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This does not include pending open calls, as those should not block version 1281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // changes and deletes. 1282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return connections_.size(); 1283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochsize_t IndexedDBDatabase::PendingOpenCount() const { 1286ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return pending_open_calls_.size(); 1287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1289ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochsize_t IndexedDBDatabase::PendingUpgradeCount() const { 1290ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return pending_run_version_change_transaction_call_ ? 1 : 0; 1291ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1292ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochsize_t IndexedDBDatabase::RunningUpgradeCount() const { 1294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return pending_second_half_open_ ? 1 : 0; 1295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1296ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1297ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochsize_t IndexedDBDatabase::PendingDeleteCount() const { 1298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return pending_delete_calls_.size(); 1299ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::ProcessPendingCalls() { 1302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (pending_run_version_change_transaction_call_ && ConnectionCount() == 1) { 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(pending_run_version_change_transaction_call_->version() > 1304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.int_version); 1305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<PendingUpgradeCall> pending_call = 1306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_run_version_change_transaction_call_.Pass(); 13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunVersionChangeTransactionFinal(pending_call->callbacks(), 13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_call->ReleaseConnection(), 13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_call->transaction_id(), 13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_call->version()); 13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(1u, ConnectionCount()); 1312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Fall through would be a no-op, since transaction must complete 1313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // asynchronously. 1314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(IsDeleteDatabaseBlocked()); 1315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(IsOpenConnectionBlocked()); 1316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsDeleteDatabaseBlocked()) { 1320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PendingDeleteCallList pending_delete_calls; 1321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_delete_calls_.swap(pending_delete_calls); 1322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) while (!pending_delete_calls.empty()) { 1323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Only the first delete call will delete the database, but each must fire 1324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // callbacks. 1325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<PendingDeleteCall> pending_delete_call( 1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_delete_calls.front()); 1327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_delete_calls.pop_front(); 13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteDatabaseFinal(pending_delete_call->callbacks()); 1329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // delete_database_final should never re-queue calls. 1331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(pending_delete_calls_.empty()); 1332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Fall through when complete, as pending opens may be unblocked. 1333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsOpenConnectionBlocked()) { 1336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PendingOpenCallList pending_open_calls; 1337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_open_calls_.swap(pending_open_calls); 1338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) while (!pending_open_calls.empty()) { 1339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OpenConnection(pending_open_calls.front()); 1340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_open_calls.pop_front(); 1341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::CreateTransaction( 1346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 transaction_id, 1347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IndexedDBConnection* connection, 1348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<int64>& object_store_ids, 1349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint16 mode) { 1350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 13518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(connections_.count(connection)); 13524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(transactions_.find(transaction_id) == transactions_.end()); 13534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (transactions_.find(transaction_id) != transactions_.end()) 13544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The transaction will add itself to this database's coordinator, which 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // manages the lifetime of the object. 13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TransactionCreated(new IndexedDBTransaction( 13597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transaction_id, 13607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch connection->callbacks(), 13617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::set<int64>(object_store_ids.begin(), object_store_ids.end()), 13627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<indexed_db::TransactionMode>(mode), 1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, 13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new IndexedDBBackingStore::Transaction(backing_store_))); 1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void IndexedDBDatabase::TransactionCreated(IndexedDBTransaction* transaction) { 1368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) transactions_[transaction->id()] = transaction; 1369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IndexedDBDatabase::IsOpenConnectionBlocked() const { 1372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !pending_delete_calls_.empty() || 13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) transaction_coordinator_.IsRunningVersionChangeTransaction() || 1374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_run_version_change_transaction_call_; 1375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::OpenConnection( 1378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBPendingConnection& connection) { 1379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(backing_store_); 1380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(jsbell): Should have a priority queue so that higher version 1382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // requests are processed first. http://crbug.com/225850 1383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsOpenConnectionBlocked()) { 1384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The backing store only detects data loss when it is first opened. The 1385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // presence of existing connections means we didn't even check for data loss 1386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // so there'd better not be any. 1387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_NE(blink::WebIDBDataLossTotal, connection.callbacks->data_loss()); 1388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pending_open_calls_.push_back(connection); 1389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (metadata_.id == kInvalidId) { 1393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The database was deleted then immediately re-opened; OpenInternal() 1394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // recreates it in the backing store. 1395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (OpenInternal().ok()) { 1396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(IndexedDBDatabaseMetadata::NO_INT_VERSION, 1397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_.int_version); 1398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 1399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 message; 1400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (connection.version == IndexedDBDatabaseMetadata::NO_INT_VERSION) { 1401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message = ASCIIToUTF16( 1402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error opening database with no version specified."); 14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message = 1405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASCIIToUTF16("Internal error opening database with version ") + 1406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Int64ToString16(connection.version); 14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.callbacks->OnError(IndexedDBDatabaseError( 1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, message)); 1410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // We infer that the database didn't exist from its lack of either type of 1415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // version. 1416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool is_new_database = 1417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.version == kNoStringVersion && 1418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.int_version == IndexedDBDatabaseMetadata::NO_INT_VERSION; 1419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (connection.version == IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION) { 1421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // For unit tests only - skip upgrade steps. Calling from script with 1422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // DEFAULT_INT_VERSION throws exception. 1423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(jsbell): DCHECK that not in unit tests. 1424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(is_new_database); 1425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.callbacks->OnSuccess( 1426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CreateConnection(connection.database_callbacks, 1427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.child_process_id), 1428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this->metadata()); 1429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We may need to change the version. 1433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 local_version = connection.version; 1434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (local_version == IndexedDBDatabaseMetadata::NO_INT_VERSION) { 1435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!is_new_database) { 1436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.callbacks->OnSuccess( 1437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CreateConnection(connection.database_callbacks, 1438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.child_process_id), 1439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this->metadata()); 1440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Spec says: If no version is specified and no database exists, set 1443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // database version to 1. 1444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_version = 1; 1445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (local_version > metadata_.int_version) { 1448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunVersionChangeTransaction(connection.callbacks, 1449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CreateConnection(connection.database_callbacks, 1450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.child_process_id), 1451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.transaction_id, 1452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_version); 1453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (local_version < metadata_.int_version) { 1456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.callbacks->OnError(IndexedDBDatabaseError( 1457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionVersionError, 1458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASCIIToUTF16("The requested version (") + 1459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Int64ToString16(local_version) + 1460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASCIIToUTF16(") is less than the existing version (") + 1461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Int64ToString16(metadata_.int_version) + ASCIIToUTF16(")."))); 1462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(local_version, metadata_.int_version); 1465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.callbacks->OnSuccess( 1466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CreateConnection(connection.database_callbacks, 1467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) connection.child_process_id), 1468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this->metadata()); 1469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::RunVersionChangeTransaction( 1472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks, 1473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<IndexedDBConnection> connection, 1474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 transaction_id, 14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 requested_version) { 1476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(callbacks); 14788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(connections_.count(connection.get())); 1479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ConnectionCount() > 1) { 14805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(blink::WebIDBDataLossTotal, callbacks->data_loss()); 1481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Front end ensures the event is not fired at connections that have 1482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // close_pending set. 1483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (ConnectionSet::const_iterator it = connections_.begin(); 1484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != connections_.end(); 1485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++it) { 1486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (*it != connection.get()) { 14873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) (*it)->callbacks()->OnVersionChange(metadata_.int_version, 14883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) requested_version); 1489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(jsbell): Remove the call to OnBlocked and instead wait 1492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // until the frontend tells us that all the "versionchange" events 1493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // have been delivered. http://crbug.com/100123 1494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callbacks->OnBlocked(metadata_.int_version); 1495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!pending_run_version_change_transaction_call_); 1497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_run_version_change_transaction_call_.reset(new PendingUpgradeCall( 1498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks, connection.Pass(), transaction_id, requested_version)); 1499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunVersionChangeTransactionFinal( 15025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callbacks, connection.Pass(), transaction_id, requested_version); 1503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::RunVersionChangeTransactionFinal( 1506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks, 1507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<IndexedDBConnection> connection, 1508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 transaction_id, 1509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 requested_version) { 1510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<int64> object_store_ids; 1512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateTransaction(transaction_id, 1513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch connection.get(), 1514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_ids, 1515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) indexed_db::TRANSACTION_VERSION_CHANGE); 1516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) transactions_[transaction_id] 15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->ScheduleTask(base::Bind(&IndexedDBDatabase::VersionChangeOperation, 15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, 15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) requested_version, 15215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callbacks, 15225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Passed(&connection)), 15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&IndexedDBDatabase::VersionChangeAbortOperation, 15245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, 15255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) metadata_.version, 15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) metadata_.int_version)); 1527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!pending_second_half_open_); 1529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::DeleteDatabase( 1532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks) { 1533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsDeleteDatabaseBlocked()) { 1535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (ConnectionSet::const_iterator it = connections_.begin(); 1536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != connections_.end(); 1537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++it) { 1538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Front end ensures the event is not fired at connections that have 1539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // close_pending set. 1540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (*it)->callbacks()->OnVersionChange( 1541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_.int_version, IndexedDBDatabaseMetadata::NO_INT_VERSION); 1542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(jsbell): Only fire OnBlocked if there are open 1544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // connections after the VersionChangeEvents are received, not 1545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // just set up to fire. http://crbug.com/100123 1546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callbacks->OnBlocked(metadata_.int_version); 1547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_delete_calls_.push_back(new PendingDeleteCall(callbacks)); 1548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DeleteDatabaseFinal(callbacks); 1551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IndexedDBDatabase::IsDeleteDatabaseBlocked() const { 1554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !!ConnectionCount(); 1555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDatabase::DeleteDatabaseFinal( 1558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<IndexedDBCallbacks> callbacks) { 1559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!IsDeleteDatabaseBlocked()); 1560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(backing_store_); 1561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!backing_store_->DeleteDatabase(metadata_.name).ok()) { 1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callbacks->OnError( 1563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Internal error deleting database.")); 1565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.version = kNoStringVersion; 1568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.id = kInvalidId; 1569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.int_version = IndexedDBDatabaseMetadata::NO_INT_VERSION; 1570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) metadata_.object_stores.clear(); 1571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callbacks->OnSuccess(); 15725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (factory_) 15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) factory_->DatabaseDeleted(identifier_); 15745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void IndexedDBDatabase::ForceClose() { 15775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // IndexedDBConnection::ForceClose() may delete this database, so hold ref. 15785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<IndexedDBDatabase> protect(this); 15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ConnectionSet::const_iterator it = connections_.begin(); 15805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (it != connections_.end()) { 15815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IndexedDBConnection* connection = *it++; 15825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connection->ForceClose(); 15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(connections_.empty()); 1585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 158758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void IndexedDBDatabase::Close(IndexedDBConnection* connection, bool forced) { 15888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(connections_.count(connection)); 15898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(connection->IsConnected()); 15908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(connection->database() == this); 1591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Abort outstanding transactions from the closing connection. This 1593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // can not happen if the close is requested by the connection itself 1594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // as the front-end defers the close until all transactions are 15958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // complete, but can occur on process termination or forced close. 1596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) { 1597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TransactionMap transactions(transactions_); 1598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (TransactionMap::const_iterator it = transactions.begin(), 1599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) end = transactions.end(); 1600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != end; 1601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++it) { 1602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (it->second->connection() == connection->callbacks()) 1603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it->second->Abort( 1604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 1605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Connection is closing.")); 1606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch connections_.erase(connection); 1610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (pending_second_half_open_ && 16115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_second_half_open_->connection() == connection) { 16125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_second_half_open_->callbacks()->OnError( 1613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionAbortError, 1614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "The connection was closed.")); 1615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_second_half_open_.reset(); 1616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ProcessPendingCalls(); 1619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(jsbell): Add a test for the pending_open_calls_ cases below. 1621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!ConnectionCount() && !pending_open_calls_.size() && 1622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !pending_delete_calls_.size()) { 1623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(transactions_.empty()); 1624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 16251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL origin_url = backing_store_->origin_url(); 16261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) backing_store_ = NULL; 16271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // factory_ should only be null in unit tests. 1629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(jsbell): DCHECK(factory_ || !in_unit_tests) - somehow. 163058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (factory_) { 16315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) factory_->ReleaseDatabase(identifier_, forced); 163258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) factory_ = NULL; 163358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 16373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::CreateObjectStoreAbortOperation( 16383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 object_store_id, 1639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBTransaction* transaction) { 16403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::CreateObjectStoreAbortOperation"); 1641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!transaction); 16423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RemoveObjectStore(object_store_id); 1643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1644868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 16453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::DeleteObjectStoreAbortOperation( 16463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const IndexedDBObjectStoreMetadata& object_store_metadata, 1647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBTransaction* transaction) { 16483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::DeleteObjectStoreAbortOperation"); 1649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!transaction); 16503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddObjectStore(object_store_metadata, 16513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IndexedDBObjectStoreMetadata::kInvalidId); 1652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 16543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void IndexedDBDatabase::VersionChangeAbortOperation( 1655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& previous_version, 16563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 previous_int_version, 1657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBTransaction* transaction) { 16583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) IDB_TRACE("IndexedDBDatabase::VersionChangeAbortOperation"); 1659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!transaction); 16603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.version = previous_version; 16613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) metadata_.int_version = previous_int_version; 1662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 1665