1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATABASE_H_ 6 #define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATABASE_H_ 7 8 #include <list> 9 #include <map> 10 #include <string> 11 #include <utility> 12 #include <vector> 13 14 #include "base/basictypes.h" 15 #include "base/memory/ref_counted.h" 16 #include "content/browser/indexed_db/indexed_db.h" 17 #include "content/browser/indexed_db/indexed_db_backing_store.h" 18 #include "content/browser/indexed_db/indexed_db_callbacks.h" 19 #include "content/browser/indexed_db/indexed_db_metadata.h" 20 #include "content/browser/indexed_db/indexed_db_pending_connection.h" 21 #include "content/browser/indexed_db/indexed_db_transaction_coordinator.h" 22 #include "content/browser/indexed_db/list_set.h" 23 #include "third_party/WebKit/public/platform/WebIDBTypes.h" 24 #include "url/gurl.h" 25 26 namespace content { 27 28 class IndexedDBBlobInfo; 29 class IndexedDBConnection; 30 class IndexedDBDatabaseCallbacks; 31 class IndexedDBFactory; 32 class IndexedDBKey; 33 class IndexedDBKeyPath; 34 class IndexedDBKeyRange; 35 class IndexedDBTransaction; 36 struct IndexedDBValue; 37 38 class CONTENT_EXPORT IndexedDBDatabase 39 : NON_EXPORTED_BASE(public base::RefCounted<IndexedDBDatabase>) { 40 public: 41 // An index and corresponding set of keys 42 typedef std::pair<int64, std::vector<IndexedDBKey> > IndexKeys; 43 44 // Identifier is pair of (origin url, database name). 45 typedef std::pair<GURL, base::string16> Identifier; 46 47 static const int64 kInvalidId = 0; 48 static const int64 kMinimumIndexId = 30; 49 50 static scoped_refptr<IndexedDBDatabase> Create( 51 const base::string16& name, 52 IndexedDBBackingStore* backing_store, 53 IndexedDBFactory* factory, 54 const Identifier& unique_identifier, 55 leveldb::Status* s); 56 57 const Identifier& identifier() const { return identifier_; } 58 IndexedDBBackingStore* backing_store() { return backing_store_.get(); } 59 60 int64 id() const { return metadata_.id; } 61 const base::string16& name() const { return metadata_.name; } 62 63 void AddObjectStore(const IndexedDBObjectStoreMetadata& metadata, 64 int64 new_max_object_store_id); 65 void RemoveObjectStore(int64 object_store_id); 66 void AddIndex(int64 object_store_id, 67 const IndexedDBIndexMetadata& metadata, 68 int64 new_max_index_id); 69 void RemoveIndex(int64 object_store_id, int64 index_id); 70 71 void OpenConnection(const IndexedDBPendingConnection& connection); 72 void DeleteDatabase(scoped_refptr<IndexedDBCallbacks> callbacks); 73 const IndexedDBDatabaseMetadata& metadata() const { return metadata_; } 74 75 void CreateObjectStore(int64 transaction_id, 76 int64 object_store_id, 77 const base::string16& name, 78 const IndexedDBKeyPath& key_path, 79 bool auto_increment); 80 void DeleteObjectStore(int64 transaction_id, int64 object_store_id); 81 void CreateTransaction(int64 transaction_id, 82 IndexedDBConnection* connection, 83 const std::vector<int64>& object_store_ids, 84 blink::WebIDBTransactionMode mode); 85 void Close(IndexedDBConnection* connection, bool forced); 86 void ForceClose(); 87 88 // Ack that one of the connections notified with a "versionchange" event did 89 // not promptly close. Therefore a "blocked" event should be fired at the 90 // pending connection. 91 void VersionChangeIgnored(); 92 93 void Commit(int64 transaction_id); 94 void Abort(int64 transaction_id); 95 void Abort(int64 transaction_id, const IndexedDBDatabaseError& error); 96 97 void CreateIndex(int64 transaction_id, 98 int64 object_store_id, 99 int64 index_id, 100 const base::string16& name, 101 const IndexedDBKeyPath& key_path, 102 bool unique, 103 bool multi_entry); 104 void DeleteIndex(int64 transaction_id, int64 object_store_id, int64 index_id); 105 106 IndexedDBTransactionCoordinator& transaction_coordinator() { 107 return transaction_coordinator_; 108 } 109 const IndexedDBTransactionCoordinator& transaction_coordinator() const { 110 return transaction_coordinator_; 111 } 112 113 void TransactionCreated(IndexedDBTransaction* transaction); 114 void TransactionFinished(IndexedDBTransaction* transaction, bool committed); 115 116 // Called by transactions to report failure committing to the backing store. 117 void TransactionCommitFailed(const leveldb::Status& status); 118 119 void Get(int64 transaction_id, 120 int64 object_store_id, 121 int64 index_id, 122 scoped_ptr<IndexedDBKeyRange> key_range, 123 bool key_only, 124 scoped_refptr<IndexedDBCallbacks> callbacks); 125 void Put(int64 transaction_id, 126 int64 object_store_id, 127 IndexedDBValue* value, 128 ScopedVector<storage::BlobDataHandle>* handles, 129 scoped_ptr<IndexedDBKey> key, 130 blink::WebIDBPutMode mode, 131 scoped_refptr<IndexedDBCallbacks> callbacks, 132 const std::vector<IndexKeys>& index_keys); 133 void SetIndexKeys(int64 transaction_id, 134 int64 object_store_id, 135 scoped_ptr<IndexedDBKey> primary_key, 136 const std::vector<IndexKeys>& index_keys); 137 void SetIndexesReady(int64 transaction_id, 138 int64 object_store_id, 139 const std::vector<int64>& index_ids); 140 void OpenCursor(int64 transaction_id, 141 int64 object_store_id, 142 int64 index_id, 143 scoped_ptr<IndexedDBKeyRange> key_range, 144 blink::WebIDBCursorDirection, 145 bool key_only, 146 blink::WebIDBTaskType task_type, 147 scoped_refptr<IndexedDBCallbacks> callbacks); 148 void Count(int64 transaction_id, 149 int64 object_store_id, 150 int64 index_id, 151 scoped_ptr<IndexedDBKeyRange> key_range, 152 scoped_refptr<IndexedDBCallbacks> callbacks); 153 void DeleteRange(int64 transaction_id, 154 int64 object_store_id, 155 scoped_ptr<IndexedDBKeyRange> key_range, 156 scoped_refptr<IndexedDBCallbacks> callbacks); 157 void Clear(int64 transaction_id, 158 int64 object_store_id, 159 scoped_refptr<IndexedDBCallbacks> callbacks); 160 161 // Number of connections that have progressed passed initial open call. 162 size_t ConnectionCount() const; 163 // Number of open calls that are blocked on other connections. 164 size_t PendingOpenCount() const; 165 // Number of pending upgrades (0 or 1). Also included in ConnectionCount(). 166 size_t PendingUpgradeCount() const; 167 // Number of running upgrades (0 or 1). Also included in ConnectionCount(). 168 size_t RunningUpgradeCount() const; 169 // Number of pending deletes, blocked on other connections. 170 size_t PendingDeleteCount() const; 171 172 // Asynchronous tasks scheduled within transactions: 173 void CreateObjectStoreAbortOperation(int64 object_store_id, 174 IndexedDBTransaction* transaction); 175 void DeleteObjectStoreOperation( 176 int64 object_store_id, 177 IndexedDBTransaction* transaction); 178 void DeleteObjectStoreAbortOperation( 179 const IndexedDBObjectStoreMetadata& object_store_metadata, 180 IndexedDBTransaction* transaction); 181 void VersionChangeOperation(int64 version, 182 scoped_refptr<IndexedDBCallbacks> callbacks, 183 scoped_ptr<IndexedDBConnection> connection, 184 IndexedDBTransaction* transaction); 185 void VersionChangeAbortOperation(const base::string16& previous_version, 186 int64 previous_int_version, 187 IndexedDBTransaction* transaction); 188 void DeleteIndexOperation(int64 object_store_id, 189 int64 index_id, 190 IndexedDBTransaction* transaction); 191 void CreateIndexAbortOperation(int64 object_store_id, 192 int64 index_id, 193 IndexedDBTransaction* transaction); 194 void DeleteIndexAbortOperation(int64 object_store_id, 195 const IndexedDBIndexMetadata& index_metadata, 196 IndexedDBTransaction* transaction); 197 void GetOperation(int64 object_store_id, 198 int64 index_id, 199 scoped_ptr<IndexedDBKeyRange> key_range, 200 indexed_db::CursorType cursor_type, 201 scoped_refptr<IndexedDBCallbacks> callbacks, 202 IndexedDBTransaction* transaction); 203 struct PutOperationParams; 204 void PutOperation(scoped_ptr<PutOperationParams> params, 205 IndexedDBTransaction* transaction); 206 void SetIndexesReadyOperation(size_t index_count, 207 IndexedDBTransaction* transaction); 208 struct OpenCursorOperationParams; 209 void OpenCursorOperation(scoped_ptr<OpenCursorOperationParams> params, 210 IndexedDBTransaction* transaction); 211 void CountOperation(int64 object_store_id, 212 int64 index_id, 213 scoped_ptr<IndexedDBKeyRange> key_range, 214 scoped_refptr<IndexedDBCallbacks> callbacks, 215 IndexedDBTransaction* transaction); 216 void DeleteRangeOperation(int64 object_store_id, 217 scoped_ptr<IndexedDBKeyRange> key_range, 218 scoped_refptr<IndexedDBCallbacks> callbacks, 219 IndexedDBTransaction* transaction); 220 void ClearOperation(int64 object_store_id, 221 scoped_refptr<IndexedDBCallbacks> callbacks, 222 IndexedDBTransaction* transaction); 223 224 private: 225 friend class base::RefCounted<IndexedDBDatabase>; 226 227 class PendingDeleteCall; 228 class PendingSuccessCall; 229 class PendingUpgradeCall; 230 231 typedef std::map<int64, IndexedDBTransaction*> TransactionMap; 232 typedef std::list<IndexedDBPendingConnection> PendingOpenCallList; 233 typedef std::list<PendingDeleteCall*> PendingDeleteCallList; 234 typedef list_set<IndexedDBConnection*> ConnectionSet; 235 236 IndexedDBDatabase(const base::string16& name, 237 IndexedDBBackingStore* backing_store, 238 IndexedDBFactory* factory, 239 const Identifier& unique_identifier); 240 ~IndexedDBDatabase(); 241 242 bool IsOpenConnectionBlocked() const; 243 leveldb::Status OpenInternal(); 244 void RunVersionChangeTransaction(scoped_refptr<IndexedDBCallbacks> callbacks, 245 scoped_ptr<IndexedDBConnection> connection, 246 int64 transaction_id, 247 int64 requested_version); 248 void RunVersionChangeTransactionFinal( 249 scoped_refptr<IndexedDBCallbacks> callbacks, 250 scoped_ptr<IndexedDBConnection> connection, 251 int64 transaction_id, 252 int64 requested_version); 253 void ProcessPendingCalls(); 254 255 bool IsDeleteDatabaseBlocked() const; 256 void DeleteDatabaseFinal(scoped_refptr<IndexedDBCallbacks> callbacks); 257 258 scoped_ptr<IndexedDBConnection> CreateConnection( 259 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, 260 int child_process_id); 261 262 IndexedDBTransaction* GetTransaction(int64 transaction_id) const; 263 264 bool ValidateObjectStoreId(int64 object_store_id) const; 265 bool ValidateObjectStoreIdAndIndexId(int64 object_store_id, 266 int64 index_id) const; 267 bool ValidateObjectStoreIdAndOptionalIndexId(int64 object_store_id, 268 int64 index_id) const; 269 bool ValidateObjectStoreIdAndNewIndexId(int64 object_store_id, 270 int64 index_id) const; 271 272 scoped_refptr<IndexedDBBackingStore> backing_store_; 273 IndexedDBDatabaseMetadata metadata_; 274 275 const Identifier identifier_; 276 scoped_refptr<IndexedDBFactory> factory_; 277 278 IndexedDBTransactionCoordinator transaction_coordinator_; 279 280 TransactionMap transactions_; 281 PendingOpenCallList pending_open_calls_; 282 scoped_ptr<PendingUpgradeCall> pending_run_version_change_transaction_call_; 283 scoped_ptr<PendingSuccessCall> pending_second_half_open_; 284 PendingDeleteCallList pending_delete_calls_; 285 286 ConnectionSet connections_; 287 288 DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabase); 289 }; 290 291 } // namespace content 292 293 #endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATABASE_H_ 294