Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1055)

Side by Side Diff: content/browser/indexed_db/indexed_db_backing_store.cc

Issue 1549113002: Switch to standard integer types in content/browser/. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/indexed_db/indexed_db_backing_store.h" 5 #include "content/browser/indexed_db/indexed_db_backing_store.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
11 #include "base/format_macros.h" 11 #include "base/format_macros.h"
12 #include "base/json/json_reader.h" 12 #include "base/json/json_reader.h"
13 #include "base/json/json_writer.h" 13 #include "base/json/json_writer.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/macros.h"
15 #include "base/metrics/histogram.h" 16 #include "base/metrics/histogram.h"
16 #include "base/strings/string_util.h" 17 #include "base/strings/string_util.h"
17 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
18 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
20 #include "build/build_config.h"
19 #include "content/browser/child_process_security_policy_impl.h" 21 #include "content/browser/child_process_security_policy_impl.h"
20 #include "content/browser/indexed_db/indexed_db_blob_info.h" 22 #include "content/browser/indexed_db/indexed_db_blob_info.h"
21 #include "content/browser/indexed_db/indexed_db_class_factory.h" 23 #include "content/browser/indexed_db/indexed_db_class_factory.h"
22 #include "content/browser/indexed_db/indexed_db_database_error.h" 24 #include "content/browser/indexed_db/indexed_db_database_error.h"
23 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" 25 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h"
24 #include "content/browser/indexed_db/indexed_db_metadata.h" 26 #include "content/browser/indexed_db/indexed_db_metadata.h"
25 #include "content/browser/indexed_db/indexed_db_tracing.h" 27 #include "content/browser/indexed_db/indexed_db_tracing.h"
26 #include "content/browser/indexed_db/indexed_db_value.h" 28 #include "content/browser/indexed_db/indexed_db_value.h"
27 #include "content/browser/indexed_db/leveldb/leveldb_comparator.h" 29 #include "content/browser/indexed_db/leveldb/leveldb_comparator.h"
28 #include "content/browser/indexed_db/leveldb/leveldb_database.h" 30 #include "content/browser/indexed_db/leveldb/leveldb_database.h"
(...skipping 17 matching lines...) Expand all
46 48
47 using base::FilePath; 49 using base::FilePath;
48 using base::StringPiece; 50 using base::StringPiece;
49 using std::string; 51 using std::string;
50 using storage::FileWriterDelegate; 52 using storage::FileWriterDelegate;
51 53
52 namespace content { 54 namespace content {
53 55
54 namespace { 56 namespace {
55 57
56 FilePath GetBlobDirectoryName(const FilePath& path_base, int64 database_id) { 58 FilePath GetBlobDirectoryName(const FilePath& path_base, int64_t database_id) {
57 return path_base.AppendASCII(base::StringPrintf("%" PRIx64, database_id)); 59 return path_base.AppendASCII(base::StringPrintf("%" PRIx64, database_id));
58 } 60 }
59 61
60 FilePath GetBlobDirectoryNameForKey(const FilePath& path_base, 62 FilePath GetBlobDirectoryNameForKey(const FilePath& path_base,
61 int64 database_id, 63 int64_t database_id,
62 int64 key) { 64 int64_t key) {
63 FilePath path = GetBlobDirectoryName(path_base, database_id); 65 FilePath path = GetBlobDirectoryName(path_base, database_id);
64 path = path.AppendASCII(base::StringPrintf( 66 path = path.AppendASCII(base::StringPrintf(
65 "%02x", static_cast<int>(key & 0x000000000000ff00) >> 8)); 67 "%02x", static_cast<int>(key & 0x000000000000ff00) >> 8));
66 return path; 68 return path;
67 } 69 }
68 70
69 FilePath GetBlobFileNameForKey(const FilePath& path_base, 71 FilePath GetBlobFileNameForKey(const FilePath& path_base,
70 int64 database_id, 72 int64_t database_id,
71 int64 key) { 73 int64_t key) {
72 FilePath path = GetBlobDirectoryNameForKey(path_base, database_id, key); 74 FilePath path = GetBlobDirectoryNameForKey(path_base, database_id, key);
73 path = path.AppendASCII(base::StringPrintf("%" PRIx64, key)); 75 path = path.AppendASCII(base::StringPrintf("%" PRIx64, key));
74 return path; 76 return path;
75 } 77 }
76 78
77 bool MakeIDBBlobDirectory(const FilePath& path_base, 79 bool MakeIDBBlobDirectory(const FilePath& path_base,
78 int64 database_id, 80 int64_t database_id,
79 int64 key) { 81 int64_t key) {
80 FilePath path = GetBlobDirectoryNameForKey(path_base, database_id, key); 82 FilePath path = GetBlobDirectoryNameForKey(path_base, database_id, key);
81 return base::CreateDirectory(path); 83 return base::CreateDirectory(path);
82 } 84 }
83 85
84 static std::string ComputeOriginIdentifier(const GURL& origin_url) { 86 static std::string ComputeOriginIdentifier(const GURL& origin_url) {
85 return storage::GetIdentifierFromOrigin(origin_url) + "@1"; 87 return storage::GetIdentifierFromOrigin(origin_url) + "@1";
86 } 88 }
87 89
88 static base::FilePath ComputeFileName(const GURL& origin_url) { 90 static base::FilePath ComputeFileName(const GURL& origin_url) {
89 return base::FilePath() 91 return base::FilePath()
90 .AppendASCII(storage::GetIdentifierFromOrigin(origin_url)) 92 .AppendASCII(storage::GetIdentifierFromOrigin(origin_url))
91 .AddExtension(FILE_PATH_LITERAL(".indexeddb.leveldb")); 93 .AddExtension(FILE_PATH_LITERAL(".indexeddb.leveldb"));
92 } 94 }
93 95
94 static base::FilePath ComputeBlobPath(const GURL& origin_url) { 96 static base::FilePath ComputeBlobPath(const GURL& origin_url) {
95 return base::FilePath() 97 return base::FilePath()
96 .AppendASCII(storage::GetIdentifierFromOrigin(origin_url)) 98 .AppendASCII(storage::GetIdentifierFromOrigin(origin_url))
97 .AddExtension(FILE_PATH_LITERAL(".indexeddb.blob")); 99 .AddExtension(FILE_PATH_LITERAL(".indexeddb.blob"));
98 } 100 }
99 101
100 static base::FilePath ComputeCorruptionFileName(const GURL& origin_url) { 102 static base::FilePath ComputeCorruptionFileName(const GURL& origin_url) {
101 return ComputeFileName(origin_url) 103 return ComputeFileName(origin_url)
102 .Append(FILE_PATH_LITERAL("corruption_info.json")); 104 .Append(FILE_PATH_LITERAL("corruption_info.json"));
103 } 105 }
104 106
105 } // namespace 107 } // namespace
106 108
107 static const int64 kKeyGeneratorInitialNumber = 109 static const int64_t kKeyGeneratorInitialNumber =
108 1; // From the IndexedDB specification. 110 1; // From the IndexedDB specification.
109 111
110 enum IndexedDBBackingStoreErrorSource { 112 enum IndexedDBBackingStoreErrorSource {
111 // 0 - 2 are no longer used. 113 // 0 - 2 are no longer used.
112 FIND_KEY_IN_INDEX = 3, 114 FIND_KEY_IN_INDEX = 3,
113 GET_IDBDATABASE_METADATA, 115 GET_IDBDATABASE_METADATA,
114 GET_INDEXES, 116 GET_INDEXES,
115 GET_KEY_GENERATOR_CURRENT_NUMBER, 117 GET_KEY_GENERATOR_CURRENT_NUMBER,
116 GET_OBJECT_STORES, 118 GET_OBJECT_STORES,
117 GET_RECORD, 119 GET_RECORD,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 return leveldb::Status::InvalidArgument("Invalid database key ID"); 204 return leveldb::Status::InvalidArgument("Invalid database key ID");
203 } 205 }
204 206
205 static leveldb::Status IOErrorStatus() { 207 static leveldb::Status IOErrorStatus() {
206 return leveldb::Status::IOError("IO Error"); 208 return leveldb::Status::IOError("IO Error");
207 } 209 }
208 210
209 template <typename DBOrTransaction> 211 template <typename DBOrTransaction>
210 static leveldb::Status GetInt(DBOrTransaction* db, 212 static leveldb::Status GetInt(DBOrTransaction* db,
211 const StringPiece& key, 213 const StringPiece& key,
212 int64* found_int, 214 int64_t* found_int,
213 bool* found) { 215 bool* found) {
214 std::string result; 216 std::string result;
215 leveldb::Status s = db->Get(key, &result, found); 217 leveldb::Status s = db->Get(key, &result, found);
216 if (!s.ok()) 218 if (!s.ok())
217 return s; 219 return s;
218 if (!*found) 220 if (!*found)
219 return leveldb::Status::OK(); 221 return leveldb::Status::OK();
220 StringPiece slice(result); 222 StringPiece slice(result);
221 if (DecodeInt(&slice, found_int) && slice.empty()) 223 if (DecodeInt(&slice, found_int) && slice.empty())
222 return s; 224 return s;
223 return InternalInconsistencyStatus(); 225 return InternalInconsistencyStatus();
224 } 226 }
225 227
226 static void PutInt(LevelDBTransaction* transaction, 228 static void PutInt(LevelDBTransaction* transaction,
227 const StringPiece& key, 229 const StringPiece& key,
228 int64 value) { 230 int64_t value) {
229 DCHECK_GE(value, 0); 231 DCHECK_GE(value, 0);
230 std::string buffer; 232 std::string buffer;
231 EncodeInt(value, &buffer); 233 EncodeInt(value, &buffer);
232 transaction->Put(key, &buffer); 234 transaction->Put(key, &buffer);
233 } 235 }
234 236
235 template <typename DBOrTransaction> 237 template <typename DBOrTransaction>
236 WARN_UNUSED_RESULT static leveldb::Status GetVarInt(DBOrTransaction* db, 238 WARN_UNUSED_RESULT static leveldb::Status GetVarInt(DBOrTransaction* db,
237 const StringPiece& key, 239 const StringPiece& key,
238 int64* found_int, 240 int64_t* found_int,
239 bool* found) { 241 bool* found) {
240 std::string result; 242 std::string result;
241 leveldb::Status s = db->Get(key, &result, found); 243 leveldb::Status s = db->Get(key, &result, found);
242 if (!s.ok()) 244 if (!s.ok())
243 return s; 245 return s;
244 if (!*found) 246 if (!*found)
245 return leveldb::Status::OK(); 247 return leveldb::Status::OK();
246 StringPiece slice(result); 248 StringPiece slice(result);
247 if (DecodeVarInt(&slice, found_int) && slice.empty()) 249 if (DecodeVarInt(&slice, found_int) && slice.empty())
248 return s; 250 return s;
249 return InternalInconsistencyStatus(); 251 return InternalInconsistencyStatus();
250 } 252 }
251 253
252 static void PutVarInt(LevelDBTransaction* transaction, 254 static void PutVarInt(LevelDBTransaction* transaction,
253 const StringPiece& key, 255 const StringPiece& key,
254 int64 value) { 256 int64_t value) {
255 std::string buffer; 257 std::string buffer;
256 EncodeVarInt(value, &buffer); 258 EncodeVarInt(value, &buffer);
257 transaction->Put(key, &buffer); 259 transaction->Put(key, &buffer);
258 } 260 }
259 261
260 template <typename DBOrTransaction> 262 template <typename DBOrTransaction>
261 WARN_UNUSED_RESULT static leveldb::Status GetString( 263 WARN_UNUSED_RESULT static leveldb::Status GetString(
262 DBOrTransaction* db, 264 DBOrTransaction* db,
263 const StringPiece& key, 265 const StringPiece& key,
264 base::string16* found_string, 266 base::string16* found_string,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 } 308 }
307 309
308 const char* IndexedDBBackingStore::Comparator::Name() const { 310 const char* IndexedDBBackingStore::Comparator::Name() const {
309 return "idb_cmp1"; 311 return "idb_cmp1";
310 } 312 }
311 313
312 // 0 - Initial version. 314 // 0 - Initial version.
313 // 1 - Adds UserIntVersion to DatabaseMetaData. 315 // 1 - Adds UserIntVersion to DatabaseMetaData.
314 // 2 - Adds DataVersion to to global metadata. 316 // 2 - Adds DataVersion to to global metadata.
315 // 3 - Adds metadata needed for blob support. 317 // 3 - Adds metadata needed for blob support.
316 static const int64 kLatestKnownSchemaVersion = 3; 318 static const int64_t kLatestKnownSchemaVersion = 3;
317 WARN_UNUSED_RESULT static bool IsSchemaKnown(LevelDBDatabase* db, bool* known) { 319 WARN_UNUSED_RESULT static bool IsSchemaKnown(LevelDBDatabase* db, bool* known) {
318 int64 db_schema_version = 0; 320 int64_t db_schema_version = 0;
319 bool found = false; 321 bool found = false;
320 leveldb::Status s = 322 leveldb::Status s =
321 GetInt(db, SchemaVersionKey::Encode(), &db_schema_version, &found); 323 GetInt(db, SchemaVersionKey::Encode(), &db_schema_version, &found);
322 if (!s.ok()) 324 if (!s.ok())
323 return false; 325 return false;
324 if (!found) { 326 if (!found) {
325 *known = true; 327 *known = true;
326 return true; 328 return true;
327 } 329 }
328 if (db_schema_version < 0) 330 if (db_schema_version < 0)
329 return false; // Only corruption should cause this. 331 return false; // Only corruption should cause this.
330 if (db_schema_version > kLatestKnownSchemaVersion) { 332 if (db_schema_version > kLatestKnownSchemaVersion) {
331 *known = false; 333 *known = false;
332 return true; 334 return true;
333 } 335 }
334 336
335 const uint32 latest_known_data_version = 337 const uint32_t latest_known_data_version =
336 blink::kSerializedScriptValueVersion; 338 blink::kSerializedScriptValueVersion;
337 int64 db_data_version = 0; 339 int64_t db_data_version = 0;
338 s = GetInt(db, DataVersionKey::Encode(), &db_data_version, &found); 340 s = GetInt(db, DataVersionKey::Encode(), &db_data_version, &found);
339 if (!s.ok()) 341 if (!s.ok())
340 return false; 342 return false;
341 if (!found) { 343 if (!found) {
342 *known = true; 344 *known = true;
343 return true; 345 return true;
344 } 346 }
345 if (db_data_version < 0) 347 if (db_data_version < 0)
346 return false; // Only corruption should cause this. 348 return false; // Only corruption should cause this.
347 if (db_data_version > latest_known_data_version) { 349 if (db_data_version > latest_known_data_version) {
348 *known = false; 350 *known = false;
349 return true; 351 return true;
350 } 352 }
351 353
352 *known = true; 354 *known = true;
353 return true; 355 return true;
354 } 356 }
355 357
356 // TODO(ericu): Move this down into the member section of this file. I'm 358 // TODO(ericu): Move this down into the member section of this file. I'm
357 // leaving it here for this CL as it's easier to see the diffs in place. 359 // leaving it here for this CL as it's easier to see the diffs in place.
358 WARN_UNUSED_RESULT leveldb::Status IndexedDBBackingStore::SetUpMetadata() { 360 WARN_UNUSED_RESULT leveldb::Status IndexedDBBackingStore::SetUpMetadata() {
359 const uint32 latest_known_data_version = 361 const uint32_t latest_known_data_version =
360 blink::kSerializedScriptValueVersion; 362 blink::kSerializedScriptValueVersion;
361 const std::string schema_version_key = SchemaVersionKey::Encode(); 363 const std::string schema_version_key = SchemaVersionKey::Encode();
362 const std::string data_version_key = DataVersionKey::Encode(); 364 const std::string data_version_key = DataVersionKey::Encode();
363 365
364 scoped_refptr<LevelDBTransaction> transaction = 366 scoped_refptr<LevelDBTransaction> transaction =
365 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get()); 367 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get());
366 368
367 int64 db_schema_version = 0; 369 int64_t db_schema_version = 0;
368 int64 db_data_version = 0; 370 int64_t db_data_version = 0;
369 bool found = false; 371 bool found = false;
370 leveldb::Status s = 372 leveldb::Status s =
371 GetInt(transaction.get(), schema_version_key, &db_schema_version, &found); 373 GetInt(transaction.get(), schema_version_key, &db_schema_version, &found);
372 if (!s.ok()) { 374 if (!s.ok()) {
373 INTERNAL_READ_ERROR_UNTESTED(SET_UP_METADATA); 375 INTERNAL_READ_ERROR_UNTESTED(SET_UP_METADATA);
374 return s; 376 return s;
375 } 377 }
376 if (!found) { 378 if (!found) {
377 // Initialize new backing store. 379 // Initialize new backing store.
378 db_schema_version = kLatestKnownSchemaVersion; 380 db_schema_version = kLatestKnownSchemaVersion;
(...skipping 13 matching lines...) Expand all
392 db_schema_version = 1; 394 db_schema_version = 1;
393 PutInt(transaction.get(), schema_version_key, db_schema_version); 395 PutInt(transaction.get(), schema_version_key, db_schema_version);
394 const std::string start_key = 396 const std::string start_key =
395 DatabaseNameKey::EncodeMinKeyForOrigin(origin_identifier_); 397 DatabaseNameKey::EncodeMinKeyForOrigin(origin_identifier_);
396 const std::string stop_key = 398 const std::string stop_key =
397 DatabaseNameKey::EncodeStopKeyForOrigin(origin_identifier_); 399 DatabaseNameKey::EncodeStopKeyForOrigin(origin_identifier_);
398 scoped_ptr<LevelDBIterator> it = db_->CreateIterator(); 400 scoped_ptr<LevelDBIterator> it = db_->CreateIterator();
399 for (s = it->Seek(start_key); 401 for (s = it->Seek(start_key);
400 s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0; 402 s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
401 s = it->Next()) { 403 s = it->Next()) {
402 int64 database_id = 0; 404 int64_t database_id = 0;
403 found = false; 405 found = false;
404 s = GetInt(transaction.get(), it->Key(), &database_id, &found); 406 s = GetInt(transaction.get(), it->Key(), &database_id, &found);
405 if (!s.ok()) { 407 if (!s.ok()) {
406 INTERNAL_READ_ERROR_UNTESTED(SET_UP_METADATA); 408 INTERNAL_READ_ERROR_UNTESTED(SET_UP_METADATA);
407 return s; 409 return s;
408 } 410 }
409 if (!found) { 411 if (!found) {
410 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_UP_METADATA); 412 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_UP_METADATA);
411 return InternalInconsistencyStatus(); 413 return InternalInconsistencyStatus();
412 } 414 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 460
459 s = transaction->Commit(); 461 s = transaction->Commit();
460 if (!s.ok()) 462 if (!s.ok())
461 INTERNAL_WRITE_ERROR_UNTESTED(SET_UP_METADATA); 463 INTERNAL_WRITE_ERROR_UNTESTED(SET_UP_METADATA);
462 return s; 464 return s;
463 } 465 }
464 466
465 template <typename DBOrTransaction> 467 template <typename DBOrTransaction>
466 WARN_UNUSED_RESULT static leveldb::Status GetMaxObjectStoreId( 468 WARN_UNUSED_RESULT static leveldb::Status GetMaxObjectStoreId(
467 DBOrTransaction* db, 469 DBOrTransaction* db,
468 int64 database_id, 470 int64_t database_id,
469 int64* max_object_store_id) { 471 int64_t* max_object_store_id) {
470 const std::string max_object_store_id_key = DatabaseMetaDataKey::Encode( 472 const std::string max_object_store_id_key = DatabaseMetaDataKey::Encode(
471 database_id, DatabaseMetaDataKey::MAX_OBJECT_STORE_ID); 473 database_id, DatabaseMetaDataKey::MAX_OBJECT_STORE_ID);
472 return GetMaxObjectStoreId(db, max_object_store_id_key, max_object_store_id); 474 return GetMaxObjectStoreId(db, max_object_store_id_key, max_object_store_id);
473 } 475 }
474 476
475 template <typename DBOrTransaction> 477 template <typename DBOrTransaction>
476 WARN_UNUSED_RESULT static leveldb::Status GetMaxObjectStoreId( 478 WARN_UNUSED_RESULT static leveldb::Status GetMaxObjectStoreId(
477 DBOrTransaction* db, 479 DBOrTransaction* db,
478 const std::string& max_object_store_id_key, 480 const std::string& max_object_store_id_key,
479 int64* max_object_store_id) { 481 int64_t* max_object_store_id) {
480 *max_object_store_id = -1; 482 *max_object_store_id = -1;
481 bool found = false; 483 bool found = false;
482 leveldb::Status s = 484 leveldb::Status s =
483 GetInt(db, max_object_store_id_key, max_object_store_id, &found); 485 GetInt(db, max_object_store_id_key, max_object_store_id, &found);
484 if (!s.ok()) 486 if (!s.ok())
485 return s; 487 return s;
486 if (!found) 488 if (!found)
487 *max_object_store_id = 0; 489 *max_object_store_id = 0;
488 490
489 DCHECK_GE(*max_object_store_id, 0); 491 DCHECK_GE(*max_object_store_id, 0);
(...skipping 12 matching lines...) Expand all
502 leveldb::Status DestroyLevelDB(const base::FilePath& file_name) override { 504 leveldb::Status DestroyLevelDB(const base::FilePath& file_name) override {
503 return LevelDBDatabase::Destroy(file_name); 505 return LevelDBDatabase::Destroy(file_name);
504 } 506 }
505 507
506 private: 508 private:
507 DISALLOW_COPY_AND_ASSIGN(DefaultLevelDBFactory); 509 DISALLOW_COPY_AND_ASSIGN(DefaultLevelDBFactory);
508 }; 510 };
509 511
510 static bool GetBlobKeyGeneratorCurrentNumber( 512 static bool GetBlobKeyGeneratorCurrentNumber(
511 LevelDBTransaction* leveldb_transaction, 513 LevelDBTransaction* leveldb_transaction,
512 int64 database_id, 514 int64_t database_id,
513 int64* blob_key_generator_current_number) { 515 int64_t* blob_key_generator_current_number) {
514 const std::string key_gen_key = DatabaseMetaDataKey::Encode( 516 const std::string key_gen_key = DatabaseMetaDataKey::Encode(
515 database_id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER); 517 database_id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER);
516 518
517 // Default to initial number if not found. 519 // Default to initial number if not found.
518 int64 cur_number = DatabaseMetaDataKey::kBlobKeyGeneratorInitialNumber; 520 int64_t cur_number = DatabaseMetaDataKey::kBlobKeyGeneratorInitialNumber;
519 std::string data; 521 std::string data;
520 522
521 bool found = false; 523 bool found = false;
522 bool ok = leveldb_transaction->Get(key_gen_key, &data, &found).ok(); 524 bool ok = leveldb_transaction->Get(key_gen_key, &data, &found).ok();
523 if (!ok) { 525 if (!ok) {
524 INTERNAL_READ_ERROR_UNTESTED(GET_BLOB_KEY_GENERATOR_CURRENT_NUMBER); 526 INTERNAL_READ_ERROR_UNTESTED(GET_BLOB_KEY_GENERATOR_CURRENT_NUMBER);
525 return false; 527 return false;
526 } 528 }
527 if (found) { 529 if (found) {
528 StringPiece slice(data); 530 StringPiece slice(data);
529 if (!DecodeVarInt(&slice, &cur_number) || !slice.empty() || 531 if (!DecodeVarInt(&slice, &cur_number) || !slice.empty() ||
530 !DatabaseMetaDataKey::IsValidBlobKey(cur_number)) { 532 !DatabaseMetaDataKey::IsValidBlobKey(cur_number)) {
531 INTERNAL_READ_ERROR_UNTESTED(GET_BLOB_KEY_GENERATOR_CURRENT_NUMBER); 533 INTERNAL_READ_ERROR_UNTESTED(GET_BLOB_KEY_GENERATOR_CURRENT_NUMBER);
532 return false; 534 return false;
533 } 535 }
534 } 536 }
535 *blob_key_generator_current_number = cur_number; 537 *blob_key_generator_current_number = cur_number;
536 return true; 538 return true;
537 } 539 }
538 540
539 static bool UpdateBlobKeyGeneratorCurrentNumber( 541 static bool UpdateBlobKeyGeneratorCurrentNumber(
540 LevelDBTransaction* leveldb_transaction, 542 LevelDBTransaction* leveldb_transaction,
541 int64 database_id, 543 int64_t database_id,
542 int64 blob_key_generator_current_number) { 544 int64_t blob_key_generator_current_number) {
543 #ifndef NDEBUG 545 #ifndef NDEBUG
544 int64 old_number; 546 int64_t old_number;
545 if (!GetBlobKeyGeneratorCurrentNumber( 547 if (!GetBlobKeyGeneratorCurrentNumber(
546 leveldb_transaction, database_id, &old_number)) 548 leveldb_transaction, database_id, &old_number))
547 return false; 549 return false;
548 DCHECK_LT(old_number, blob_key_generator_current_number); 550 DCHECK_LT(old_number, blob_key_generator_current_number);
549 #endif 551 #endif
550 DCHECK( 552 DCHECK(
551 DatabaseMetaDataKey::IsValidBlobKey(blob_key_generator_current_number)); 553 DatabaseMetaDataKey::IsValidBlobKey(blob_key_generator_current_number));
552 const std::string key = DatabaseMetaDataKey::Encode( 554 const std::string key = DatabaseMetaDataKey::Encode(
553 database_id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER); 555 database_id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER);
554 556
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 const BlobJournalType& journal) { 664 const BlobJournalType& journal) {
663 return AppendBlobsToBlobJournal(transaction, LiveBlobJournalKey::Encode(), 665 return AppendBlobsToBlobJournal(transaction, LiveBlobJournalKey::Encode(),
664 journal); 666 journal);
665 } 667 }
666 668
667 // Append a database to the specified blob journal via the supplied transaction. 669 // Append a database to the specified blob journal via the supplied transaction.
668 // The key must be either the primary journal key or live journal key. 670 // The key must be either the primary journal key or live journal key.
669 static leveldb::Status MergeDatabaseIntoBlobJournal( 671 static leveldb::Status MergeDatabaseIntoBlobJournal(
670 LevelDBDirectTransaction* transaction, 672 LevelDBDirectTransaction* transaction,
671 const std::string& key, 673 const std::string& key,
672 int64 database_id) { 674 int64_t database_id) {
673 IDB_TRACE("IndexedDBBackingStore::MergeDatabaseIntoBlobJournal"); 675 IDB_TRACE("IndexedDBBackingStore::MergeDatabaseIntoBlobJournal");
674 BlobJournalType journal; 676 BlobJournalType journal;
675 leveldb::Status s = GetBlobJournal(key, transaction, &journal); 677 leveldb::Status s = GetBlobJournal(key, transaction, &journal);
676 if (!s.ok()) 678 if (!s.ok())
677 return s; 679 return s;
678 journal.push_back( 680 journal.push_back(
679 std::make_pair(database_id, DatabaseMetaDataKey::kAllBlobsKey)); 681 std::make_pair(database_id, DatabaseMetaDataKey::kAllBlobsKey));
680 UpdateBlobJournal(transaction, key, journal); 682 UpdateBlobJournal(transaction, key, journal);
681 return leveldb::Status::OK(); 683 return leveldb::Status::OK();
682 } 684 }
683 685
684 static leveldb::Status MergeDatabaseIntoPrimaryBlobJournal( 686 static leveldb::Status MergeDatabaseIntoPrimaryBlobJournal(
685 LevelDBDirectTransaction* leveldb_transaction, 687 LevelDBDirectTransaction* leveldb_transaction,
686 int64 database_id) { 688 int64_t database_id) {
687 return MergeDatabaseIntoBlobJournal(leveldb_transaction, 689 return MergeDatabaseIntoBlobJournal(leveldb_transaction,
688 BlobJournalKey::Encode(), database_id); 690 BlobJournalKey::Encode(), database_id);
689 } 691 }
690 692
691 static leveldb::Status MergeDatabaseIntoLiveBlobJournal( 693 static leveldb::Status MergeDatabaseIntoLiveBlobJournal(
692 LevelDBDirectTransaction* leveldb_transaction, 694 LevelDBDirectTransaction* leveldb_transaction,
693 int64 database_id) { 695 int64_t database_id) {
694 return MergeDatabaseIntoBlobJournal( 696 return MergeDatabaseIntoBlobJournal(
695 leveldb_transaction, LiveBlobJournalKey::Encode(), database_id); 697 leveldb_transaction, LiveBlobJournalKey::Encode(), database_id);
696 } 698 }
697 699
698 // Blob Data is encoded as a series of: 700 // Blob Data is encoded as a series of:
699 // { is_file [bool], key [int64 as varInt], 701 // { is_file [bool], key [int64_t as varInt],
700 // type [string-with-length, may be empty], 702 // type [string-with-length, may be empty],
701 // (for Blobs only) size [int64 as varInt] 703 // (for Blobs only) size [int64_t as varInt]
702 // (for Files only) fileName [string-with-length] 704 // (for Files only) fileName [string-with-length]
703 // } 705 // }
704 // There is no length field; just read until you run out of data. 706 // There is no length field; just read until you run out of data.
705 static std::string EncodeBlobData( 707 static std::string EncodeBlobData(
706 const std::vector<IndexedDBBlobInfo*>& blob_info) { 708 const std::vector<IndexedDBBlobInfo*>& blob_info) {
707 std::string ret; 709 std::string ret;
708 for (const auto* info : blob_info) { 710 for (const auto* info : blob_info) {
709 EncodeBool(info->is_file(), &ret); 711 EncodeBool(info->is_file(), &ret);
710 EncodeVarInt(info->key(), &ret); 712 EncodeVarInt(info->key(), &ret);
711 EncodeStringWithLength(info->type(), &ret); 713 EncodeStringWithLength(info->type(), &ret);
712 if (info->is_file()) 714 if (info->is_file())
713 EncodeStringWithLength(info->file_name(), &ret); 715 EncodeStringWithLength(info->file_name(), &ret);
714 else 716 else
715 EncodeVarInt(info->size(), &ret); 717 EncodeVarInt(info->size(), &ret);
716 } 718 }
717 return ret; 719 return ret;
718 } 720 }
719 721
720 static bool DecodeBlobData(const std::string& data, 722 static bool DecodeBlobData(const std::string& data,
721 std::vector<IndexedDBBlobInfo>* output) { 723 std::vector<IndexedDBBlobInfo>* output) {
722 std::vector<IndexedDBBlobInfo> ret; 724 std::vector<IndexedDBBlobInfo> ret;
723 output->clear(); 725 output->clear();
724 StringPiece slice(data); 726 StringPiece slice(data);
725 while (!slice.empty()) { 727 while (!slice.empty()) {
726 bool is_file; 728 bool is_file;
727 int64 key; 729 int64_t key;
728 base::string16 type; 730 base::string16 type;
729 int64 size; 731 int64_t size;
730 base::string16 file_name; 732 base::string16 file_name;
731 733
732 if (!DecodeBool(&slice, &is_file)) 734 if (!DecodeBool(&slice, &is_file))
733 return false; 735 return false;
734 if (!DecodeVarInt(&slice, &key) || 736 if (!DecodeVarInt(&slice, &key) ||
735 !DatabaseMetaDataKey::IsValidBlobKey(key)) 737 !DatabaseMetaDataKey::IsValidBlobKey(key))
736 return false; 738 return false;
737 if (!DecodeStringWithLength(&slice, &type)) 739 if (!DecodeStringWithLength(&slice, &type))
738 return false; 740 return false;
739 if (is_file) { 741 if (is_file) {
740 if (!DecodeStringWithLength(&slice, &file_name)) 742 if (!DecodeStringWithLength(&slice, &file_name))
741 return false; 743 return false;
742 ret.push_back(IndexedDBBlobInfo(key, type, file_name)); 744 ret.push_back(IndexedDBBlobInfo(key, type, file_name));
743 } else { 745 } else {
744 if (!DecodeVarInt(&slice, &size) || size < 0) 746 if (!DecodeVarInt(&slice, &size) || size < 0)
745 return false; 747 return false;
746 ret.push_back(IndexedDBBlobInfo(type, static_cast<uint64>(size), key)); 748 ret.push_back(IndexedDBBlobInfo(type, static_cast<uint64_t>(size), key));
747 } 749 }
748 } 750 }
749 output->swap(ret); 751 output->swap(ret);
750 752
751 return true; 753 return true;
752 } 754 }
753 755
754 IndexedDBBackingStore::IndexedDBBackingStore( 756 IndexedDBBackingStore::IndexedDBBackingStore(
755 IndexedDBFactory* indexed_db_factory, 757 IndexedDBFactory* indexed_db_factory,
756 const GURL& origin_url, 758 const GURL& origin_url,
(...skipping 23 matching lines...) Expand all
780 } 782 }
781 STLDeleteContainerPairSecondPointers(incognito_blob_map_.begin(), 783 STLDeleteContainerPairSecondPointers(incognito_blob_map_.begin(),
782 incognito_blob_map_.end()); 784 incognito_blob_map_.end());
783 // db_'s destructor uses comparator_. The order of destruction is important. 785 // db_'s destructor uses comparator_. The order of destruction is important.
784 db_.reset(); 786 db_.reset();
785 comparator_.reset(); 787 comparator_.reset();
786 } 788 }
787 789
788 IndexedDBBackingStore::RecordIdentifier::RecordIdentifier( 790 IndexedDBBackingStore::RecordIdentifier::RecordIdentifier(
789 const std::string& primary_key, 791 const std::string& primary_key,
790 int64 version) 792 int64_t version)
791 : primary_key_(primary_key), version_(version) { 793 : primary_key_(primary_key), version_(version) {
792 DCHECK(!primary_key.empty()); 794 DCHECK(!primary_key.empty());
793 } 795 }
794 IndexedDBBackingStore::RecordIdentifier::RecordIdentifier() 796 IndexedDBBackingStore::RecordIdentifier::RecordIdentifier()
795 : primary_key_(), version_(-1) {} 797 : primary_key_(), version_(-1) {}
796 IndexedDBBackingStore::RecordIdentifier::~RecordIdentifier() {} 798 IndexedDBBackingStore::RecordIdentifier::~RecordIdentifier() {}
797 799
798 IndexedDBBackingStore::Cursor::CursorOptions::CursorOptions() {} 800 IndexedDBBackingStore::Cursor::CursorOptions::CursorOptions() {}
799 IndexedDBBackingStore::Cursor::CursorOptions::~CursorOptions() {} 801 IndexedDBBackingStore::Cursor::CursorOptions::~CursorOptions() {}
800 802
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 915
914 bool IndexedDBBackingStore::ReadCorruptionInfo(const base::FilePath& path_base, 916 bool IndexedDBBackingStore::ReadCorruptionInfo(const base::FilePath& path_base,
915 const GURL& origin_url, 917 const GURL& origin_url,
916 std::string* message) { 918 std::string* message) {
917 const base::FilePath info_path = 919 const base::FilePath info_path =
918 path_base.Append(ComputeCorruptionFileName(origin_url)); 920 path_base.Append(ComputeCorruptionFileName(origin_url));
919 921
920 if (IsPathTooLong(info_path)) 922 if (IsPathTooLong(info_path))
921 return false; 923 return false;
922 924
923 const int64 max_json_len = 4096; 925 const int64_t max_json_len = 4096;
924 int64 file_size(0); 926 int64_t file_size(0);
925 if (!GetFileSize(info_path, &file_size) || file_size > max_json_len) 927 if (!GetFileSize(info_path, &file_size) || file_size > max_json_len)
926 return false; 928 return false;
927 if (!file_size) { 929 if (!file_size) {
928 NOTREACHED(); 930 NOTREACHED();
929 return false; 931 return false;
930 } 932 }
931 933
932 base::File file(info_path, base::File::FLAG_OPEN | base::File::FLAG_READ); 934 base::File file(info_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
933 bool success = false; 935 bool success = false;
934 if (file.IsValid()) { 936 if (file.IsValid()) {
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 // Decode database name (in iterator key). 1218 // Decode database name (in iterator key).
1217 StringPiece slice(it->Key()); 1219 StringPiece slice(it->Key());
1218 DatabaseNameKey database_name_key; 1220 DatabaseNameKey database_name_key;
1219 if (!DatabaseNameKey::Decode(&slice, &database_name_key) || 1221 if (!DatabaseNameKey::Decode(&slice, &database_name_key) ||
1220 !slice.empty()) { 1222 !slice.empty()) {
1221 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_DATABASE_NAMES); 1223 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_DATABASE_NAMES);
1222 continue; 1224 continue;
1223 } 1225 }
1224 1226
1225 // Decode database id (in iterator value). 1227 // Decode database id (in iterator value).
1226 int64 database_id = 0; 1228 int64_t database_id = 0;
1227 StringPiece value_slice(it->Value()); 1229 StringPiece value_slice(it->Value());
1228 if (!DecodeInt(&value_slice, &database_id) || !value_slice.empty()) { 1230 if (!DecodeInt(&value_slice, &database_id) || !value_slice.empty()) {
1229 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_DATABASE_NAMES); 1231 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_DATABASE_NAMES);
1230 continue; 1232 continue;
1231 } 1233 }
1232 1234
1233 // Look up version by id. 1235 // Look up version by id.
1234 bool found = false; 1236 bool found = false;
1235 int64 database_version = IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION; 1237 int64_t database_version = IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION;
1236 *s = GetVarInt(db_.get(), 1238 *s = GetVarInt(db_.get(),
1237 DatabaseMetaDataKey::Encode( 1239 DatabaseMetaDataKey::Encode(
1238 database_id, DatabaseMetaDataKey::USER_INT_VERSION), 1240 database_id, DatabaseMetaDataKey::USER_INT_VERSION),
1239 &database_version, 1241 &database_version,
1240 &found); 1242 &found);
1241 if (!s->ok() || !found) { 1243 if (!s->ok() || !found) {
1242 INTERNAL_READ_ERROR_UNTESTED(GET_DATABASE_NAMES); 1244 INTERNAL_READ_ERROR_UNTESTED(GET_DATABASE_NAMES);
1243 continue; 1245 continue;
1244 } 1246 }
1245 1247
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 if (metadata->int_version == IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION) 1302 if (metadata->int_version == IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION)
1301 metadata->int_version = IndexedDBDatabaseMetadata::NO_INT_VERSION; 1303 metadata->int_version = IndexedDBDatabaseMetadata::NO_INT_VERSION;
1302 1304
1303 s = GetMaxObjectStoreId( 1305 s = GetMaxObjectStoreId(
1304 db_.get(), metadata->id, &metadata->max_object_store_id); 1306 db_.get(), metadata->id, &metadata->max_object_store_id);
1305 if (!s.ok()) { 1307 if (!s.ok()) {
1306 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); 1308 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA);
1307 } 1309 }
1308 1310
1309 // We don't cache this, we just check it if it's there. 1311 // We don't cache this, we just check it if it's there.
1310 int64 blob_key_generator_current_number = 1312 int64_t blob_key_generator_current_number =
1311 DatabaseMetaDataKey::kInvalidBlobKey; 1313 DatabaseMetaDataKey::kInvalidBlobKey;
1312 1314
1313 s = GetVarInt( 1315 s = GetVarInt(
1314 db_.get(), 1316 db_.get(),
1315 DatabaseMetaDataKey::Encode( 1317 DatabaseMetaDataKey::Encode(
1316 metadata->id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER), 1318 metadata->id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER),
1317 &blob_key_generator_current_number, 1319 &blob_key_generator_current_number,
1318 found); 1320 found);
1319 if (!s.ok()) { 1321 if (!s.ok()) {
1320 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); 1322 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA);
1321 return s; 1323 return s;
1322 } 1324 }
1323 if (!*found) { 1325 if (!*found) {
1324 // This database predates blob support. 1326 // This database predates blob support.
1325 *found = true; 1327 *found = true;
1326 } else if (!DatabaseMetaDataKey::IsValidBlobKey( 1328 } else if (!DatabaseMetaDataKey::IsValidBlobKey(
1327 blob_key_generator_current_number)) { 1329 blob_key_generator_current_number)) {
1328 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); 1330 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_IDBDATABASE_METADATA);
1329 return InternalInconsistencyStatus(); 1331 return InternalInconsistencyStatus();
1330 } 1332 }
1331 1333
1332 return s; 1334 return s;
1333 } 1335 }
1334 1336
1335 WARN_UNUSED_RESULT static leveldb::Status GetNewDatabaseId( 1337 WARN_UNUSED_RESULT static leveldb::Status GetNewDatabaseId(
1336 LevelDBTransaction* transaction, 1338 LevelDBTransaction* transaction,
1337 int64* new_id) { 1339 int64_t* new_id) {
1338 *new_id = -1; 1340 *new_id = -1;
1339 int64 max_database_id = -1; 1341 int64_t max_database_id = -1;
1340 bool found = false; 1342 bool found = false;
1341 leveldb::Status s = 1343 leveldb::Status s =
1342 GetInt(transaction, MaxDatabaseIdKey::Encode(), &max_database_id, &found); 1344 GetInt(transaction, MaxDatabaseIdKey::Encode(), &max_database_id, &found);
1343 if (!s.ok()) { 1345 if (!s.ok()) {
1344 INTERNAL_READ_ERROR_UNTESTED(GET_NEW_DATABASE_ID); 1346 INTERNAL_READ_ERROR_UNTESTED(GET_NEW_DATABASE_ID);
1345 return s; 1347 return s;
1346 } 1348 }
1347 if (!found) 1349 if (!found)
1348 max_database_id = 0; 1350 max_database_id = 0;
1349 1351
1350 DCHECK_GE(max_database_id, 0); 1352 DCHECK_GE(max_database_id, 0);
1351 1353
1352 int64 database_id = max_database_id + 1; 1354 int64_t database_id = max_database_id + 1;
1353 PutInt(transaction, MaxDatabaseIdKey::Encode(), database_id); 1355 PutInt(transaction, MaxDatabaseIdKey::Encode(), database_id);
1354 *new_id = database_id; 1356 *new_id = database_id;
1355 return leveldb::Status::OK(); 1357 return leveldb::Status::OK();
1356 } 1358 }
1357 1359
1358 leveldb::Status IndexedDBBackingStore::CreateIDBDatabaseMetaData( 1360 leveldb::Status IndexedDBBackingStore::CreateIDBDatabaseMetaData(
1359 const base::string16& name, 1361 const base::string16& name,
1360 const base::string16& version, 1362 const base::string16& version,
1361 int64 int_version, 1363 int64_t int_version,
1362 int64* row_id) { 1364 int64_t* row_id) {
1363 // TODO(jsbell): Don't persist metadata if open fails. http://crbug.com/395472 1365 // TODO(jsbell): Don't persist metadata if open fails. http://crbug.com/395472
1364 scoped_refptr<LevelDBTransaction> transaction = 1366 scoped_refptr<LevelDBTransaction> transaction =
1365 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get()); 1367 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get());
1366 1368
1367 leveldb::Status s = GetNewDatabaseId(transaction.get(), row_id); 1369 leveldb::Status s = GetNewDatabaseId(transaction.get(), row_id);
1368 if (!s.ok()) 1370 if (!s.ok())
1369 return s; 1371 return s;
1370 DCHECK_GE(*row_id, 0); 1372 DCHECK_GE(*row_id, 0);
1371 1373
1372 if (int_version == IndexedDBDatabaseMetadata::NO_INT_VERSION) 1374 if (int_version == IndexedDBDatabaseMetadata::NO_INT_VERSION)
(...skipping 17 matching lines...) Expand all
1390 DatabaseMetaDataKey::kBlobKeyGeneratorInitialNumber); 1392 DatabaseMetaDataKey::kBlobKeyGeneratorInitialNumber);
1391 1393
1392 s = transaction->Commit(); 1394 s = transaction->Commit();
1393 if (!s.ok()) 1395 if (!s.ok())
1394 INTERNAL_WRITE_ERROR_UNTESTED(CREATE_IDBDATABASE_METADATA); 1396 INTERNAL_WRITE_ERROR_UNTESTED(CREATE_IDBDATABASE_METADATA);
1395 return s; 1397 return s;
1396 } 1398 }
1397 1399
1398 bool IndexedDBBackingStore::UpdateIDBDatabaseIntVersion( 1400 bool IndexedDBBackingStore::UpdateIDBDatabaseIntVersion(
1399 IndexedDBBackingStore::Transaction* transaction, 1401 IndexedDBBackingStore::Transaction* transaction,
1400 int64 row_id, 1402 int64_t row_id,
1401 int64 int_version) { 1403 int64_t int_version) {
1402 if (int_version == IndexedDBDatabaseMetadata::NO_INT_VERSION) 1404 if (int_version == IndexedDBDatabaseMetadata::NO_INT_VERSION)
1403 int_version = IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION; 1405 int_version = IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION;
1404 DCHECK_GE(int_version, 0) << "int_version was " << int_version; 1406 DCHECK_GE(int_version, 0) << "int_version was " << int_version;
1405 PutVarInt(transaction->transaction(), 1407 PutVarInt(transaction->transaction(),
1406 DatabaseMetaDataKey::Encode(row_id, 1408 DatabaseMetaDataKey::Encode(row_id,
1407 DatabaseMetaDataKey::USER_INT_VERSION), 1409 DatabaseMetaDataKey::USER_INT_VERSION),
1408 int_version); 1410 int_version);
1409 return true; 1411 return true;
1410 } 1412 }
1411 1413
1412 // If you're deleting a range that contains user keys that have blob info, this 1414 // If you're deleting a range that contains user keys that have blob info, this
1413 // won't clean up the blobs. 1415 // won't clean up the blobs.
1414 static leveldb::Status DeleteRangeBasic(LevelDBTransaction* transaction, 1416 static leveldb::Status DeleteRangeBasic(LevelDBTransaction* transaction,
1415 const std::string& begin, 1417 const std::string& begin,
1416 const std::string& end, 1418 const std::string& end,
1417 bool upper_open) { 1419 bool upper_open) {
1418 scoped_ptr<LevelDBIterator> it = transaction->CreateIterator(); 1420 scoped_ptr<LevelDBIterator> it = transaction->CreateIterator();
1419 leveldb::Status s; 1421 leveldb::Status s;
1420 for (s = it->Seek(begin); s.ok() && it->IsValid() && 1422 for (s = it->Seek(begin); s.ok() && it->IsValid() &&
1421 (upper_open ? CompareKeys(it->Key(), end) < 0 1423 (upper_open ? CompareKeys(it->Key(), end) < 0
1422 : CompareKeys(it->Key(), end) <= 0); 1424 : CompareKeys(it->Key(), end) <= 0);
1423 s = it->Next()) 1425 s = it->Next())
1424 transaction->Remove(it->Key()); 1426 transaction->Remove(it->Key());
1425 return s; 1427 return s;
1426 } 1428 }
1427 1429
1428 static leveldb::Status DeleteBlobsInRange( 1430 static leveldb::Status DeleteBlobsInRange(
1429 IndexedDBBackingStore::Transaction* transaction, 1431 IndexedDBBackingStore::Transaction* transaction,
1430 int64 database_id, 1432 int64_t database_id,
1431 int64 object_store_id, 1433 int64_t object_store_id,
1432 const std::string& start_key, 1434 const std::string& start_key,
1433 const std::string& end_key, 1435 const std::string& end_key,
1434 bool upper_open) { 1436 bool upper_open) {
1435 scoped_ptr<LevelDBIterator> it = transaction->transaction()->CreateIterator(); 1437 scoped_ptr<LevelDBIterator> it = transaction->transaction()->CreateIterator();
1436 leveldb::Status s = it->Seek(start_key); 1438 leveldb::Status s = it->Seek(start_key);
1437 for (; s.ok() && it->IsValid() && 1439 for (; s.ok() && it->IsValid() &&
1438 (upper_open ? CompareKeys(it->Key(), end_key) < 0 1440 (upper_open ? CompareKeys(it->Key(), end_key) < 0
1439 : CompareKeys(it->Key(), end_key) <= 0); 1441 : CompareKeys(it->Key(), end_key) <= 0);
1440 s = it->Next()) { 1442 s = it->Next()) {
1441 StringPiece key_piece(it->Key()); 1443 StringPiece key_piece(it->Key());
1442 std::string user_key = 1444 std::string user_key =
1443 BlobEntryKey::ReencodeToObjectStoreDataKey(&key_piece); 1445 BlobEntryKey::ReencodeToObjectStoreDataKey(&key_piece);
1444 if (!user_key.size()) { 1446 if (!user_key.size()) {
1445 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); 1447 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_IDBDATABASE_METADATA);
1446 return InternalInconsistencyStatus(); 1448 return InternalInconsistencyStatus();
1447 } 1449 }
1448 transaction->PutBlobInfo( 1450 transaction->PutBlobInfo(
1449 database_id, object_store_id, user_key, NULL, NULL); 1451 database_id, object_store_id, user_key, NULL, NULL);
1450 } 1452 }
1451 return s; 1453 return s;
1452 } 1454 }
1453 1455
1454 static leveldb::Status DeleteBlobsInObjectStore( 1456 static leveldb::Status DeleteBlobsInObjectStore(
1455 IndexedDBBackingStore::Transaction* transaction, 1457 IndexedDBBackingStore::Transaction* transaction,
1456 int64 database_id, 1458 int64_t database_id,
1457 int64 object_store_id) { 1459 int64_t object_store_id) {
1458 std::string start_key, stop_key; 1460 std::string start_key, stop_key;
1459 start_key = 1461 start_key =
1460 BlobEntryKey::EncodeMinKeyForObjectStore(database_id, object_store_id); 1462 BlobEntryKey::EncodeMinKeyForObjectStore(database_id, object_store_id);
1461 stop_key = 1463 stop_key =
1462 BlobEntryKey::EncodeStopKeyForObjectStore(database_id, object_store_id); 1464 BlobEntryKey::EncodeStopKeyForObjectStore(database_id, object_store_id);
1463 return DeleteBlobsInRange( 1465 return DeleteBlobsInRange(
1464 transaction, database_id, object_store_id, start_key, stop_key, true); 1466 transaction, database_id, object_store_id, start_key, stop_key, true);
1465 } 1467 }
1466 1468
1467 leveldb::Status IndexedDBBackingStore::DeleteDatabase( 1469 leveldb::Status IndexedDBBackingStore::DeleteDatabase(
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1523 // the journal until completion. 1525 // the journal until completion.
1524 if (need_cleanup) 1526 if (need_cleanup)
1525 CleanPrimaryJournalIgnoreReturn(); 1527 CleanPrimaryJournalIgnoreReturn();
1526 1528
1527 db_->Compact(start_key, stop_key); 1529 db_->Compact(start_key, stop_key);
1528 return s; 1530 return s;
1529 } 1531 }
1530 1532
1531 static bool CheckObjectStoreAndMetaDataType(const LevelDBIterator* it, 1533 static bool CheckObjectStoreAndMetaDataType(const LevelDBIterator* it,
1532 const std::string& stop_key, 1534 const std::string& stop_key,
1533 int64 object_store_id, 1535 int64_t object_store_id,
1534 int64 meta_data_type) { 1536 int64_t meta_data_type) {
1535 if (!it->IsValid() || CompareKeys(it->Key(), stop_key) >= 0) 1537 if (!it->IsValid() || CompareKeys(it->Key(), stop_key) >= 0)
1536 return false; 1538 return false;
1537 1539
1538 StringPiece slice(it->Key()); 1540 StringPiece slice(it->Key());
1539 ObjectStoreMetaDataKey meta_data_key; 1541 ObjectStoreMetaDataKey meta_data_key;
1540 bool ok = 1542 bool ok =
1541 ObjectStoreMetaDataKey::Decode(&slice, &meta_data_key) && slice.empty(); 1543 ObjectStoreMetaDataKey::Decode(&slice, &meta_data_key) && slice.empty();
1542 DCHECK(ok); 1544 DCHECK(ok);
1543 if (meta_data_key.ObjectStoreId() != object_store_id) 1545 if (meta_data_key.ObjectStoreId() != object_store_id)
1544 return false; 1546 return false;
1545 if (meta_data_key.MetaDataType() != meta_data_type) 1547 if (meta_data_key.MetaDataType() != meta_data_type)
1546 return false; 1548 return false;
1547 return ok; 1549 return ok;
1548 } 1550 }
1549 1551
1550 // TODO(jsbell): This should do some error handling rather than 1552 // TODO(jsbell): This should do some error handling rather than
1551 // plowing ahead when bad data is encountered. 1553 // plowing ahead when bad data is encountered.
1552 leveldb::Status IndexedDBBackingStore::GetObjectStores( 1554 leveldb::Status IndexedDBBackingStore::GetObjectStores(
1553 int64 database_id, 1555 int64_t database_id,
1554 IndexedDBDatabaseMetadata::ObjectStoreMap* object_stores) { 1556 IndexedDBDatabaseMetadata::ObjectStoreMap* object_stores) {
1555 IDB_TRACE("IndexedDBBackingStore::GetObjectStores"); 1557 IDB_TRACE("IndexedDBBackingStore::GetObjectStores");
1556 if (!KeyPrefix::IsValidDatabaseId(database_id)) 1558 if (!KeyPrefix::IsValidDatabaseId(database_id))
1557 return InvalidDBKeyStatus(); 1559 return InvalidDBKeyStatus();
1558 const std::string start_key = 1560 const std::string start_key =
1559 ObjectStoreMetaDataKey::Encode(database_id, 1, 0); 1561 ObjectStoreMetaDataKey::Encode(database_id, 1, 0);
1560 const std::string stop_key = 1562 const std::string stop_key =
1561 ObjectStoreMetaDataKey::EncodeMaxKey(database_id); 1563 ObjectStoreMetaDataKey::EncodeMaxKey(database_id);
1562 1564
1563 DCHECK(object_stores->empty()); 1565 DCHECK(object_stores->empty());
1564 1566
1565 scoped_ptr<LevelDBIterator> it = db_->CreateIterator(); 1567 scoped_ptr<LevelDBIterator> it = db_->CreateIterator();
1566 leveldb::Status s = it->Seek(start_key); 1568 leveldb::Status s = it->Seek(start_key);
1567 while (s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0) { 1569 while (s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0) {
1568 StringPiece slice(it->Key()); 1570 StringPiece slice(it->Key());
1569 ObjectStoreMetaDataKey meta_data_key; 1571 ObjectStoreMetaDataKey meta_data_key;
1570 bool ok = 1572 bool ok =
1571 ObjectStoreMetaDataKey::Decode(&slice, &meta_data_key) && slice.empty(); 1573 ObjectStoreMetaDataKey::Decode(&slice, &meta_data_key) && slice.empty();
1572 DCHECK(ok); 1574 DCHECK(ok);
1573 if (!ok || meta_data_key.MetaDataType() != ObjectStoreMetaDataKey::NAME) { 1575 if (!ok || meta_data_key.MetaDataType() != ObjectStoreMetaDataKey::NAME) {
1574 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES); 1576 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
1575 // Possible stale metadata, but don't fail the load. 1577 // Possible stale metadata, but don't fail the load.
1576 s = it->Next(); 1578 s = it->Next();
1577 if (!s.ok()) 1579 if (!s.ok())
1578 break; 1580 break;
1579 continue; 1581 continue;
1580 } 1582 }
1581 1583
1582 int64 object_store_id = meta_data_key.ObjectStoreId(); 1584 int64_t object_store_id = meta_data_key.ObjectStoreId();
1583 1585
1584 // TODO(jsbell): Do this by direct key lookup rather than iteration, to 1586 // TODO(jsbell): Do this by direct key lookup rather than iteration, to
1585 // simplify. 1587 // simplify.
1586 base::string16 object_store_name; 1588 base::string16 object_store_name;
1587 { 1589 {
1588 StringPiece slice(it->Value()); 1590 StringPiece slice(it->Value());
1589 if (!DecodeString(&slice, &object_store_name) || !slice.empty()) 1591 if (!DecodeString(&slice, &object_store_name) || !slice.empty())
1590 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES); 1592 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
1591 } 1593 }
1592 1594
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1652 if (!s.ok()) 1654 if (!s.ok())
1653 break; 1655 break;
1654 if (!CheckObjectStoreAndMetaDataType( 1656 if (!CheckObjectStoreAndMetaDataType(
1655 it.get(), 1657 it.get(),
1656 stop_key, 1658 stop_key,
1657 object_store_id, 1659 object_store_id,
1658 ObjectStoreMetaDataKey::MAX_INDEX_ID)) { 1660 ObjectStoreMetaDataKey::MAX_INDEX_ID)) {
1659 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES); 1661 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
1660 break; 1662 break;
1661 } 1663 }
1662 int64 max_index_id; 1664 int64_t max_index_id;
1663 { 1665 {
1664 StringPiece slice(it->Value()); 1666 StringPiece slice(it->Value());
1665 if (!DecodeInt(&slice, &max_index_id) || !slice.empty()) 1667 if (!DecodeInt(&slice, &max_index_id) || !slice.empty())
1666 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES); 1668 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
1667 } 1669 }
1668 1670
1669 s = it->Next(); // [optional] has key path (is not null) 1671 s = it->Next(); // [optional] has key path (is not null)
1670 if (!s.ok()) 1672 if (!s.ok())
1671 break; 1673 break;
1672 if (CheckObjectStoreAndMetaDataType(it.get(), 1674 if (CheckObjectStoreAndMetaDataType(it.get(),
(...skipping 16 matching lines...) Expand all
1689 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES); 1691 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
1690 break; 1692 break;
1691 } 1693 }
1692 if (!has_key_path) 1694 if (!has_key_path)
1693 key_path = IndexedDBKeyPath(); 1695 key_path = IndexedDBKeyPath();
1694 s = it->Next(); 1696 s = it->Next();
1695 if (!s.ok()) 1697 if (!s.ok())
1696 break; 1698 break;
1697 } 1699 }
1698 1700
1699 int64 key_generator_current_number = -1; 1701 int64_t key_generator_current_number = -1;
1700 if (CheckObjectStoreAndMetaDataType( 1702 if (CheckObjectStoreAndMetaDataType(
1701 it.get(), 1703 it.get(),
1702 stop_key, 1704 stop_key,
1703 object_store_id, 1705 object_store_id,
1704 ObjectStoreMetaDataKey::KEY_GENERATOR_CURRENT_NUMBER)) { 1706 ObjectStoreMetaDataKey::KEY_GENERATOR_CURRENT_NUMBER)) {
1705 StringPiece slice(it->Value()); 1707 StringPiece slice(it->Value());
1706 if (!DecodeInt(&slice, &key_generator_current_number) || !slice.empty()) 1708 if (!DecodeInt(&slice, &key_generator_current_number) || !slice.empty())
1707 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES); 1709 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
1708 1710
1709 // TODO(jsbell): Return key_generator_current_number, cache in 1711 // TODO(jsbell): Return key_generator_current_number, cache in
(...skipping 17 matching lines...) Expand all
1727 } 1729 }
1728 1730
1729 if (!s.ok()) 1731 if (!s.ok())
1730 INTERNAL_READ_ERROR_UNTESTED(GET_OBJECT_STORES); 1732 INTERNAL_READ_ERROR_UNTESTED(GET_OBJECT_STORES);
1731 1733
1732 return s; 1734 return s;
1733 } 1735 }
1734 1736
1735 WARN_UNUSED_RESULT static leveldb::Status SetMaxObjectStoreId( 1737 WARN_UNUSED_RESULT static leveldb::Status SetMaxObjectStoreId(
1736 LevelDBTransaction* transaction, 1738 LevelDBTransaction* transaction,
1737 int64 database_id, 1739 int64_t database_id,
1738 int64 object_store_id) { 1740 int64_t object_store_id) {
1739 const std::string max_object_store_id_key = DatabaseMetaDataKey::Encode( 1741 const std::string max_object_store_id_key = DatabaseMetaDataKey::Encode(
1740 database_id, DatabaseMetaDataKey::MAX_OBJECT_STORE_ID); 1742 database_id, DatabaseMetaDataKey::MAX_OBJECT_STORE_ID);
1741 int64 max_object_store_id = -1; 1743 int64_t max_object_store_id = -1;
1742 leveldb::Status s = GetMaxObjectStoreId( 1744 leveldb::Status s = GetMaxObjectStoreId(
1743 transaction, max_object_store_id_key, &max_object_store_id); 1745 transaction, max_object_store_id_key, &max_object_store_id);
1744 if (!s.ok()) { 1746 if (!s.ok()) {
1745 INTERNAL_READ_ERROR_UNTESTED(SET_MAX_OBJECT_STORE_ID); 1747 INTERNAL_READ_ERROR_UNTESTED(SET_MAX_OBJECT_STORE_ID);
1746 return s; 1748 return s;
1747 } 1749 }
1748 1750
1749 if (object_store_id <= max_object_store_id) { 1751 if (object_store_id <= max_object_store_id) {
1750 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_MAX_OBJECT_STORE_ID); 1752 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_MAX_OBJECT_STORE_ID);
1751 return InternalInconsistencyStatus(); 1753 return InternalInconsistencyStatus();
1752 } 1754 }
1753 PutInt(transaction, max_object_store_id_key, object_store_id); 1755 PutInt(transaction, max_object_store_id_key, object_store_id);
1754 return s; 1756 return s;
1755 } 1757 }
1756 1758
1757 void IndexedDBBackingStore::Compact() { db_->CompactAll(); } 1759 void IndexedDBBackingStore::Compact() { db_->CompactAll(); }
1758 1760
1759 leveldb::Status IndexedDBBackingStore::CreateObjectStore( 1761 leveldb::Status IndexedDBBackingStore::CreateObjectStore(
1760 IndexedDBBackingStore::Transaction* transaction, 1762 IndexedDBBackingStore::Transaction* transaction,
1761 int64 database_id, 1763 int64_t database_id,
1762 int64 object_store_id, 1764 int64_t object_store_id,
1763 const base::string16& name, 1765 const base::string16& name,
1764 const IndexedDBKeyPath& key_path, 1766 const IndexedDBKeyPath& key_path,
1765 bool auto_increment) { 1767 bool auto_increment) {
1766 IDB_TRACE("IndexedDBBackingStore::CreateObjectStore"); 1768 IDB_TRACE("IndexedDBBackingStore::CreateObjectStore");
1767 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 1769 if (!KeyPrefix::ValidIds(database_id, object_store_id))
1768 return InvalidDBKeyStatus(); 1770 return InvalidDBKeyStatus();
1769 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 1771 LevelDBTransaction* leveldb_transaction = transaction->transaction();
1770 leveldb::Status s = 1772 leveldb::Status s =
1771 SetMaxObjectStoreId(leveldb_transaction, database_id, object_store_id); 1773 SetMaxObjectStoreId(leveldb_transaction, database_id, object_store_id);
1772 if (!s.ok()) 1774 if (!s.ok())
(...skipping 29 matching lines...) Expand all
1802 PutBool(leveldb_transaction, has_key_path_key, !key_path.IsNull()); 1804 PutBool(leveldb_transaction, has_key_path_key, !key_path.IsNull());
1803 PutInt(leveldb_transaction, 1805 PutInt(leveldb_transaction,
1804 key_generator_current_number_key, 1806 key_generator_current_number_key,
1805 kKeyGeneratorInitialNumber); 1807 kKeyGeneratorInitialNumber);
1806 PutInt(leveldb_transaction, names_key, object_store_id); 1808 PutInt(leveldb_transaction, names_key, object_store_id);
1807 return s; 1809 return s;
1808 } 1810 }
1809 1811
1810 leveldb::Status IndexedDBBackingStore::DeleteObjectStore( 1812 leveldb::Status IndexedDBBackingStore::DeleteObjectStore(
1811 IndexedDBBackingStore::Transaction* transaction, 1813 IndexedDBBackingStore::Transaction* transaction,
1812 int64 database_id, 1814 int64_t database_id,
1813 int64 object_store_id) { 1815 int64_t object_store_id) {
1814 IDB_TRACE("IndexedDBBackingStore::DeleteObjectStore"); 1816 IDB_TRACE("IndexedDBBackingStore::DeleteObjectStore");
1815 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 1817 if (!KeyPrefix::ValidIds(database_id, object_store_id))
1816 return InvalidDBKeyStatus(); 1818 return InvalidDBKeyStatus();
1817 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 1819 LevelDBTransaction* leveldb_transaction = transaction->transaction();
1818 1820
1819 base::string16 object_store_name; 1821 base::string16 object_store_name;
1820 bool found = false; 1822 bool found = false;
1821 leveldb::Status s = 1823 leveldb::Status s =
1822 GetString(leveldb_transaction, 1824 GetString(leveldb_transaction,
1823 ObjectStoreMetaDataKey::Encode( 1825 ObjectStoreMetaDataKey::Encode(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1867 if (!s.ok()) { 1869 if (!s.ok()) {
1868 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_OBJECT_STORE); 1870 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_OBJECT_STORE);
1869 return s; 1871 return s;
1870 } 1872 }
1871 1873
1872 return ClearObjectStore(transaction, database_id, object_store_id); 1874 return ClearObjectStore(transaction, database_id, object_store_id);
1873 } 1875 }
1874 1876
1875 leveldb::Status IndexedDBBackingStore::GetRecord( 1877 leveldb::Status IndexedDBBackingStore::GetRecord(
1876 IndexedDBBackingStore::Transaction* transaction, 1878 IndexedDBBackingStore::Transaction* transaction,
1877 int64 database_id, 1879 int64_t database_id,
1878 int64 object_store_id, 1880 int64_t object_store_id,
1879 const IndexedDBKey& key, 1881 const IndexedDBKey& key,
1880 IndexedDBValue* record) { 1882 IndexedDBValue* record) {
1881 IDB_TRACE("IndexedDBBackingStore::GetRecord"); 1883 IDB_TRACE("IndexedDBBackingStore::GetRecord");
1882 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 1884 if (!KeyPrefix::ValidIds(database_id, object_store_id))
1883 return InvalidDBKeyStatus(); 1885 return InvalidDBKeyStatus();
1884 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 1886 LevelDBTransaction* leveldb_transaction = transaction->transaction();
1885 1887
1886 const std::string leveldb_key = 1888 const std::string leveldb_key =
1887 ObjectStoreDataKey::Encode(database_id, object_store_id, key); 1889 ObjectStoreDataKey::Encode(database_id, object_store_id, key);
1888 std::string data; 1890 std::string data;
1889 1891
1890 record->clear(); 1892 record->clear();
1891 1893
1892 bool found = false; 1894 bool found = false;
1893 leveldb::Status s = leveldb_transaction->Get(leveldb_key, &data, &found); 1895 leveldb::Status s = leveldb_transaction->Get(leveldb_key, &data, &found);
1894 if (!s.ok()) { 1896 if (!s.ok()) {
1895 INTERNAL_READ_ERROR(GET_RECORD); 1897 INTERNAL_READ_ERROR(GET_RECORD);
1896 return s; 1898 return s;
1897 } 1899 }
1898 if (!found) 1900 if (!found)
1899 return s; 1901 return s;
1900 if (data.empty()) { 1902 if (data.empty()) {
1901 INTERNAL_READ_ERROR_UNTESTED(GET_RECORD); 1903 INTERNAL_READ_ERROR_UNTESTED(GET_RECORD);
1902 return leveldb::Status::NotFound("Record contained no data"); 1904 return leveldb::Status::NotFound("Record contained no data");
1903 } 1905 }
1904 1906
1905 int64 version; 1907 int64_t version;
1906 StringPiece slice(data); 1908 StringPiece slice(data);
1907 if (!DecodeVarInt(&slice, &version)) { 1909 if (!DecodeVarInt(&slice, &version)) {
1908 INTERNAL_READ_ERROR_UNTESTED(GET_RECORD); 1910 INTERNAL_READ_ERROR_UNTESTED(GET_RECORD);
1909 return InternalInconsistencyStatus(); 1911 return InternalInconsistencyStatus();
1910 } 1912 }
1911 1913
1912 record->bits = slice.as_string(); 1914 record->bits = slice.as_string();
1913 return transaction->GetBlobInfoForRecord(database_id, leveldb_key, record); 1915 return transaction->GetBlobInfoForRecord(database_id, leveldb_key, record);
1914 } 1916 }
1915 1917
1916 WARN_UNUSED_RESULT static leveldb::Status GetNewVersionNumber( 1918 WARN_UNUSED_RESULT static leveldb::Status GetNewVersionNumber(
1917 LevelDBTransaction* transaction, 1919 LevelDBTransaction* transaction,
1918 int64 database_id, 1920 int64_t database_id,
1919 int64 object_store_id, 1921 int64_t object_store_id,
1920 int64* new_version_number) { 1922 int64_t* new_version_number) {
1921 const std::string last_version_key = ObjectStoreMetaDataKey::Encode( 1923 const std::string last_version_key = ObjectStoreMetaDataKey::Encode(
1922 database_id, object_store_id, ObjectStoreMetaDataKey::LAST_VERSION); 1924 database_id, object_store_id, ObjectStoreMetaDataKey::LAST_VERSION);
1923 1925
1924 *new_version_number = -1; 1926 *new_version_number = -1;
1925 int64 last_version = -1; 1927 int64_t last_version = -1;
1926 bool found = false; 1928 bool found = false;
1927 leveldb::Status s = 1929 leveldb::Status s =
1928 GetInt(transaction, last_version_key, &last_version, &found); 1930 GetInt(transaction, last_version_key, &last_version, &found);
1929 if (!s.ok()) { 1931 if (!s.ok()) {
1930 INTERNAL_READ_ERROR_UNTESTED(GET_NEW_VERSION_NUMBER); 1932 INTERNAL_READ_ERROR_UNTESTED(GET_NEW_VERSION_NUMBER);
1931 return s; 1933 return s;
1932 } 1934 }
1933 if (!found) 1935 if (!found)
1934 last_version = 0; 1936 last_version = 0;
1935 1937
1936 DCHECK_GE(last_version, 0); 1938 DCHECK_GE(last_version, 0);
1937 1939
1938 int64 version = last_version + 1; 1940 int64_t version = last_version + 1;
1939 PutInt(transaction, last_version_key, version); 1941 PutInt(transaction, last_version_key, version);
1940 1942
1941 // TODO(jsbell): Think about how we want to handle the overflow scenario. 1943 // TODO(jsbell): Think about how we want to handle the overflow scenario.
1942 DCHECK(version > last_version); 1944 DCHECK(version > last_version);
1943 1945
1944 *new_version_number = version; 1946 *new_version_number = version;
1945 return s; 1947 return s;
1946 } 1948 }
1947 1949
1948 leveldb::Status IndexedDBBackingStore::PutRecord( 1950 leveldb::Status IndexedDBBackingStore::PutRecord(
1949 IndexedDBBackingStore::Transaction* transaction, 1951 IndexedDBBackingStore::Transaction* transaction,
1950 int64 database_id, 1952 int64_t database_id,
1951 int64 object_store_id, 1953 int64_t object_store_id,
1952 const IndexedDBKey& key, 1954 const IndexedDBKey& key,
1953 IndexedDBValue* value, 1955 IndexedDBValue* value,
1954 ScopedVector<storage::BlobDataHandle>* handles, 1956 ScopedVector<storage::BlobDataHandle>* handles,
1955 RecordIdentifier* record_identifier) { 1957 RecordIdentifier* record_identifier) {
1956 IDB_TRACE("IndexedDBBackingStore::PutRecord"); 1958 IDB_TRACE("IndexedDBBackingStore::PutRecord");
1957 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 1959 if (!KeyPrefix::ValidIds(database_id, object_store_id))
1958 return InvalidDBKeyStatus(); 1960 return InvalidDBKeyStatus();
1959 DCHECK(key.IsValid()); 1961 DCHECK(key.IsValid());
1960 1962
1961 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 1963 LevelDBTransaction* leveldb_transaction = transaction->transaction();
1962 int64 version = -1; 1964 int64_t version = -1;
1963 leveldb::Status s = GetNewVersionNumber( 1965 leveldb::Status s = GetNewVersionNumber(
1964 leveldb_transaction, database_id, object_store_id, &version); 1966 leveldb_transaction, database_id, object_store_id, &version);
1965 if (!s.ok()) 1967 if (!s.ok())
1966 return s; 1968 return s;
1967 DCHECK_GE(version, 0); 1969 DCHECK_GE(version, 0);
1968 const std::string object_store_data_key = 1970 const std::string object_store_data_key =
1969 ObjectStoreDataKey::Encode(database_id, object_store_id, key); 1971 ObjectStoreDataKey::Encode(database_id, object_store_id, key);
1970 1972
1971 std::string v; 1973 std::string v;
1972 EncodeVarInt(version, &v); 1974 EncodeVarInt(version, &v);
(...skipping 16 matching lines...) Expand all
1989 leveldb_transaction->Put(exists_entry_key, &version_encoded); 1991 leveldb_transaction->Put(exists_entry_key, &version_encoded);
1990 1992
1991 std::string key_encoded; 1993 std::string key_encoded;
1992 EncodeIDBKey(key, &key_encoded); 1994 EncodeIDBKey(key, &key_encoded);
1993 record_identifier->Reset(key_encoded, version); 1995 record_identifier->Reset(key_encoded, version);
1994 return s; 1996 return s;
1995 } 1997 }
1996 1998
1997 leveldb::Status IndexedDBBackingStore::ClearObjectStore( 1999 leveldb::Status IndexedDBBackingStore::ClearObjectStore(
1998 IndexedDBBackingStore::Transaction* transaction, 2000 IndexedDBBackingStore::Transaction* transaction,
1999 int64 database_id, 2001 int64_t database_id,
2000 int64 object_store_id) { 2002 int64_t object_store_id) {
2001 IDB_TRACE("IndexedDBBackingStore::ClearObjectStore"); 2003 IDB_TRACE("IndexedDBBackingStore::ClearObjectStore");
2002 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 2004 if (!KeyPrefix::ValidIds(database_id, object_store_id))
2003 return InvalidDBKeyStatus(); 2005 return InvalidDBKeyStatus();
2004 const std::string start_key = 2006 const std::string start_key =
2005 KeyPrefix(database_id, object_store_id).Encode(); 2007 KeyPrefix(database_id, object_store_id).Encode();
2006 const std::string stop_key = 2008 const std::string stop_key =
2007 KeyPrefix(database_id, object_store_id + 1).Encode(); 2009 KeyPrefix(database_id, object_store_id + 1).Encode();
2008 2010
2009 leveldb::Status s = 2011 leveldb::Status s =
2010 DeleteRangeBasic(transaction->transaction(), start_key, stop_key, true); 2012 DeleteRangeBasic(transaction->transaction(), start_key, stop_key, true);
2011 if (!s.ok()) { 2013 if (!s.ok()) {
2012 INTERNAL_WRITE_ERROR(CLEAR_OBJECT_STORE); 2014 INTERNAL_WRITE_ERROR(CLEAR_OBJECT_STORE);
2013 return s; 2015 return s;
2014 } 2016 }
2015 return DeleteBlobsInObjectStore(transaction, database_id, object_store_id); 2017 return DeleteBlobsInObjectStore(transaction, database_id, object_store_id);
2016 } 2018 }
2017 2019
2018 leveldb::Status IndexedDBBackingStore::DeleteRecord( 2020 leveldb::Status IndexedDBBackingStore::DeleteRecord(
2019 IndexedDBBackingStore::Transaction* transaction, 2021 IndexedDBBackingStore::Transaction* transaction,
2020 int64 database_id, 2022 int64_t database_id,
2021 int64 object_store_id, 2023 int64_t object_store_id,
2022 const RecordIdentifier& record_identifier) { 2024 const RecordIdentifier& record_identifier) {
2023 IDB_TRACE("IndexedDBBackingStore::DeleteRecord"); 2025 IDB_TRACE("IndexedDBBackingStore::DeleteRecord");
2024 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 2026 if (!KeyPrefix::ValidIds(database_id, object_store_id))
2025 return InvalidDBKeyStatus(); 2027 return InvalidDBKeyStatus();
2026 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 2028 LevelDBTransaction* leveldb_transaction = transaction->transaction();
2027 2029
2028 const std::string object_store_data_key = ObjectStoreDataKey::Encode( 2030 const std::string object_store_data_key = ObjectStoreDataKey::Encode(
2029 database_id, object_store_id, record_identifier.primary_key()); 2031 database_id, object_store_id, record_identifier.primary_key());
2030 leveldb_transaction->Remove(object_store_data_key); 2032 leveldb_transaction->Remove(object_store_data_key);
2031 leveldb::Status s = transaction->PutBlobInfoIfNeeded( 2033 leveldb::Status s = transaction->PutBlobInfoIfNeeded(
2032 database_id, object_store_id, object_store_data_key, NULL, NULL); 2034 database_id, object_store_id, object_store_data_key, NULL, NULL);
2033 if (!s.ok()) 2035 if (!s.ok())
2034 return s; 2036 return s;
2035 2037
2036 const std::string exists_entry_key = ExistsEntryKey::Encode( 2038 const std::string exists_entry_key = ExistsEntryKey::Encode(
2037 database_id, object_store_id, record_identifier.primary_key()); 2039 database_id, object_store_id, record_identifier.primary_key());
2038 leveldb_transaction->Remove(exists_entry_key); 2040 leveldb_transaction->Remove(exists_entry_key);
2039 return leveldb::Status::OK(); 2041 return leveldb::Status::OK();
2040 } 2042 }
2041 2043
2042 leveldb::Status IndexedDBBackingStore::DeleteRange( 2044 leveldb::Status IndexedDBBackingStore::DeleteRange(
2043 IndexedDBBackingStore::Transaction* transaction, 2045 IndexedDBBackingStore::Transaction* transaction,
2044 int64 database_id, 2046 int64_t database_id,
2045 int64 object_store_id, 2047 int64_t object_store_id,
2046 const IndexedDBKeyRange& key_range) { 2048 const IndexedDBKeyRange& key_range) {
2047 leveldb::Status s; 2049 leveldb::Status s;
2048 scoped_ptr<IndexedDBBackingStore::Cursor> start_cursor = 2050 scoped_ptr<IndexedDBBackingStore::Cursor> start_cursor =
2049 OpenObjectStoreCursor(transaction, 2051 OpenObjectStoreCursor(transaction,
2050 database_id, 2052 database_id,
2051 object_store_id, 2053 object_store_id,
2052 key_range, 2054 key_range,
2053 blink::WebIDBCursorDirectionNext, 2055 blink::WebIDBCursorDirectionNext,
2054 &s); 2056 &s);
2055 if (!s.ok()) 2057 if (!s.ok())
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2097 start_key = 2099 start_key =
2098 ExistsEntryKey::Encode(database_id, object_store_id, start_cursor->key()); 2100 ExistsEntryKey::Encode(database_id, object_store_id, start_cursor->key());
2099 stop_key = 2101 stop_key =
2100 ExistsEntryKey::Encode(database_id, object_store_id, end_cursor->key()); 2102 ExistsEntryKey::Encode(database_id, object_store_id, end_cursor->key());
2101 return DeleteRangeBasic( 2103 return DeleteRangeBasic(
2102 transaction->transaction(), start_key, stop_key, false); 2104 transaction->transaction(), start_key, stop_key, false);
2103 } 2105 }
2104 2106
2105 leveldb::Status IndexedDBBackingStore::GetKeyGeneratorCurrentNumber( 2107 leveldb::Status IndexedDBBackingStore::GetKeyGeneratorCurrentNumber(
2106 IndexedDBBackingStore::Transaction* transaction, 2108 IndexedDBBackingStore::Transaction* transaction,
2107 int64 database_id, 2109 int64_t database_id,
2108 int64 object_store_id, 2110 int64_t object_store_id,
2109 int64* key_generator_current_number) { 2111 int64_t* key_generator_current_number) {
2110 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 2112 if (!KeyPrefix::ValidIds(database_id, object_store_id))
2111 return InvalidDBKeyStatus(); 2113 return InvalidDBKeyStatus();
2112 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 2114 LevelDBTransaction* leveldb_transaction = transaction->transaction();
2113 2115
2114 const std::string key_generator_current_number_key = 2116 const std::string key_generator_current_number_key =
2115 ObjectStoreMetaDataKey::Encode( 2117 ObjectStoreMetaDataKey::Encode(
2116 database_id, 2118 database_id,
2117 object_store_id, 2119 object_store_id,
2118 ObjectStoreMetaDataKey::KEY_GENERATOR_CURRENT_NUMBER); 2120 ObjectStoreMetaDataKey::KEY_GENERATOR_CURRENT_NUMBER);
2119 2121
(...skipping 20 matching lines...) Expand all
2140 // but derived from the maximum numeric key present in existing 2142 // but derived from the maximum numeric key present in existing
2141 // data. This violates the spec as the data may be cleared but the 2143 // data. This violates the spec as the data may be cleared but the
2142 // key generator state must be preserved. 2144 // key generator state must be preserved.
2143 // TODO(jsbell): Fix this for all stores on database open? 2145 // TODO(jsbell): Fix this for all stores on database open?
2144 const std::string start_key = 2146 const std::string start_key =
2145 ObjectStoreDataKey::Encode(database_id, object_store_id, MinIDBKey()); 2147 ObjectStoreDataKey::Encode(database_id, object_store_id, MinIDBKey());
2146 const std::string stop_key = 2148 const std::string stop_key =
2147 ObjectStoreDataKey::Encode(database_id, object_store_id, MaxIDBKey()); 2149 ObjectStoreDataKey::Encode(database_id, object_store_id, MaxIDBKey());
2148 2150
2149 scoped_ptr<LevelDBIterator> it = leveldb_transaction->CreateIterator(); 2151 scoped_ptr<LevelDBIterator> it = leveldb_transaction->CreateIterator();
2150 int64 max_numeric_key = 0; 2152 int64_t max_numeric_key = 0;
2151 2153
2152 for (s = it->Seek(start_key); 2154 for (s = it->Seek(start_key);
2153 s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0; 2155 s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
2154 s = it->Next()) { 2156 s = it->Next()) {
2155 StringPiece slice(it->Key()); 2157 StringPiece slice(it->Key());
2156 ObjectStoreDataKey data_key; 2158 ObjectStoreDataKey data_key;
2157 if (!ObjectStoreDataKey::Decode(&slice, &data_key) || !slice.empty()) { 2159 if (!ObjectStoreDataKey::Decode(&slice, &data_key) || !slice.empty()) {
2158 INTERNAL_READ_ERROR_UNTESTED(GET_KEY_GENERATOR_CURRENT_NUMBER); 2160 INTERNAL_READ_ERROR_UNTESTED(GET_KEY_GENERATOR_CURRENT_NUMBER);
2159 return InternalInconsistencyStatus(); 2161 return InternalInconsistencyStatus();
2160 } 2162 }
2161 scoped_ptr<IndexedDBKey> user_key = data_key.user_key(); 2163 scoped_ptr<IndexedDBKey> user_key = data_key.user_key();
2162 if (user_key->type() == blink::WebIDBKeyTypeNumber) { 2164 if (user_key->type() == blink::WebIDBKeyTypeNumber) {
2163 int64 n = static_cast<int64>(user_key->number()); 2165 int64_t n = static_cast<int64_t>(user_key->number());
2164 if (n > max_numeric_key) 2166 if (n > max_numeric_key)
2165 max_numeric_key = n; 2167 max_numeric_key = n;
2166 } 2168 }
2167 } 2169 }
2168 2170
2169 if (s.ok()) 2171 if (s.ok())
2170 *key_generator_current_number = max_numeric_key + 1; 2172 *key_generator_current_number = max_numeric_key + 1;
2171 else 2173 else
2172 INTERNAL_READ_ERROR_UNTESTED(GET_KEY_GENERATOR_CURRENT_NUMBER); 2174 INTERNAL_READ_ERROR_UNTESTED(GET_KEY_GENERATOR_CURRENT_NUMBER);
2173 2175
2174 return s; 2176 return s;
2175 } 2177 }
2176 2178
2177 leveldb::Status IndexedDBBackingStore::MaybeUpdateKeyGeneratorCurrentNumber( 2179 leveldb::Status IndexedDBBackingStore::MaybeUpdateKeyGeneratorCurrentNumber(
2178 IndexedDBBackingStore::Transaction* transaction, 2180 IndexedDBBackingStore::Transaction* transaction,
2179 int64 database_id, 2181 int64_t database_id,
2180 int64 object_store_id, 2182 int64_t object_store_id,
2181 int64 new_number, 2183 int64_t new_number,
2182 bool check_current) { 2184 bool check_current) {
2183 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 2185 if (!KeyPrefix::ValidIds(database_id, object_store_id))
2184 return InvalidDBKeyStatus(); 2186 return InvalidDBKeyStatus();
2185 2187
2186 if (check_current) { 2188 if (check_current) {
2187 int64 current_number; 2189 int64_t current_number;
2188 leveldb::Status s = GetKeyGeneratorCurrentNumber( 2190 leveldb::Status s = GetKeyGeneratorCurrentNumber(
2189 transaction, database_id, object_store_id, &current_number); 2191 transaction, database_id, object_store_id, &current_number);
2190 if (!s.ok()) 2192 if (!s.ok())
2191 return s; 2193 return s;
2192 if (new_number <= current_number) 2194 if (new_number <= current_number)
2193 return s; 2195 return s;
2194 } 2196 }
2195 2197
2196 const std::string key_generator_current_number_key = 2198 const std::string key_generator_current_number_key =
2197 ObjectStoreMetaDataKey::Encode( 2199 ObjectStoreMetaDataKey::Encode(
2198 database_id, 2200 database_id,
2199 object_store_id, 2201 object_store_id,
2200 ObjectStoreMetaDataKey::KEY_GENERATOR_CURRENT_NUMBER); 2202 ObjectStoreMetaDataKey::KEY_GENERATOR_CURRENT_NUMBER);
2201 PutInt( 2203 PutInt(
2202 transaction->transaction(), key_generator_current_number_key, new_number); 2204 transaction->transaction(), key_generator_current_number_key, new_number);
2203 return leveldb::Status::OK(); 2205 return leveldb::Status::OK();
2204 } 2206 }
2205 2207
2206 leveldb::Status IndexedDBBackingStore::KeyExistsInObjectStore( 2208 leveldb::Status IndexedDBBackingStore::KeyExistsInObjectStore(
2207 IndexedDBBackingStore::Transaction* transaction, 2209 IndexedDBBackingStore::Transaction* transaction,
2208 int64 database_id, 2210 int64_t database_id,
2209 int64 object_store_id, 2211 int64_t object_store_id,
2210 const IndexedDBKey& key, 2212 const IndexedDBKey& key,
2211 RecordIdentifier* found_record_identifier, 2213 RecordIdentifier* found_record_identifier,
2212 bool* found) { 2214 bool* found) {
2213 IDB_TRACE("IndexedDBBackingStore::KeyExistsInObjectStore"); 2215 IDB_TRACE("IndexedDBBackingStore::KeyExistsInObjectStore");
2214 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 2216 if (!KeyPrefix::ValidIds(database_id, object_store_id))
2215 return InvalidDBKeyStatus(); 2217 return InvalidDBKeyStatus();
2216 *found = false; 2218 *found = false;
2217 const std::string leveldb_key = 2219 const std::string leveldb_key =
2218 ObjectStoreDataKey::Encode(database_id, object_store_id, key); 2220 ObjectStoreDataKey::Encode(database_id, object_store_id, key);
2219 std::string data; 2221 std::string data;
2220 2222
2221 leveldb::Status s = 2223 leveldb::Status s =
2222 transaction->transaction()->Get(leveldb_key, &data, found); 2224 transaction->transaction()->Get(leveldb_key, &data, found);
2223 if (!s.ok()) { 2225 if (!s.ok()) {
2224 INTERNAL_READ_ERROR_UNTESTED(KEY_EXISTS_IN_OBJECT_STORE); 2226 INTERNAL_READ_ERROR_UNTESTED(KEY_EXISTS_IN_OBJECT_STORE);
2225 return s; 2227 return s;
2226 } 2228 }
2227 if (!*found) 2229 if (!*found)
2228 return leveldb::Status::OK(); 2230 return leveldb::Status::OK();
2229 if (!data.size()) { 2231 if (!data.size()) {
2230 INTERNAL_READ_ERROR_UNTESTED(KEY_EXISTS_IN_OBJECT_STORE); 2232 INTERNAL_READ_ERROR_UNTESTED(KEY_EXISTS_IN_OBJECT_STORE);
2231 return InternalInconsistencyStatus(); 2233 return InternalInconsistencyStatus();
2232 } 2234 }
2233 2235
2234 int64 version; 2236 int64_t version;
2235 StringPiece slice(data); 2237 StringPiece slice(data);
2236 if (!DecodeVarInt(&slice, &version)) 2238 if (!DecodeVarInt(&slice, &version))
2237 return InternalInconsistencyStatus(); 2239 return InternalInconsistencyStatus();
2238 2240
2239 std::string encoded_key; 2241 std::string encoded_key;
2240 EncodeIDBKey(key, &encoded_key); 2242 EncodeIDBKey(key, &encoded_key);
2241 found_record_identifier->Reset(encoded_key, version); 2243 found_record_identifier->Reset(encoded_key, version);
2242 return s; 2244 return s;
2243 } 2245 }
2244 2246
2245 class IndexedDBBackingStore::Transaction::ChainedBlobWriterImpl 2247 class IndexedDBBackingStore::Transaction::ChainedBlobWriterImpl
2246 : public IndexedDBBackingStore::Transaction::ChainedBlobWriter { 2248 : public IndexedDBBackingStore::Transaction::ChainedBlobWriter {
2247 public: 2249 public:
2248 typedef IndexedDBBackingStore::Transaction::WriteDescriptorVec 2250 typedef IndexedDBBackingStore::Transaction::WriteDescriptorVec
2249 WriteDescriptorVec; 2251 WriteDescriptorVec;
2250 ChainedBlobWriterImpl( 2252 ChainedBlobWriterImpl(
2251 int64 database_id, 2253 int64_t database_id,
2252 IndexedDBBackingStore* backing_store, 2254 IndexedDBBackingStore* backing_store,
2253 WriteDescriptorVec* blobs, 2255 WriteDescriptorVec* blobs,
2254 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback) 2256 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback)
2255 : waiting_for_callback_(false), 2257 : waiting_for_callback_(false),
2256 database_id_(database_id), 2258 database_id_(database_id),
2257 backing_store_(backing_store), 2259 backing_store_(backing_store),
2258 callback_(callback), 2260 callback_(callback),
2259 aborted_(false) { 2261 aborted_(false) {
2260 blobs_.swap(*blobs); 2262 blobs_.swap(*blobs);
2261 iter_ = blobs_.begin(); 2263 iter_ = blobs_.begin();
2262 backing_store->task_runner()->PostTask( 2264 backing_store->task_runner()->PostTask(
2263 FROM_HERE, base::Bind(&ChainedBlobWriterImpl::WriteNextFile, this)); 2265 FROM_HERE, base::Bind(&ChainedBlobWriterImpl::WriteNextFile, this));
2264 } 2266 }
2265 2267
2266 void set_delegate(scoped_ptr<FileWriterDelegate> delegate) override { 2268 void set_delegate(scoped_ptr<FileWriterDelegate> delegate) override {
2267 delegate_.reset(delegate.release()); 2269 delegate_.reset(delegate.release());
2268 } 2270 }
2269 2271
2270 void ReportWriteCompletion(bool succeeded, int64 bytes_written) override { 2272 void ReportWriteCompletion(bool succeeded, int64_t bytes_written) override {
2271 DCHECK(waiting_for_callback_); 2273 DCHECK(waiting_for_callback_);
2272 DCHECK(!succeeded || bytes_written >= 0); 2274 DCHECK(!succeeded || bytes_written >= 0);
2273 waiting_for_callback_ = false; 2275 waiting_for_callback_ = false;
2274 if (delegate_.get()) // Only present for Blob, not File. 2276 if (delegate_.get()) // Only present for Blob, not File.
2275 content::BrowserThread::DeleteSoon( 2277 content::BrowserThread::DeleteSoon(
2276 content::BrowserThread::IO, FROM_HERE, delegate_.release()); 2278 content::BrowserThread::IO, FROM_HERE, delegate_.release());
2277 if (aborted_) { 2279 if (aborted_) {
2278 self_ref_ = NULL; 2280 self_ref_ = NULL;
2279 return; 2281 return;
2280 } 2282 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2314 return; 2316 return;
2315 } 2317 }
2316 waiting_for_callback_ = true; 2318 waiting_for_callback_ = true;
2317 } 2319 }
2318 } 2320 }
2319 2321
2320 bool waiting_for_callback_; 2322 bool waiting_for_callback_;
2321 scoped_refptr<ChainedBlobWriterImpl> self_ref_; 2323 scoped_refptr<ChainedBlobWriterImpl> self_ref_;
2322 WriteDescriptorVec blobs_; 2324 WriteDescriptorVec blobs_;
2323 WriteDescriptorVec::const_iterator iter_; 2325 WriteDescriptorVec::const_iterator iter_;
2324 int64 database_id_; 2326 int64_t database_id_;
2325 IndexedDBBackingStore* backing_store_; 2327 IndexedDBBackingStore* backing_store_;
2326 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback_; 2328 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback_;
2327 scoped_ptr<FileWriterDelegate> delegate_; 2329 scoped_ptr<FileWriterDelegate> delegate_;
2328 bool aborted_; 2330 bool aborted_;
2329 2331
2330 DISALLOW_COPY_AND_ASSIGN(ChainedBlobWriterImpl); 2332 DISALLOW_COPY_AND_ASSIGN(ChainedBlobWriterImpl);
2331 }; 2333 };
2332 2334
2333 class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback, 2335 class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback,
2334 public base::RefCountedThreadSafe<LocalWriteClosure> { 2336 public base::RefCountedThreadSafe<LocalWriteClosure> {
2335 public: 2337 public:
2336 LocalWriteClosure(IndexedDBBackingStore::Transaction::ChainedBlobWriter* 2338 LocalWriteClosure(IndexedDBBackingStore::Transaction::ChainedBlobWriter*
2337 chained_blob_writer, 2339 chained_blob_writer,
2338 base::SequencedTaskRunner* task_runner) 2340 base::SequencedTaskRunner* task_runner)
2339 : chained_blob_writer_(chained_blob_writer), 2341 : chained_blob_writer_(chained_blob_writer),
2340 task_runner_(task_runner), 2342 task_runner_(task_runner),
2341 bytes_written_(0) {} 2343 bytes_written_(0) {}
2342 2344
2343 void Run(base::File::Error rv, 2345 void Run(base::File::Error rv,
2344 int64 bytes, 2346 int64_t bytes,
2345 FileWriterDelegate::WriteProgressStatus write_status) { 2347 FileWriterDelegate::WriteProgressStatus write_status) {
2346 DCHECK_GE(bytes, 0); 2348 DCHECK_GE(bytes, 0);
2347 bytes_written_ += bytes; 2349 bytes_written_ += bytes;
2348 if (write_status == FileWriterDelegate::SUCCESS_IO_PENDING) 2350 if (write_status == FileWriterDelegate::SUCCESS_IO_PENDING)
2349 return; // We don't care about progress events. 2351 return; // We don't care about progress events.
2350 if (rv == base::File::FILE_OK) { 2352 if (rv == base::File::FILE_OK) {
2351 DCHECK_EQ(write_status, FileWriterDelegate::SUCCESS_COMPLETED); 2353 DCHECK_EQ(write_status, FileWriterDelegate::SUCCESS_COMPLETED);
2352 } else { 2354 } else {
2353 DCHECK(write_status == FileWriterDelegate::ERROR_WRITE_STARTED || 2355 DCHECK(write_status == FileWriterDelegate::ERROR_WRITE_STARTED ||
2354 write_status == FileWriterDelegate::ERROR_WRITE_NOT_STARTED); 2356 write_status == FileWriterDelegate::ERROR_WRITE_NOT_STARTED);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2433 !file.SetTimes(last_modified_, last_modified_)) { 2435 !file.SetTimes(last_modified_, last_modified_)) {
2434 // TODO(cmumford): Complain quietly; timestamp's probably not vital. 2436 // TODO(cmumford): Complain quietly; timestamp's probably not vital.
2435 } 2437 }
2436 file.Close(); 2438 file.Close();
2437 chained_blob_writer_->ReportWriteCompletion(success, bytes_written_); 2439 chained_blob_writer_->ReportWriteCompletion(success, bytes_written_);
2438 } 2440 }
2439 2441
2440 scoped_refptr<IndexedDBBackingStore::Transaction::ChainedBlobWriter> 2442 scoped_refptr<IndexedDBBackingStore::Transaction::ChainedBlobWriter>
2441 chained_blob_writer_; 2443 chained_blob_writer_;
2442 scoped_refptr<base::SequencedTaskRunner> task_runner_; 2444 scoped_refptr<base::SequencedTaskRunner> task_runner_;
2443 int64 bytes_written_; 2445 int64_t bytes_written_;
2444 2446
2445 base::FilePath file_path_; 2447 base::FilePath file_path_;
2446 base::Time last_modified_; 2448 base::Time last_modified_;
2447 2449
2448 DISALLOW_COPY_AND_ASSIGN(LocalWriteClosure); 2450 DISALLOW_COPY_AND_ASSIGN(LocalWriteClosure);
2449 }; 2451 };
2450 2452
2451 bool IndexedDBBackingStore::WriteBlobFile( 2453 bool IndexedDBBackingStore::WriteBlobFile(
2452 int64 database_id, 2454 int64_t database_id,
2453 const Transaction::WriteDescriptor& descriptor, 2455 const Transaction::WriteDescriptor& descriptor,
2454 Transaction::ChainedBlobWriter* chained_blob_writer) { 2456 Transaction::ChainedBlobWriter* chained_blob_writer) {
2455
2456 if (!MakeIDBBlobDirectory(blob_path_, database_id, descriptor.key())) 2457 if (!MakeIDBBlobDirectory(blob_path_, database_id, descriptor.key()))
2457 return false; 2458 return false;
2458 2459
2459 FilePath path = GetBlobFileName(database_id, descriptor.key()); 2460 FilePath path = GetBlobFileName(database_id, descriptor.key());
2460 2461
2461 if (descriptor.is_file() && !descriptor.file_path().empty()) { 2462 if (descriptor.is_file() && !descriptor.file_path().empty()) {
2462 if (!base::CopyFile(descriptor.file_path(), path)) 2463 if (!base::CopyFile(descriptor.file_path(), path))
2463 return false; 2464 return false;
2464 2465
2465 base::File::Info info; 2466 base::File::Info info;
2466 if (base::GetFileInfo(descriptor.file_path(), &info)) { 2467 if (base::GetFileInfo(descriptor.file_path(), &info)) {
2467 if (descriptor.size() != -1) { 2468 if (descriptor.size() != -1) {
2468 if (descriptor.size() != info.size) 2469 if (descriptor.size() != info.size)
2469 return false; 2470 return false;
2470 // The round-trip can be lossy; round to nearest millisecond. 2471 // The round-trip can be lossy; round to nearest millisecond.
2471 int64 delta = (descriptor.last_modified() - 2472 int64_t delta =
2472 info.last_modified).InMilliseconds(); 2473 (descriptor.last_modified() - info.last_modified).InMilliseconds();
2473 if (std::abs(delta) > 1) 2474 if (std::abs(delta) > 1)
2474 return false; 2475 return false;
2475 } 2476 }
2476 if (!base::TouchFile(path, info.last_accessed, info.last_modified)) { 2477 if (!base::TouchFile(path, info.last_accessed, info.last_modified)) {
2477 // TODO(ericu): Complain quietly; timestamp's probably not vital. 2478 // TODO(ericu): Complain quietly; timestamp's probably not vital.
2478 } 2479 }
2479 } else { 2480 } else {
2480 // TODO(ericu): Complain quietly; timestamp's probably not vital. 2481 // TODO(ericu): Complain quietly; timestamp's probably not vital.
2481 } 2482 }
2482 2483
(...skipping 13 matching lines...) Expand all
2496 base::Bind(&LocalWriteClosure::WriteBlobToFileOnIOThread, 2497 base::Bind(&LocalWriteClosure::WriteBlobToFileOnIOThread,
2497 write_closure.get(), 2498 write_closure.get(),
2498 path, 2499 path,
2499 descriptor.url(), 2500 descriptor.url(),
2500 descriptor.last_modified(), 2501 descriptor.last_modified(),
2501 request_context_)); 2502 request_context_));
2502 } 2503 }
2503 return true; 2504 return true;
2504 } 2505 }
2505 2506
2506 void IndexedDBBackingStore::ReportBlobUnused(int64 database_id, 2507 void IndexedDBBackingStore::ReportBlobUnused(int64_t database_id,
2507 int64 blob_key) { 2508 int64_t blob_key) {
2508 DCHECK(KeyPrefix::IsValidDatabaseId(database_id)); 2509 DCHECK(KeyPrefix::IsValidDatabaseId(database_id));
2509 bool all_blobs = blob_key == DatabaseMetaDataKey::kAllBlobsKey; 2510 bool all_blobs = blob_key == DatabaseMetaDataKey::kAllBlobsKey;
2510 DCHECK(all_blobs || DatabaseMetaDataKey::IsValidBlobKey(blob_key)); 2511 DCHECK(all_blobs || DatabaseMetaDataKey::IsValidBlobKey(blob_key));
2511 scoped_refptr<LevelDBTransaction> transaction = 2512 scoped_refptr<LevelDBTransaction> transaction =
2512 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get()); 2513 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get());
2513 2514
2514 BlobJournalType live_blob_journal, primary_journal; 2515 BlobJournalType live_blob_journal, primary_journal;
2515 if (!GetLiveBlobJournal(transaction.get(), &live_blob_journal).ok()) 2516 if (!GetLiveBlobJournal(transaction.get(), &live_blob_journal).ok())
2516 return; 2517 return;
2517 DCHECK(!live_blob_journal.empty()); 2518 DCHECK(!live_blob_journal.empty());
2518 if (!GetPrimaryBlobJournal(transaction.get(), &primary_journal).ok()) 2519 if (!GetPrimaryBlobJournal(transaction.get(), &primary_journal).ok())
2519 return; 2520 return;
2520 2521
2521 // There are several cases to handle. If blob_key is kAllBlobsKey, we want to 2522 // There are several cases to handle. If blob_key is kAllBlobsKey, we want to
2522 // remove all entries with database_id from the live_blob journal and add only 2523 // remove all entries with database_id from the live_blob journal and add only
2523 // kAllBlobsKey to the primary journal. Otherwise if IsValidBlobKey(blob_key) 2524 // kAllBlobsKey to the primary journal. Otherwise if IsValidBlobKey(blob_key)
2524 // and we hit kAllBlobsKey for the right database_id in the journal, we leave 2525 // and we hit kAllBlobsKey for the right database_id in the journal, we leave
2525 // the kAllBlobsKey entry in the live_blob journal but add the specific blob 2526 // the kAllBlobsKey entry in the live_blob journal but add the specific blob
2526 // to the primary. Otherwise if IsValidBlobKey(blob_key) and we find a 2527 // to the primary. Otherwise if IsValidBlobKey(blob_key) and we find a
2527 // matching (database_id, blob_key) tuple, we should move it to the primary 2528 // matching (database_id, blob_key) tuple, we should move it to the primary
2528 // journal. 2529 // journal.
2529 BlobJournalType new_live_blob_journal; 2530 BlobJournalType new_live_blob_journal;
2530 for (BlobJournalType::iterator journal_iter = live_blob_journal.begin(); 2531 for (BlobJournalType::iterator journal_iter = live_blob_journal.begin();
2531 journal_iter != live_blob_journal.end(); 2532 journal_iter != live_blob_journal.end();
2532 ++journal_iter) { 2533 ++journal_iter) {
2533 int64 current_database_id = journal_iter->first; 2534 int64_t current_database_id = journal_iter->first;
2534 int64 current_blob_key = journal_iter->second; 2535 int64_t current_blob_key = journal_iter->second;
2535 bool current_all_blobs = 2536 bool current_all_blobs =
2536 current_blob_key == DatabaseMetaDataKey::kAllBlobsKey; 2537 current_blob_key == DatabaseMetaDataKey::kAllBlobsKey;
2537 DCHECK(KeyPrefix::IsValidDatabaseId(current_database_id) || 2538 DCHECK(KeyPrefix::IsValidDatabaseId(current_database_id) ||
2538 current_all_blobs); 2539 current_all_blobs);
2539 if (current_database_id == database_id && 2540 if (current_database_id == database_id &&
2540 (all_blobs || current_all_blobs || blob_key == current_blob_key)) { 2541 (all_blobs || current_all_blobs || blob_key == current_blob_key)) {
2541 if (!all_blobs) { 2542 if (!all_blobs) {
2542 primary_journal.push_back( 2543 primary_journal.push_back(
2543 std::make_pair(database_id, current_blob_key)); 2544 std::make_pair(database_id, current_blob_key));
2544 if (current_all_blobs) 2545 if (current_all_blobs)
(...skipping 26 matching lines...) Expand all
2571 // deleted, the timer will automatically be canceled on destruction. 2572 // deleted, the timer will automatically be canceled on destruction.
2572 void IndexedDBBackingStore::StartJournalCleaningTimer() { 2573 void IndexedDBBackingStore::StartJournalCleaningTimer() {
2573 journal_cleaning_timer_.Start( 2574 journal_cleaning_timer_.Start(
2574 FROM_HERE, 2575 FROM_HERE,
2575 base::TimeDelta::FromSeconds(5), 2576 base::TimeDelta::FromSeconds(5),
2576 this, 2577 this,
2577 &IndexedDBBackingStore::CleanPrimaryJournalIgnoreReturn); 2578 &IndexedDBBackingStore::CleanPrimaryJournalIgnoreReturn);
2578 } 2579 }
2579 2580
2580 // This assumes a file path of dbId/second-to-LSB-of-counter/counter. 2581 // This assumes a file path of dbId/second-to-LSB-of-counter/counter.
2581 FilePath IndexedDBBackingStore::GetBlobFileName(int64 database_id, 2582 FilePath IndexedDBBackingStore::GetBlobFileName(int64_t database_id,
2582 int64 key) const { 2583 int64_t key) const {
2583 return GetBlobFileNameForKey(blob_path_, database_id, key); 2584 return GetBlobFileNameForKey(blob_path_, database_id, key);
2584 } 2585 }
2585 2586
2586 static bool CheckIndexAndMetaDataKey(const LevelDBIterator* it, 2587 static bool CheckIndexAndMetaDataKey(const LevelDBIterator* it,
2587 const std::string& stop_key, 2588 const std::string& stop_key,
2588 int64 index_id, 2589 int64_t index_id,
2589 unsigned char meta_data_type) { 2590 unsigned char meta_data_type) {
2590 if (!it->IsValid() || CompareKeys(it->Key(), stop_key) >= 0) 2591 if (!it->IsValid() || CompareKeys(it->Key(), stop_key) >= 0)
2591 return false; 2592 return false;
2592 2593
2593 StringPiece slice(it->Key()); 2594 StringPiece slice(it->Key());
2594 IndexMetaDataKey meta_data_key; 2595 IndexMetaDataKey meta_data_key;
2595 bool ok = IndexMetaDataKey::Decode(&slice, &meta_data_key); 2596 bool ok = IndexMetaDataKey::Decode(&slice, &meta_data_key);
2596 DCHECK(ok); 2597 DCHECK(ok);
2597 if (meta_data_key.IndexId() != index_id) 2598 if (meta_data_key.IndexId() != index_id)
2598 return false; 2599 return false;
2599 if (meta_data_key.meta_data_type() != meta_data_type) 2600 if (meta_data_key.meta_data_type() != meta_data_type)
2600 return false; 2601 return false;
2601 return true; 2602 return true;
2602 } 2603 }
2603 2604
2604 // TODO(jsbell): This should do some error handling rather than plowing ahead 2605 // TODO(jsbell): This should do some error handling rather than plowing ahead
2605 // when bad data is encountered. 2606 // when bad data is encountered.
2606 leveldb::Status IndexedDBBackingStore::GetIndexes( 2607 leveldb::Status IndexedDBBackingStore::GetIndexes(
2607 int64 database_id, 2608 int64_t database_id,
2608 int64 object_store_id, 2609 int64_t object_store_id,
2609 IndexedDBObjectStoreMetadata::IndexMap* indexes) { 2610 IndexedDBObjectStoreMetadata::IndexMap* indexes) {
2610 IDB_TRACE("IndexedDBBackingStore::GetIndexes"); 2611 IDB_TRACE("IndexedDBBackingStore::GetIndexes");
2611 if (!KeyPrefix::ValidIds(database_id, object_store_id)) 2612 if (!KeyPrefix::ValidIds(database_id, object_store_id))
2612 return InvalidDBKeyStatus(); 2613 return InvalidDBKeyStatus();
2613 const std::string start_key = 2614 const std::string start_key =
2614 IndexMetaDataKey::Encode(database_id, object_store_id, 0, 0); 2615 IndexMetaDataKey::Encode(database_id, object_store_id, 0, 0);
2615 const std::string stop_key = 2616 const std::string stop_key =
2616 IndexMetaDataKey::Encode(database_id, object_store_id + 1, 0, 0); 2617 IndexMetaDataKey::Encode(database_id, object_store_id + 1, 0, 0);
2617 2618
2618 DCHECK(indexes->empty()); 2619 DCHECK(indexes->empty());
(...skipping 10 matching lines...) Expand all
2629 // Possible stale metadata due to http://webkit.org/b/85557 but don't fail 2630 // Possible stale metadata due to http://webkit.org/b/85557 but don't fail
2630 // the load. 2631 // the load.
2631 s = it->Next(); 2632 s = it->Next();
2632 if (!s.ok()) 2633 if (!s.ok())
2633 break; 2634 break;
2634 continue; 2635 continue;
2635 } 2636 }
2636 2637
2637 // TODO(jsbell): Do this by direct key lookup rather than iteration, to 2638 // TODO(jsbell): Do this by direct key lookup rather than iteration, to
2638 // simplify. 2639 // simplify.
2639 int64 index_id = meta_data_key.IndexId(); 2640 int64_t index_id = meta_data_key.IndexId();
2640 base::string16 index_name; 2641 base::string16 index_name;
2641 { 2642 {
2642 StringPiece slice(it->Value()); 2643 StringPiece slice(it->Value());
2643 if (!DecodeString(&slice, &index_name) || !slice.empty()) 2644 if (!DecodeString(&slice, &index_name) || !slice.empty())
2644 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES); 2645 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
2645 } 2646 }
2646 2647
2647 s = it->Next(); // unique flag 2648 s = it->Next(); // unique flag
2648 if (!s.ok()) 2649 if (!s.ok())
2649 break; 2650 break;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2692 (*indexes)[index_id] = IndexedDBIndexMetadata( 2693 (*indexes)[index_id] = IndexedDBIndexMetadata(
2693 index_name, index_id, key_path, index_unique, index_multi_entry); 2694 index_name, index_id, key_path, index_unique, index_multi_entry);
2694 } 2695 }
2695 2696
2696 if (!s.ok()) 2697 if (!s.ok())
2697 INTERNAL_READ_ERROR_UNTESTED(GET_INDEXES); 2698 INTERNAL_READ_ERROR_UNTESTED(GET_INDEXES);
2698 2699
2699 return s; 2700 return s;
2700 } 2701 }
2701 2702
2702 bool IndexedDBBackingStore::RemoveBlobFile(int64 database_id, int64 key) const { 2703 bool IndexedDBBackingStore::RemoveBlobFile(int64_t database_id,
2704 int64_t key) const {
2703 FilePath path = GetBlobFileName(database_id, key); 2705 FilePath path = GetBlobFileName(database_id, key);
2704 return base::DeleteFile(path, false); 2706 return base::DeleteFile(path, false);
2705 } 2707 }
2706 2708
2707 bool IndexedDBBackingStore::RemoveBlobDirectory(int64 database_id) const { 2709 bool IndexedDBBackingStore::RemoveBlobDirectory(int64_t database_id) const {
2708 FilePath path = GetBlobDirectoryName(blob_path_, database_id); 2710 FilePath path = GetBlobDirectoryName(blob_path_, database_id);
2709 return base::DeleteFile(path, true); 2711 return base::DeleteFile(path, true);
2710 } 2712 }
2711 2713
2712 leveldb::Status IndexedDBBackingStore::CleanUpBlobJournalEntries( 2714 leveldb::Status IndexedDBBackingStore::CleanUpBlobJournalEntries(
2713 const BlobJournalType& journal) const { 2715 const BlobJournalType& journal) const {
2714 IDB_TRACE("IndexedDBBackingStore::CleanUpBlobJournalEntries"); 2716 IDB_TRACE("IndexedDBBackingStore::CleanUpBlobJournalEntries");
2715 if (journal.empty()) 2717 if (journal.empty())
2716 return leveldb::Status::OK(); 2718 return leveldb::Status::OK();
2717 for (const auto& entry : journal) { 2719 for (const auto& entry : journal) {
2718 int64 database_id = entry.first; 2720 int64_t database_id = entry.first;
2719 int64 blob_key = entry.second; 2721 int64_t blob_key = entry.second;
2720 DCHECK(KeyPrefix::IsValidDatabaseId(database_id)); 2722 DCHECK(KeyPrefix::IsValidDatabaseId(database_id));
2721 if (blob_key == DatabaseMetaDataKey::kAllBlobsKey) { 2723 if (blob_key == DatabaseMetaDataKey::kAllBlobsKey) {
2722 if (!RemoveBlobDirectory(database_id)) 2724 if (!RemoveBlobDirectory(database_id))
2723 return IOErrorStatus(); 2725 return IOErrorStatus();
2724 } else { 2726 } else {
2725 DCHECK(DatabaseMetaDataKey::IsValidBlobKey(blob_key)); 2727 DCHECK(DatabaseMetaDataKey::IsValidBlobKey(blob_key));
2726 if (!RemoveBlobFile(database_id, blob_key)) 2728 if (!RemoveBlobFile(database_id, blob_key))
2727 return IOErrorStatus(); 2729 return IOErrorStatus();
2728 } 2730 }
2729 } 2731 }
(...skipping 15 matching lines...) Expand all
2745 if (journal.empty()) 2747 if (journal.empty())
2746 return leveldb::Status::OK(); 2748 return leveldb::Status::OK();
2747 s = CleanUpBlobJournalEntries(journal); 2749 s = CleanUpBlobJournalEntries(journal);
2748 if (!s.ok()) 2750 if (!s.ok())
2749 return s; 2751 return s;
2750 ClearBlobJournal(journal_transaction.get(), level_db_key); 2752 ClearBlobJournal(journal_transaction.get(), level_db_key);
2751 return journal_transaction->Commit(); 2753 return journal_transaction->Commit();
2752 } 2754 }
2753 2755
2754 leveldb::Status IndexedDBBackingStore::Transaction::GetBlobInfoForRecord( 2756 leveldb::Status IndexedDBBackingStore::Transaction::GetBlobInfoForRecord(
2755 int64 database_id, 2757 int64_t database_id,
2756 const std::string& object_store_data_key, 2758 const std::string& object_store_data_key,
2757 IndexedDBValue* value) { 2759 IndexedDBValue* value) {
2758 BlobChangeRecord* change_record = NULL; 2760 BlobChangeRecord* change_record = NULL;
2759 BlobChangeMap::const_iterator blob_iter = 2761 BlobChangeMap::const_iterator blob_iter =
2760 blob_change_map_.find(object_store_data_key); 2762 blob_change_map_.find(object_store_data_key);
2761 if (blob_iter != blob_change_map_.end()) { 2763 if (blob_iter != blob_change_map_.end()) {
2762 change_record = blob_iter->second; 2764 change_record = blob_iter->second;
2763 } else { 2765 } else {
2764 blob_iter = incognito_blob_map_.find(object_store_data_key); 2766 blob_iter = incognito_blob_map_.find(object_store_data_key);
2765 if (blob_iter != incognito_blob_map_.end()) 2767 if (blob_iter != incognito_blob_map_.end())
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 void IndexedDBBackingStore::CleanPrimaryJournalIgnoreReturn() { 2819 void IndexedDBBackingStore::CleanPrimaryJournalIgnoreReturn() {
2818 // While a transaction is busy it is not safe to clean the journal. 2820 // While a transaction is busy it is not safe to clean the journal.
2819 if (committing_transaction_count_ > 0) 2821 if (committing_transaction_count_ > 0)
2820 StartJournalCleaningTimer(); 2822 StartJournalCleaningTimer();
2821 else 2823 else
2822 CleanUpBlobJournal(BlobJournalKey::Encode()); 2824 CleanUpBlobJournal(BlobJournalKey::Encode());
2823 } 2825 }
2824 2826
2825 WARN_UNUSED_RESULT static leveldb::Status SetMaxIndexId( 2827 WARN_UNUSED_RESULT static leveldb::Status SetMaxIndexId(
2826 LevelDBTransaction* transaction, 2828 LevelDBTransaction* transaction,
2827 int64 database_id, 2829 int64_t database_id,
2828 int64 object_store_id, 2830 int64_t object_store_id,
2829 int64 index_id) { 2831 int64_t index_id) {
2830 int64 max_index_id = -1; 2832 int64_t max_index_id = -1;
2831 const std::string max_index_id_key = ObjectStoreMetaDataKey::Encode( 2833 const std::string max_index_id_key = ObjectStoreMetaDataKey::Encode(
2832 database_id, object_store_id, ObjectStoreMetaDataKey::MAX_INDEX_ID); 2834 database_id, object_store_id, ObjectStoreMetaDataKey::MAX_INDEX_ID);
2833 bool found = false; 2835 bool found = false;
2834 leveldb::Status s = 2836 leveldb::Status s =
2835 GetInt(transaction, max_index_id_key, &max_index_id, &found); 2837 GetInt(transaction, max_index_id_key, &max_index_id, &found);
2836 if (!s.ok()) { 2838 if (!s.ok()) {
2837 INTERNAL_READ_ERROR_UNTESTED(SET_MAX_INDEX_ID); 2839 INTERNAL_READ_ERROR_UNTESTED(SET_MAX_INDEX_ID);
2838 return s; 2840 return s;
2839 } 2841 }
2840 if (!found) 2842 if (!found)
2841 max_index_id = kMinimumIndexId; 2843 max_index_id = kMinimumIndexId;
2842 2844
2843 if (index_id <= max_index_id) { 2845 if (index_id <= max_index_id) {
2844 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_MAX_INDEX_ID); 2846 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_MAX_INDEX_ID);
2845 return InternalInconsistencyStatus(); 2847 return InternalInconsistencyStatus();
2846 } 2848 }
2847 2849
2848 PutInt(transaction, max_index_id_key, index_id); 2850 PutInt(transaction, max_index_id_key, index_id);
2849 return s; 2851 return s;
2850 } 2852 }
2851 2853
2852 leveldb::Status IndexedDBBackingStore::CreateIndex( 2854 leveldb::Status IndexedDBBackingStore::CreateIndex(
2853 IndexedDBBackingStore::Transaction* transaction, 2855 IndexedDBBackingStore::Transaction* transaction,
2854 int64 database_id, 2856 int64_t database_id,
2855 int64 object_store_id, 2857 int64_t object_store_id,
2856 int64 index_id, 2858 int64_t index_id,
2857 const base::string16& name, 2859 const base::string16& name,
2858 const IndexedDBKeyPath& key_path, 2860 const IndexedDBKeyPath& key_path,
2859 bool is_unique, 2861 bool is_unique,
2860 bool is_multi_entry) { 2862 bool is_multi_entry) {
2861 IDB_TRACE("IndexedDBBackingStore::CreateIndex"); 2863 IDB_TRACE("IndexedDBBackingStore::CreateIndex");
2862 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) 2864 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id))
2863 return InvalidDBKeyStatus(); 2865 return InvalidDBKeyStatus();
2864 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 2866 LevelDBTransaction* leveldb_transaction = transaction->transaction();
2865 leveldb::Status s = SetMaxIndexId( 2867 leveldb::Status s = SetMaxIndexId(
2866 leveldb_transaction, database_id, object_store_id, index_id); 2868 leveldb_transaction, database_id, object_store_id, index_id);
(...skipping 12 matching lines...) Expand all
2879 2881
2880 PutString(leveldb_transaction, name_key, name); 2882 PutString(leveldb_transaction, name_key, name);
2881 PutBool(leveldb_transaction, unique_key, is_unique); 2883 PutBool(leveldb_transaction, unique_key, is_unique);
2882 PutIDBKeyPath(leveldb_transaction, key_path_key, key_path); 2884 PutIDBKeyPath(leveldb_transaction, key_path_key, key_path);
2883 PutBool(leveldb_transaction, multi_entry_key, is_multi_entry); 2885 PutBool(leveldb_transaction, multi_entry_key, is_multi_entry);
2884 return s; 2886 return s;
2885 } 2887 }
2886 2888
2887 leveldb::Status IndexedDBBackingStore::DeleteIndex( 2889 leveldb::Status IndexedDBBackingStore::DeleteIndex(
2888 IndexedDBBackingStore::Transaction* transaction, 2890 IndexedDBBackingStore::Transaction* transaction,
2889 int64 database_id, 2891 int64_t database_id,
2890 int64 object_store_id, 2892 int64_t object_store_id,
2891 int64 index_id) { 2893 int64_t index_id) {
2892 IDB_TRACE("IndexedDBBackingStore::DeleteIndex"); 2894 IDB_TRACE("IndexedDBBackingStore::DeleteIndex");
2893 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) 2895 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id))
2894 return InvalidDBKeyStatus(); 2896 return InvalidDBKeyStatus();
2895 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 2897 LevelDBTransaction* leveldb_transaction = transaction->transaction();
2896 2898
2897 const std::string index_meta_data_start = 2899 const std::string index_meta_data_start =
2898 IndexMetaDataKey::Encode(database_id, object_store_id, index_id, 0); 2900 IndexMetaDataKey::Encode(database_id, object_store_id, index_id, 0);
2899 const std::string index_meta_data_end = 2901 const std::string index_meta_data_end =
2900 IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id, index_id); 2902 IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id, index_id);
2901 leveldb::Status s = DeleteRangeBasic( 2903 leveldb::Status s = DeleteRangeBasic(
2902 leveldb_transaction, index_meta_data_start, index_meta_data_end, true); 2904 leveldb_transaction, index_meta_data_start, index_meta_data_end, true);
2903 2905
2904 if (s.ok()) { 2906 if (s.ok()) {
2905 const std::string index_data_start = 2907 const std::string index_data_start =
2906 IndexDataKey::EncodeMinKey(database_id, object_store_id, index_id); 2908 IndexDataKey::EncodeMinKey(database_id, object_store_id, index_id);
2907 const std::string index_data_end = 2909 const std::string index_data_end =
2908 IndexDataKey::EncodeMaxKey(database_id, object_store_id, index_id); 2910 IndexDataKey::EncodeMaxKey(database_id, object_store_id, index_id);
2909 s = DeleteRangeBasic( 2911 s = DeleteRangeBasic(
2910 leveldb_transaction, index_data_start, index_data_end, true); 2912 leveldb_transaction, index_data_start, index_data_end, true);
2911 } 2913 }
2912 2914
2913 if (!s.ok()) 2915 if (!s.ok())
2914 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_INDEX); 2916 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_INDEX);
2915 2917
2916 return s; 2918 return s;
2917 } 2919 }
2918 2920
2919 leveldb::Status IndexedDBBackingStore::PutIndexDataForRecord( 2921 leveldb::Status IndexedDBBackingStore::PutIndexDataForRecord(
2920 IndexedDBBackingStore::Transaction* transaction, 2922 IndexedDBBackingStore::Transaction* transaction,
2921 int64 database_id, 2923 int64_t database_id,
2922 int64 object_store_id, 2924 int64_t object_store_id,
2923 int64 index_id, 2925 int64_t index_id,
2924 const IndexedDBKey& key, 2926 const IndexedDBKey& key,
2925 const RecordIdentifier& record_identifier) { 2927 const RecordIdentifier& record_identifier) {
2926 IDB_TRACE("IndexedDBBackingStore::PutIndexDataForRecord"); 2928 IDB_TRACE("IndexedDBBackingStore::PutIndexDataForRecord");
2927 DCHECK(key.IsValid()); 2929 DCHECK(key.IsValid());
2928 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) 2930 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id))
2929 return InvalidDBKeyStatus(); 2931 return InvalidDBKeyStatus();
2930 2932
2931 std::string encoded_key; 2933 std::string encoded_key;
2932 EncodeIDBKey(key, &encoded_key); 2934 EncodeIDBKey(key, &encoded_key);
2933 2935
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2972 *found_key = it->Key().as_string(); 2974 *found_key = it->Key().as_string();
2973 2975
2974 // There can be several index keys that compare equal. We want the last one. 2976 // There can be several index keys that compare equal. We want the last one.
2975 *s = it->Next(); 2977 *s = it->Next();
2976 } while (s->ok() && it->IsValid() && !CompareIndexKeys(it->Key(), target)); 2978 } while (s->ok() && it->IsValid() && !CompareIndexKeys(it->Key(), target));
2977 2979
2978 return true; 2980 return true;
2979 } 2981 }
2980 2982
2981 static leveldb::Status VersionExists(LevelDBTransaction* transaction, 2983 static leveldb::Status VersionExists(LevelDBTransaction* transaction,
2982 int64 database_id, 2984 int64_t database_id,
2983 int64 object_store_id, 2985 int64_t object_store_id,
2984 int64 version, 2986 int64_t version,
2985 const std::string& encoded_primary_key, 2987 const std::string& encoded_primary_key,
2986 bool* exists) { 2988 bool* exists) {
2987 const std::string key = 2989 const std::string key =
2988 ExistsEntryKey::Encode(database_id, object_store_id, encoded_primary_key); 2990 ExistsEntryKey::Encode(database_id, object_store_id, encoded_primary_key);
2989 std::string data; 2991 std::string data;
2990 2992
2991 leveldb::Status s = transaction->Get(key, &data, exists); 2993 leveldb::Status s = transaction->Get(key, &data, exists);
2992 if (!s.ok()) { 2994 if (!s.ok()) {
2993 INTERNAL_READ_ERROR_UNTESTED(VERSION_EXISTS); 2995 INTERNAL_READ_ERROR_UNTESTED(VERSION_EXISTS);
2994 return s; 2996 return s;
2995 } 2997 }
2996 if (!*exists) 2998 if (!*exists)
2997 return s; 2999 return s;
2998 3000
2999 StringPiece slice(data); 3001 StringPiece slice(data);
3000 int64 decoded; 3002 int64_t decoded;
3001 if (!DecodeInt(&slice, &decoded) || !slice.empty()) 3003 if (!DecodeInt(&slice, &decoded) || !slice.empty())
3002 return InternalInconsistencyStatus(); 3004 return InternalInconsistencyStatus();
3003 *exists = (decoded == version); 3005 *exists = (decoded == version);
3004 return s; 3006 return s;
3005 } 3007 }
3006 3008
3007 leveldb::Status IndexedDBBackingStore::FindKeyInIndex( 3009 leveldb::Status IndexedDBBackingStore::FindKeyInIndex(
3008 IndexedDBBackingStore::Transaction* transaction, 3010 IndexedDBBackingStore::Transaction* transaction,
3009 int64 database_id, 3011 int64_t database_id,
3010 int64 object_store_id, 3012 int64_t object_store_id,
3011 int64 index_id, 3013 int64_t index_id,
3012 const IndexedDBKey& key, 3014 const IndexedDBKey& key,
3013 std::string* found_encoded_primary_key, 3015 std::string* found_encoded_primary_key,
3014 bool* found) { 3016 bool* found) {
3015 IDB_TRACE("IndexedDBBackingStore::FindKeyInIndex"); 3017 IDB_TRACE("IndexedDBBackingStore::FindKeyInIndex");
3016 DCHECK(KeyPrefix::ValidIds(database_id, object_store_id, index_id)); 3018 DCHECK(KeyPrefix::ValidIds(database_id, object_store_id, index_id));
3017 3019
3018 DCHECK(found_encoded_primary_key->empty()); 3020 DCHECK(found_encoded_primary_key->empty());
3019 *found = false; 3021 *found = false;
3020 3022
3021 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 3023 LevelDBTransaction* leveldb_transaction = transaction->transaction();
3022 const std::string leveldb_key = 3024 const std::string leveldb_key =
3023 IndexDataKey::Encode(database_id, object_store_id, index_id, key); 3025 IndexDataKey::Encode(database_id, object_store_id, index_id, key);
3024 scoped_ptr<LevelDBIterator> it = leveldb_transaction->CreateIterator(); 3026 scoped_ptr<LevelDBIterator> it = leveldb_transaction->CreateIterator();
3025 leveldb::Status s = it->Seek(leveldb_key); 3027 leveldb::Status s = it->Seek(leveldb_key);
3026 if (!s.ok()) { 3028 if (!s.ok()) {
3027 INTERNAL_READ_ERROR_UNTESTED(FIND_KEY_IN_INDEX); 3029 INTERNAL_READ_ERROR_UNTESTED(FIND_KEY_IN_INDEX);
3028 return s; 3030 return s;
3029 } 3031 }
3030 3032
3031 for (;;) { 3033 for (;;) {
3032 if (!it->IsValid()) 3034 if (!it->IsValid())
3033 return leveldb::Status::OK(); 3035 return leveldb::Status::OK();
3034 if (CompareIndexKeys(it->Key(), leveldb_key) > 0) 3036 if (CompareIndexKeys(it->Key(), leveldb_key) > 0)
3035 return leveldb::Status::OK(); 3037 return leveldb::Status::OK();
3036 3038
3037 StringPiece slice(it->Value()); 3039 StringPiece slice(it->Value());
3038 3040
3039 int64 version; 3041 int64_t version;
3040 if (!DecodeVarInt(&slice, &version)) { 3042 if (!DecodeVarInt(&slice, &version)) {
3041 INTERNAL_READ_ERROR_UNTESTED(FIND_KEY_IN_INDEX); 3043 INTERNAL_READ_ERROR_UNTESTED(FIND_KEY_IN_INDEX);
3042 return InternalInconsistencyStatus(); 3044 return InternalInconsistencyStatus();
3043 } 3045 }
3044 *found_encoded_primary_key = slice.as_string(); 3046 *found_encoded_primary_key = slice.as_string();
3045 3047
3046 bool exists = false; 3048 bool exists = false;
3047 s = VersionExists(leveldb_transaction, 3049 s = VersionExists(leveldb_transaction,
3048 database_id, 3050 database_id,
3049 object_store_id, 3051 object_store_id,
3050 version, 3052 version,
3051 *found_encoded_primary_key, 3053 *found_encoded_primary_key,
3052 &exists); 3054 &exists);
3053 if (!s.ok()) 3055 if (!s.ok())
3054 return s; 3056 return s;
3055 if (!exists) { 3057 if (!exists) {
3056 // Delete stale index data entry and continue. 3058 // Delete stale index data entry and continue.
3057 leveldb_transaction->Remove(it->Key()); 3059 leveldb_transaction->Remove(it->Key());
3058 s = it->Next(); 3060 s = it->Next();
3059 continue; 3061 continue;
3060 } 3062 }
3061 *found = true; 3063 *found = true;
3062 return s; 3064 return s;
3063 } 3065 }
3064 } 3066 }
3065 3067
3066 leveldb::Status IndexedDBBackingStore::GetPrimaryKeyViaIndex( 3068 leveldb::Status IndexedDBBackingStore::GetPrimaryKeyViaIndex(
3067 IndexedDBBackingStore::Transaction* transaction, 3069 IndexedDBBackingStore::Transaction* transaction,
3068 int64 database_id, 3070 int64_t database_id,
3069 int64 object_store_id, 3071 int64_t object_store_id,
3070 int64 index_id, 3072 int64_t index_id,
3071 const IndexedDBKey& key, 3073 const IndexedDBKey& key,
3072 scoped_ptr<IndexedDBKey>* primary_key) { 3074 scoped_ptr<IndexedDBKey>* primary_key) {
3073 IDB_TRACE("IndexedDBBackingStore::GetPrimaryKeyViaIndex"); 3075 IDB_TRACE("IndexedDBBackingStore::GetPrimaryKeyViaIndex");
3074 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) 3076 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id))
3075 return InvalidDBKeyStatus(); 3077 return InvalidDBKeyStatus();
3076 3078
3077 bool found = false; 3079 bool found = false;
3078 std::string found_encoded_primary_key; 3080 std::string found_encoded_primary_key;
3079 leveldb::Status s = FindKeyInIndex(transaction, 3081 leveldb::Status s = FindKeyInIndex(transaction,
3080 database_id, 3082 database_id,
(...skipping 15 matching lines...) Expand all
3096 3098
3097 StringPiece slice(found_encoded_primary_key); 3099 StringPiece slice(found_encoded_primary_key);
3098 if (DecodeIDBKey(&slice, primary_key) && slice.empty()) 3100 if (DecodeIDBKey(&slice, primary_key) && slice.empty())
3099 return s; 3101 return s;
3100 else 3102 else
3101 return InvalidDBKeyStatus(); 3103 return InvalidDBKeyStatus();
3102 } 3104 }
3103 3105
3104 leveldb::Status IndexedDBBackingStore::KeyExistsInIndex( 3106 leveldb::Status IndexedDBBackingStore::KeyExistsInIndex(
3105 IndexedDBBackingStore::Transaction* transaction, 3107 IndexedDBBackingStore::Transaction* transaction,
3106 int64 database_id, 3108 int64_t database_id,
3107 int64 object_store_id, 3109 int64_t object_store_id,
3108 int64 index_id, 3110 int64_t index_id,
3109 const IndexedDBKey& index_key, 3111 const IndexedDBKey& index_key,
3110 scoped_ptr<IndexedDBKey>* found_primary_key, 3112 scoped_ptr<IndexedDBKey>* found_primary_key,
3111 bool* exists) { 3113 bool* exists) {
3112 IDB_TRACE("IndexedDBBackingStore::KeyExistsInIndex"); 3114 IDB_TRACE("IndexedDBBackingStore::KeyExistsInIndex");
3113 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) 3115 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id))
3114 return InvalidDBKeyStatus(); 3116 return InvalidDBKeyStatus();
3115 3117
3116 *exists = false; 3118 *exists = false;
3117 std::string found_encoded_primary_key; 3119 std::string found_encoded_primary_key;
3118 leveldb::Status s = FindKeyInIndex(transaction, 3120 leveldb::Status s = FindKeyInIndex(transaction,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3154 leveldb::Status s = iterator_->Seek(other->iterator_->Key()); 3156 leveldb::Status s = iterator_->Seek(other->iterator_->Key());
3155 // TODO(cmumford): Handle this error (crbug.com/363397) 3157 // TODO(cmumford): Handle this error (crbug.com/363397)
3156 DCHECK(iterator_->IsValid()); 3158 DCHECK(iterator_->IsValid());
3157 } 3159 }
3158 } 3160 }
3159 } 3161 }
3160 3162
3161 IndexedDBBackingStore::Cursor::Cursor( 3163 IndexedDBBackingStore::Cursor::Cursor(
3162 scoped_refptr<IndexedDBBackingStore> backing_store, 3164 scoped_refptr<IndexedDBBackingStore> backing_store,
3163 IndexedDBBackingStore::Transaction* transaction, 3165 IndexedDBBackingStore::Transaction* transaction,
3164 int64 database_id, 3166 int64_t database_id,
3165 const CursorOptions& cursor_options) 3167 const CursorOptions& cursor_options)
3166 : backing_store_(backing_store.get()), 3168 : backing_store_(backing_store.get()),
3167 transaction_(transaction), 3169 transaction_(transaction),
3168 database_id_(database_id), 3170 database_id_(database_id),
3169 cursor_options_(cursor_options) { 3171 cursor_options_(cursor_options) {}
3170 }
3171 IndexedDBBackingStore::Cursor::~Cursor() {} 3172 IndexedDBBackingStore::Cursor::~Cursor() {}
3172 3173
3173 bool IndexedDBBackingStore::Cursor::FirstSeek(leveldb::Status* s) { 3174 bool IndexedDBBackingStore::Cursor::FirstSeek(leveldb::Status* s) {
3174 iterator_ = transaction_->transaction()->CreateIterator(); 3175 iterator_ = transaction_->transaction()->CreateIterator();
3175 if (cursor_options_.forward) 3176 if (cursor_options_.forward)
3176 *s = iterator_->Seek(cursor_options_.low_key); 3177 *s = iterator_->Seek(cursor_options_.low_key);
3177 else 3178 else
3178 *s = iterator_->Seek(cursor_options_.high_key); 3179 *s = iterator_->Seek(cursor_options_.high_key);
3179 if (!s->ok()) 3180 if (!s->ok())
3180 return false; 3181 return false;
3181 3182
3182 return Continue(0, READY, s); 3183 return Continue(0, READY, s);
3183 } 3184 }
3184 3185
3185 bool IndexedDBBackingStore::Cursor::Advance(uint32 count, leveldb::Status* s) { 3186 bool IndexedDBBackingStore::Cursor::Advance(uint32_t count,
3187 leveldb::Status* s) {
3186 *s = leveldb::Status::OK(); 3188 *s = leveldb::Status::OK();
3187 while (count--) { 3189 while (count--) {
3188 if (!Continue(s)) 3190 if (!Continue(s))
3189 return false; 3191 return false;
3190 } 3192 }
3191 return true; 3193 return true;
3192 } 3194 }
3193 3195
3194 bool IndexedDBBackingStore::Cursor::Continue(const IndexedDBKey* key, 3196 bool IndexedDBBackingStore::Cursor::Continue(const IndexedDBKey* key,
3195 const IndexedDBKey* primary_key, 3197 const IndexedDBKey* primary_key,
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
3416 const IndexedDBBackingStore::RecordIdentifier& 3418 const IndexedDBBackingStore::RecordIdentifier&
3417 IndexedDBBackingStore::Cursor::record_identifier() const { 3419 IndexedDBBackingStore::Cursor::record_identifier() const {
3418 return record_identifier_; 3420 return record_identifier_;
3419 } 3421 }
3420 3422
3421 class ObjectStoreKeyCursorImpl : public IndexedDBBackingStore::Cursor { 3423 class ObjectStoreKeyCursorImpl : public IndexedDBBackingStore::Cursor {
3422 public: 3424 public:
3423 ObjectStoreKeyCursorImpl( 3425 ObjectStoreKeyCursorImpl(
3424 scoped_refptr<IndexedDBBackingStore> backing_store, 3426 scoped_refptr<IndexedDBBackingStore> backing_store,
3425 IndexedDBBackingStore::Transaction* transaction, 3427 IndexedDBBackingStore::Transaction* transaction,
3426 int64 database_id, 3428 int64_t database_id,
3427 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options) 3429 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options)
3428 : IndexedDBBackingStore::Cursor(backing_store, 3430 : IndexedDBBackingStore::Cursor(backing_store,
3429 transaction, 3431 transaction,
3430 database_id, 3432 database_id,
3431 cursor_options) {} 3433 cursor_options) {}
3432 3434
3433 Cursor* Clone() override { return new ObjectStoreKeyCursorImpl(this); } 3435 Cursor* Clone() override { return new ObjectStoreKeyCursorImpl(this); }
3434 3436
3435 // IndexedDBBackingStore::Cursor 3437 // IndexedDBBackingStore::Cursor
3436 IndexedDBValue* value() override { 3438 IndexedDBValue* value() override {
(...skipping 24 matching lines...) Expand all
3461 StringPiece slice(iterator_->Key()); 3463 StringPiece slice(iterator_->Key());
3462 ObjectStoreDataKey object_store_data_key; 3464 ObjectStoreDataKey object_store_data_key;
3463 if (!ObjectStoreDataKey::Decode(&slice, &object_store_data_key)) { 3465 if (!ObjectStoreDataKey::Decode(&slice, &object_store_data_key)) {
3464 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3466 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3465 *s = InvalidDBKeyStatus(); 3467 *s = InvalidDBKeyStatus();
3466 return false; 3468 return false;
3467 } 3469 }
3468 3470
3469 current_key_ = object_store_data_key.user_key(); 3471 current_key_ = object_store_data_key.user_key();
3470 3472
3471 int64 version; 3473 int64_t version;
3472 slice = StringPiece(iterator_->Value()); 3474 slice = StringPiece(iterator_->Value());
3473 if (!DecodeVarInt(&slice, &version)) { 3475 if (!DecodeVarInt(&slice, &version)) {
3474 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3476 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3475 *s = InternalInconsistencyStatus(); 3477 *s = InternalInconsistencyStatus();
3476 return false; 3478 return false;
3477 } 3479 }
3478 3480
3479 // TODO(jsbell): This re-encodes what was just decoded; try and optimize. 3481 // TODO(jsbell): This re-encodes what was just decoded; try and optimize.
3480 std::string encoded_key; 3482 std::string encoded_key;
3481 EncodeIDBKey(*current_key_, &encoded_key); 3483 EncodeIDBKey(*current_key_, &encoded_key);
3482 record_identifier_.Reset(encoded_key, version); 3484 record_identifier_.Reset(encoded_key, version);
3483 3485
3484 return true; 3486 return true;
3485 } 3487 }
3486 3488
3487 class ObjectStoreCursorImpl : public IndexedDBBackingStore::Cursor { 3489 class ObjectStoreCursorImpl : public IndexedDBBackingStore::Cursor {
3488 public: 3490 public:
3489 ObjectStoreCursorImpl( 3491 ObjectStoreCursorImpl(
3490 scoped_refptr<IndexedDBBackingStore> backing_store, 3492 scoped_refptr<IndexedDBBackingStore> backing_store,
3491 IndexedDBBackingStore::Transaction* transaction, 3493 IndexedDBBackingStore::Transaction* transaction,
3492 int64 database_id, 3494 int64_t database_id,
3493 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options) 3495 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options)
3494 : IndexedDBBackingStore::Cursor(backing_store, 3496 : IndexedDBBackingStore::Cursor(backing_store,
3495 transaction, 3497 transaction,
3496 database_id, 3498 database_id,
3497 cursor_options) {} 3499 cursor_options) {}
3498 3500
3499 Cursor* Clone() override { return new ObjectStoreCursorImpl(this); } 3501 Cursor* Clone() override { return new ObjectStoreCursorImpl(this); }
3500 3502
3501 // IndexedDBBackingStore::Cursor 3503 // IndexedDBBackingStore::Cursor
3502 IndexedDBValue* value() override { return &current_value_; } 3504 IndexedDBValue* value() override { return &current_value_; }
(...skipping 24 matching lines...) Expand all
3527 StringPiece key_slice(iterator_->Key()); 3529 StringPiece key_slice(iterator_->Key());
3528 ObjectStoreDataKey object_store_data_key; 3530 ObjectStoreDataKey object_store_data_key;
3529 if (!ObjectStoreDataKey::Decode(&key_slice, &object_store_data_key)) { 3531 if (!ObjectStoreDataKey::Decode(&key_slice, &object_store_data_key)) {
3530 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3532 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3531 *s = InvalidDBKeyStatus(); 3533 *s = InvalidDBKeyStatus();
3532 return false; 3534 return false;
3533 } 3535 }
3534 3536
3535 current_key_ = object_store_data_key.user_key(); 3537 current_key_ = object_store_data_key.user_key();
3536 3538
3537 int64 version; 3539 int64_t version;
3538 StringPiece value_slice = StringPiece(iterator_->Value()); 3540 StringPiece value_slice = StringPiece(iterator_->Value());
3539 if (!DecodeVarInt(&value_slice, &version)) { 3541 if (!DecodeVarInt(&value_slice, &version)) {
3540 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3542 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3541 *s = InternalInconsistencyStatus(); 3543 *s = InternalInconsistencyStatus();
3542 return false; 3544 return false;
3543 } 3545 }
3544 3546
3545 // TODO(jsbell): This re-encodes what was just decoded; try and optimize. 3547 // TODO(jsbell): This re-encodes what was just decoded; try and optimize.
3546 std::string encoded_key; 3548 std::string encoded_key;
3547 EncodeIDBKey(*current_key_, &encoded_key); 3549 EncodeIDBKey(*current_key_, &encoded_key);
3548 record_identifier_.Reset(encoded_key, version); 3550 record_identifier_.Reset(encoded_key, version);
3549 3551
3550 *s = transaction_->GetBlobInfoForRecord( 3552 *s = transaction_->GetBlobInfoForRecord(
3551 database_id_, iterator_->Key().as_string(), &current_value_); 3553 database_id_, iterator_->Key().as_string(), &current_value_);
3552 if (!s->ok()) 3554 if (!s->ok())
3553 return false; 3555 return false;
3554 3556
3555 current_value_.bits = value_slice.as_string(); 3557 current_value_.bits = value_slice.as_string();
3556 return true; 3558 return true;
3557 } 3559 }
3558 3560
3559 class IndexKeyCursorImpl : public IndexedDBBackingStore::Cursor { 3561 class IndexKeyCursorImpl : public IndexedDBBackingStore::Cursor {
3560 public: 3562 public:
3561 IndexKeyCursorImpl( 3563 IndexKeyCursorImpl(
3562 scoped_refptr<IndexedDBBackingStore> backing_store, 3564 scoped_refptr<IndexedDBBackingStore> backing_store,
3563 IndexedDBBackingStore::Transaction* transaction, 3565 IndexedDBBackingStore::Transaction* transaction,
3564 int64 database_id, 3566 int64_t database_id,
3565 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options) 3567 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options)
3566 : IndexedDBBackingStore::Cursor(backing_store, 3568 : IndexedDBBackingStore::Cursor(backing_store,
3567 transaction, 3569 transaction,
3568 database_id, 3570 database_id,
3569 cursor_options) {} 3571 cursor_options) {}
3570 3572
3571 Cursor* Clone() override { return new IndexKeyCursorImpl(this); } 3573 Cursor* Clone() override { return new IndexKeyCursorImpl(this); }
3572 3574
3573 // IndexedDBBackingStore::Cursor 3575 // IndexedDBBackingStore::Cursor
3574 IndexedDBValue* value() override { 3576 IndexedDBValue* value() override {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3615 if (!IndexDataKey::Decode(&slice, &index_data_key)) { 3617 if (!IndexDataKey::Decode(&slice, &index_data_key)) {
3616 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3618 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3617 *s = InvalidDBKeyStatus(); 3619 *s = InvalidDBKeyStatus();
3618 return false; 3620 return false;
3619 } 3621 }
3620 3622
3621 current_key_ = index_data_key.user_key(); 3623 current_key_ = index_data_key.user_key();
3622 DCHECK(current_key_); 3624 DCHECK(current_key_);
3623 3625
3624 slice = StringPiece(iterator_->Value()); 3626 slice = StringPiece(iterator_->Value());
3625 int64 index_data_version; 3627 int64_t index_data_version;
3626 if (!DecodeVarInt(&slice, &index_data_version)) { 3628 if (!DecodeVarInt(&slice, &index_data_version)) {
3627 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3629 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3628 *s = InternalInconsistencyStatus(); 3630 *s = InternalInconsistencyStatus();
3629 return false; 3631 return false;
3630 } 3632 }
3631 3633
3632 if (!DecodeIDBKey(&slice, &primary_key_) || !slice.empty()) { 3634 if (!DecodeIDBKey(&slice, &primary_key_) || !slice.empty()) {
3633 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3635 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3634 *s = InternalInconsistencyStatus(); 3636 *s = InternalInconsistencyStatus();
3635 return false; 3637 return false;
(...skipping 13 matching lines...) Expand all
3649 } 3651 }
3650 if (!found) { 3652 if (!found) {
3651 transaction_->transaction()->Remove(iterator_->Key()); 3653 transaction_->transaction()->Remove(iterator_->Key());
3652 return false; 3654 return false;
3653 } 3655 }
3654 if (!result.size()) { 3656 if (!result.size()) {
3655 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3657 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3656 return false; 3658 return false;
3657 } 3659 }
3658 3660
3659 int64 object_store_data_version; 3661 int64_t object_store_data_version;
3660 slice = StringPiece(result); 3662 slice = StringPiece(result);
3661 if (!DecodeVarInt(&slice, &object_store_data_version)) { 3663 if (!DecodeVarInt(&slice, &object_store_data_version)) {
3662 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3664 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3663 *s = InternalInconsistencyStatus(); 3665 *s = InternalInconsistencyStatus();
3664 return false; 3666 return false;
3665 } 3667 }
3666 3668
3667 if (object_store_data_version != index_data_version) { 3669 if (object_store_data_version != index_data_version) {
3668 transaction_->transaction()->Remove(iterator_->Key()); 3670 transaction_->transaction()->Remove(iterator_->Key());
3669 return false; 3671 return false;
3670 } 3672 }
3671 3673
3672 return true; 3674 return true;
3673 } 3675 }
3674 3676
3675 class IndexCursorImpl : public IndexedDBBackingStore::Cursor { 3677 class IndexCursorImpl : public IndexedDBBackingStore::Cursor {
3676 public: 3678 public:
3677 IndexCursorImpl( 3679 IndexCursorImpl(
3678 scoped_refptr<IndexedDBBackingStore> backing_store, 3680 scoped_refptr<IndexedDBBackingStore> backing_store,
3679 IndexedDBBackingStore::Transaction* transaction, 3681 IndexedDBBackingStore::Transaction* transaction,
3680 int64 database_id, 3682 int64_t database_id,
3681 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options) 3683 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options)
3682 : IndexedDBBackingStore::Cursor(backing_store, 3684 : IndexedDBBackingStore::Cursor(backing_store,
3683 transaction, 3685 transaction,
3684 database_id, 3686 database_id,
3685 cursor_options) {} 3687 cursor_options) {}
3686 3688
3687 Cursor* Clone() override { return new IndexCursorImpl(this); } 3689 Cursor* Clone() override { return new IndexCursorImpl(this); }
3688 3690
3689 // IndexedDBBackingStore::Cursor 3691 // IndexedDBBackingStore::Cursor
3690 IndexedDBValue* value() override { return &current_value_; } 3692 IndexedDBValue* value() override { return &current_value_; }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3732 if (!IndexDataKey::Decode(&slice, &index_data_key)) { 3734 if (!IndexDataKey::Decode(&slice, &index_data_key)) {
3733 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3735 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3734 *s = InvalidDBKeyStatus(); 3736 *s = InvalidDBKeyStatus();
3735 return false; 3737 return false;
3736 } 3738 }
3737 3739
3738 current_key_ = index_data_key.user_key(); 3740 current_key_ = index_data_key.user_key();
3739 DCHECK(current_key_); 3741 DCHECK(current_key_);
3740 3742
3741 slice = StringPiece(iterator_->Value()); 3743 slice = StringPiece(iterator_->Value());
3742 int64 index_data_version; 3744 int64_t index_data_version;
3743 if (!DecodeVarInt(&slice, &index_data_version)) { 3745 if (!DecodeVarInt(&slice, &index_data_version)) {
3744 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3746 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3745 *s = InternalInconsistencyStatus(); 3747 *s = InternalInconsistencyStatus();
3746 return false; 3748 return false;
3747 } 3749 }
3748 if (!DecodeIDBKey(&slice, &primary_key_)) { 3750 if (!DecodeIDBKey(&slice, &primary_key_)) {
3749 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3751 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3750 *s = InvalidDBKeyStatus(); 3752 *s = InvalidDBKeyStatus();
3751 return false; 3753 return false;
3752 } 3754 }
(...skipping 13 matching lines...) Expand all
3766 } 3768 }
3767 if (!found) { 3769 if (!found) {
3768 transaction_->transaction()->Remove(iterator_->Key()); 3770 transaction_->transaction()->Remove(iterator_->Key());
3769 return false; 3771 return false;
3770 } 3772 }
3771 if (!result.size()) { 3773 if (!result.size()) {
3772 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3774 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3773 return false; 3775 return false;
3774 } 3776 }
3775 3777
3776 int64 object_store_data_version; 3778 int64_t object_store_data_version;
3777 slice = StringPiece(result); 3779 slice = StringPiece(result);
3778 if (!DecodeVarInt(&slice, &object_store_data_version)) { 3780 if (!DecodeVarInt(&slice, &object_store_data_version)) {
3779 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3781 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3780 *s = InternalInconsistencyStatus(); 3782 *s = InternalInconsistencyStatus();
3781 return false; 3783 return false;
3782 } 3784 }
3783 3785
3784 if (object_store_data_version != index_data_version) { 3786 if (object_store_data_version != index_data_version) {
3785 transaction_->transaction()->Remove(iterator_->Key()); 3787 transaction_->transaction()->Remove(iterator_->Key());
3786 return false; 3788 return false;
3787 } 3789 }
3788 3790
3789 current_value_.bits = slice.as_string(); 3791 current_value_.bits = slice.as_string();
3790 *s = transaction_->GetBlobInfoForRecord(database_id_, primary_leveldb_key_, 3792 *s = transaction_->GetBlobInfoForRecord(database_id_, primary_leveldb_key_,
3791 &current_value_); 3793 &current_value_);
3792 return s->ok(); 3794 return s->ok();
3793 } 3795 }
3794 3796
3795 bool ObjectStoreCursorOptions( 3797 bool ObjectStoreCursorOptions(
3796 LevelDBTransaction* transaction, 3798 LevelDBTransaction* transaction,
3797 int64 database_id, 3799 int64_t database_id,
3798 int64 object_store_id, 3800 int64_t object_store_id,
3799 const IndexedDBKeyRange& range, 3801 const IndexedDBKeyRange& range,
3800 blink::WebIDBCursorDirection direction, 3802 blink::WebIDBCursorDirection direction,
3801 IndexedDBBackingStore::Cursor::CursorOptions* cursor_options) { 3803 IndexedDBBackingStore::Cursor::CursorOptions* cursor_options) {
3802 cursor_options->database_id = database_id; 3804 cursor_options->database_id = database_id;
3803 cursor_options->object_store_id = object_store_id; 3805 cursor_options->object_store_id = object_store_id;
3804 3806
3805 bool lower_bound = range.lower().IsValid(); 3807 bool lower_bound = range.lower().IsValid();
3806 bool upper_bound = range.upper().IsValid(); 3808 bool upper_bound = range.upper().IsValid();
3807 cursor_options->forward = 3809 cursor_options->forward =
3808 (direction == blink::WebIDBCursorDirectionNextNoDuplicate || 3810 (direction == blink::WebIDBCursorDirectionNextNoDuplicate ||
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3860 3862
3861 cursor_options->high_key = found_high_key; 3863 cursor_options->high_key = found_high_key;
3862 } 3864 }
3863 } 3865 }
3864 3866
3865 return true; 3867 return true;
3866 } 3868 }
3867 3869
3868 bool IndexCursorOptions( 3870 bool IndexCursorOptions(
3869 LevelDBTransaction* transaction, 3871 LevelDBTransaction* transaction,
3870 int64 database_id, 3872 int64_t database_id,
3871 int64 object_store_id, 3873 int64_t object_store_id,
3872 int64 index_id, 3874 int64_t index_id,
3873 const IndexedDBKeyRange& range, 3875 const IndexedDBKeyRange& range,
3874 blink::WebIDBCursorDirection direction, 3876 blink::WebIDBCursorDirection direction,
3875 IndexedDBBackingStore::Cursor::CursorOptions* cursor_options) { 3877 IndexedDBBackingStore::Cursor::CursorOptions* cursor_options) {
3876 DCHECK(transaction); 3878 DCHECK(transaction);
3877 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) 3879 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id))
3878 return false; 3880 return false;
3879 3881
3880 cursor_options->database_id = database_id; 3882 cursor_options->database_id = database_id;
3881 cursor_options->object_store_id = object_store_id; 3883 cursor_options->object_store_id = object_store_id;
3882 cursor_options->index_id = index_id; 3884 cursor_options->index_id = index_id;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3935 3937
3936 cursor_options->high_key = found_high_key; 3938 cursor_options->high_key = found_high_key;
3937 } 3939 }
3938 3940
3939 return true; 3941 return true;
3940 } 3942 }
3941 3943
3942 scoped_ptr<IndexedDBBackingStore::Cursor> 3944 scoped_ptr<IndexedDBBackingStore::Cursor>
3943 IndexedDBBackingStore::OpenObjectStoreCursor( 3945 IndexedDBBackingStore::OpenObjectStoreCursor(
3944 IndexedDBBackingStore::Transaction* transaction, 3946 IndexedDBBackingStore::Transaction* transaction,
3945 int64 database_id, 3947 int64_t database_id,
3946 int64 object_store_id, 3948 int64_t object_store_id,
3947 const IndexedDBKeyRange& range, 3949 const IndexedDBKeyRange& range,
3948 blink::WebIDBCursorDirection direction, 3950 blink::WebIDBCursorDirection direction,
3949 leveldb::Status* s) { 3951 leveldb::Status* s) {
3950 IDB_TRACE("IndexedDBBackingStore::OpenObjectStoreCursor"); 3952 IDB_TRACE("IndexedDBBackingStore::OpenObjectStoreCursor");
3951 *s = leveldb::Status::OK(); 3953 *s = leveldb::Status::OK();
3952 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 3954 LevelDBTransaction* leveldb_transaction = transaction->transaction();
3953 IndexedDBBackingStore::Cursor::CursorOptions cursor_options; 3955 IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
3954 if (!ObjectStoreCursorOptions(leveldb_transaction, 3956 if (!ObjectStoreCursorOptions(leveldb_transaction,
3955 database_id, 3957 database_id,
3956 object_store_id, 3958 object_store_id,
3957 range, 3959 range,
3958 direction, 3960 direction,
3959 &cursor_options)) 3961 &cursor_options))
3960 return scoped_ptr<IndexedDBBackingStore::Cursor>(); 3962 return scoped_ptr<IndexedDBBackingStore::Cursor>();
3961 scoped_ptr<ObjectStoreCursorImpl> cursor(new ObjectStoreCursorImpl( 3963 scoped_ptr<ObjectStoreCursorImpl> cursor(new ObjectStoreCursorImpl(
3962 this, transaction, database_id, cursor_options)); 3964 this, transaction, database_id, cursor_options));
3963 if (!cursor->FirstSeek(s)) 3965 if (!cursor->FirstSeek(s))
3964 return scoped_ptr<IndexedDBBackingStore::Cursor>(); 3966 return scoped_ptr<IndexedDBBackingStore::Cursor>();
3965 3967
3966 return cursor.Pass(); 3968 return cursor.Pass();
3967 } 3969 }
3968 3970
3969 scoped_ptr<IndexedDBBackingStore::Cursor> 3971 scoped_ptr<IndexedDBBackingStore::Cursor>
3970 IndexedDBBackingStore::OpenObjectStoreKeyCursor( 3972 IndexedDBBackingStore::OpenObjectStoreKeyCursor(
3971 IndexedDBBackingStore::Transaction* transaction, 3973 IndexedDBBackingStore::Transaction* transaction,
3972 int64 database_id, 3974 int64_t database_id,
3973 int64 object_store_id, 3975 int64_t object_store_id,
3974 const IndexedDBKeyRange& range, 3976 const IndexedDBKeyRange& range,
3975 blink::WebIDBCursorDirection direction, 3977 blink::WebIDBCursorDirection direction,
3976 leveldb::Status* s) { 3978 leveldb::Status* s) {
3977 IDB_TRACE("IndexedDBBackingStore::OpenObjectStoreKeyCursor"); 3979 IDB_TRACE("IndexedDBBackingStore::OpenObjectStoreKeyCursor");
3978 *s = leveldb::Status::OK(); 3980 *s = leveldb::Status::OK();
3979 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 3981 LevelDBTransaction* leveldb_transaction = transaction->transaction();
3980 IndexedDBBackingStore::Cursor::CursorOptions cursor_options; 3982 IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
3981 if (!ObjectStoreCursorOptions(leveldb_transaction, 3983 if (!ObjectStoreCursorOptions(leveldb_transaction,
3982 database_id, 3984 database_id,
3983 object_store_id, 3985 object_store_id,
3984 range, 3986 range,
3985 direction, 3987 direction,
3986 &cursor_options)) 3988 &cursor_options))
3987 return scoped_ptr<IndexedDBBackingStore::Cursor>(); 3989 return scoped_ptr<IndexedDBBackingStore::Cursor>();
3988 scoped_ptr<ObjectStoreKeyCursorImpl> cursor(new ObjectStoreKeyCursorImpl( 3990 scoped_ptr<ObjectStoreKeyCursorImpl> cursor(new ObjectStoreKeyCursorImpl(
3989 this, transaction, database_id, cursor_options)); 3991 this, transaction, database_id, cursor_options));
3990 if (!cursor->FirstSeek(s)) 3992 if (!cursor->FirstSeek(s))
3991 return scoped_ptr<IndexedDBBackingStore::Cursor>(); 3993 return scoped_ptr<IndexedDBBackingStore::Cursor>();
3992 3994
3993 return cursor.Pass(); 3995 return cursor.Pass();
3994 } 3996 }
3995 3997
3996 scoped_ptr<IndexedDBBackingStore::Cursor> 3998 scoped_ptr<IndexedDBBackingStore::Cursor>
3997 IndexedDBBackingStore::OpenIndexKeyCursor( 3999 IndexedDBBackingStore::OpenIndexKeyCursor(
3998 IndexedDBBackingStore::Transaction* transaction, 4000 IndexedDBBackingStore::Transaction* transaction,
3999 int64 database_id, 4001 int64_t database_id,
4000 int64 object_store_id, 4002 int64_t object_store_id,
4001 int64 index_id, 4003 int64_t index_id,
4002 const IndexedDBKeyRange& range, 4004 const IndexedDBKeyRange& range,
4003 blink::WebIDBCursorDirection direction, 4005 blink::WebIDBCursorDirection direction,
4004 leveldb::Status* s) { 4006 leveldb::Status* s) {
4005 IDB_TRACE("IndexedDBBackingStore::OpenIndexKeyCursor"); 4007 IDB_TRACE("IndexedDBBackingStore::OpenIndexKeyCursor");
4006 *s = leveldb::Status::OK(); 4008 *s = leveldb::Status::OK();
4007 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 4009 LevelDBTransaction* leveldb_transaction = transaction->transaction();
4008 IndexedDBBackingStore::Cursor::CursorOptions cursor_options; 4010 IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
4009 if (!IndexCursorOptions(leveldb_transaction, 4011 if (!IndexCursorOptions(leveldb_transaction,
4010 database_id, 4012 database_id,
4011 object_store_id, 4013 object_store_id,
4012 index_id, 4014 index_id,
4013 range, 4015 range,
4014 direction, 4016 direction,
4015 &cursor_options)) 4017 &cursor_options))
4016 return scoped_ptr<IndexedDBBackingStore::Cursor>(); 4018 return scoped_ptr<IndexedDBBackingStore::Cursor>();
4017 scoped_ptr<IndexKeyCursorImpl> cursor( 4019 scoped_ptr<IndexKeyCursorImpl> cursor(
4018 new IndexKeyCursorImpl(this, transaction, database_id, cursor_options)); 4020 new IndexKeyCursorImpl(this, transaction, database_id, cursor_options));
4019 if (!cursor->FirstSeek(s)) 4021 if (!cursor->FirstSeek(s))
4020 return scoped_ptr<IndexedDBBackingStore::Cursor>(); 4022 return scoped_ptr<IndexedDBBackingStore::Cursor>();
4021 4023
4022 return cursor.Pass(); 4024 return cursor.Pass();
4023 } 4025 }
4024 4026
4025 scoped_ptr<IndexedDBBackingStore::Cursor> 4027 scoped_ptr<IndexedDBBackingStore::Cursor>
4026 IndexedDBBackingStore::OpenIndexCursor( 4028 IndexedDBBackingStore::OpenIndexCursor(
4027 IndexedDBBackingStore::Transaction* transaction, 4029 IndexedDBBackingStore::Transaction* transaction,
4028 int64 database_id, 4030 int64_t database_id,
4029 int64 object_store_id, 4031 int64_t object_store_id,
4030 int64 index_id, 4032 int64_t index_id,
4031 const IndexedDBKeyRange& range, 4033 const IndexedDBKeyRange& range,
4032 blink::WebIDBCursorDirection direction, 4034 blink::WebIDBCursorDirection direction,
4033 leveldb::Status* s) { 4035 leveldb::Status* s) {
4034 IDB_TRACE("IndexedDBBackingStore::OpenIndexCursor"); 4036 IDB_TRACE("IndexedDBBackingStore::OpenIndexCursor");
4035 LevelDBTransaction* leveldb_transaction = transaction->transaction(); 4037 LevelDBTransaction* leveldb_transaction = transaction->transaction();
4036 IndexedDBBackingStore::Cursor::CursorOptions cursor_options; 4038 IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
4037 if (!IndexCursorOptions(leveldb_transaction, 4039 if (!IndexCursorOptions(leveldb_transaction,
4038 database_id, 4040 database_id,
4039 object_store_id, 4041 object_store_id,
4040 index_id, 4042 index_id,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4093 return leveldb::Status::OK(); 4095 return leveldb::Status::OK();
4094 4096
4095 // Create LevelDBTransaction for the name generator seed and add-journal. 4097 // Create LevelDBTransaction for the name generator seed and add-journal.
4096 scoped_refptr<LevelDBTransaction> pre_transaction = 4098 scoped_refptr<LevelDBTransaction> pre_transaction =
4097 IndexedDBClassFactory::Get()->CreateLevelDBTransaction( 4099 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(
4098 backing_store_->db_.get()); 4100 backing_store_->db_.get());
4099 4101
4100 for (auto& iter : blob_change_map_) { 4102 for (auto& iter : blob_change_map_) {
4101 std::vector<IndexedDBBlobInfo*> new_blob_keys; 4103 std::vector<IndexedDBBlobInfo*> new_blob_keys;
4102 for (auto& entry : iter.second->mutable_blob_info()) { 4104 for (auto& entry : iter.second->mutable_blob_info()) {
4103 int64 next_blob_key = -1; 4105 int64_t next_blob_key = -1;
4104 bool result = GetBlobKeyGeneratorCurrentNumber( 4106 bool result = GetBlobKeyGeneratorCurrentNumber(
4105 pre_transaction.get(), database_id_, &next_blob_key); 4107 pre_transaction.get(), database_id_, &next_blob_key);
4106 if (!result || next_blob_key < 0) 4108 if (!result || next_blob_key < 0)
4107 return InternalInconsistencyStatus(); 4109 return InternalInconsistencyStatus();
4108 blobs_to_write_.push_back(std::make_pair(database_id_, next_blob_key)); 4110 blobs_to_write_.push_back(std::make_pair(database_id_, next_blob_key));
4109 if (entry.is_file() && !entry.file_path().empty()) { 4111 if (entry.is_file() && !entry.file_path().empty()) {
4110 new_files_to_write->push_back( 4112 new_files_to_write->push_back(
4111 WriteDescriptor(entry.file_path(), next_blob_key, entry.size(), 4113 WriteDescriptor(entry.file_path(), next_blob_key, entry.size(),
4112 entry.last_modified())); 4114 entry.last_modified()));
4113 } else { 4115 } else {
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
4394 chained_blob_writer_ = NULL; 4396 chained_blob_writer_ = NULL;
4395 } 4397 }
4396 if (transaction_.get() == NULL) 4398 if (transaction_.get() == NULL)
4397 return; 4399 return;
4398 transaction_->Rollback(); 4400 transaction_->Rollback();
4399 transaction_ = NULL; 4401 transaction_ = NULL;
4400 } 4402 }
4401 4403
4402 IndexedDBBackingStore::BlobChangeRecord::BlobChangeRecord( 4404 IndexedDBBackingStore::BlobChangeRecord::BlobChangeRecord(
4403 const std::string& key, 4405 const std::string& key,
4404 int64 object_store_id) 4406 int64_t object_store_id)
4405 : key_(key), object_store_id_(object_store_id) { 4407 : key_(key), object_store_id_(object_store_id) {}
4406 }
4407 4408
4408 IndexedDBBackingStore::BlobChangeRecord::~BlobChangeRecord() { 4409 IndexedDBBackingStore::BlobChangeRecord::~BlobChangeRecord() {
4409 } 4410 }
4410 4411
4411 void IndexedDBBackingStore::BlobChangeRecord::SetBlobInfo( 4412 void IndexedDBBackingStore::BlobChangeRecord::SetBlobInfo(
4412 std::vector<IndexedDBBlobInfo>* blob_info) { 4413 std::vector<IndexedDBBlobInfo>* blob_info) {
4413 blob_info_.clear(); 4414 blob_info_.clear();
4414 if (blob_info) 4415 if (blob_info)
4415 blob_info_.swap(*blob_info); 4416 blob_info_.swap(*blob_info);
4416 } 4417 }
(...skipping 10 matching lines...) Expand all
4427 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> record( 4428 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> record(
4428 new BlobChangeRecord(key_, object_store_id_)); 4429 new BlobChangeRecord(key_, object_store_id_));
4429 record->blob_info_ = blob_info_; 4430 record->blob_info_ = blob_info_;
4430 4431
4431 for (const auto* handle : handles_) 4432 for (const auto* handle : handles_)
4432 record->handles_.push_back(new storage::BlobDataHandle(*handle)); 4433 record->handles_.push_back(new storage::BlobDataHandle(*handle));
4433 return record.Pass(); 4434 return record.Pass();
4434 } 4435 }
4435 4436
4436 leveldb::Status IndexedDBBackingStore::Transaction::PutBlobInfoIfNeeded( 4437 leveldb::Status IndexedDBBackingStore::Transaction::PutBlobInfoIfNeeded(
4437 int64 database_id, 4438 int64_t database_id,
4438 int64 object_store_id, 4439 int64_t object_store_id,
4439 const std::string& object_store_data_key, 4440 const std::string& object_store_data_key,
4440 std::vector<IndexedDBBlobInfo>* blob_info, 4441 std::vector<IndexedDBBlobInfo>* blob_info,
4441 ScopedVector<storage::BlobDataHandle>* handles) { 4442 ScopedVector<storage::BlobDataHandle>* handles) {
4442 if (!blob_info || blob_info->empty()) { 4443 if (!blob_info || blob_info->empty()) {
4443 blob_change_map_.erase(object_store_data_key); 4444 blob_change_map_.erase(object_store_data_key);
4444 incognito_blob_map_.erase(object_store_data_key); 4445 incognito_blob_map_.erase(object_store_data_key);
4445 4446
4446 BlobEntryKey blob_entry_key; 4447 BlobEntryKey blob_entry_key;
4447 StringPiece leveldb_key_piece(object_store_data_key); 4448 StringPiece leveldb_key_piece(object_store_data_key);
4448 if (!BlobEntryKey::FromObjectStoreDataKey(&leveldb_key_piece, 4449 if (!BlobEntryKey::FromObjectStoreDataKey(&leveldb_key_piece,
(...skipping 13 matching lines...) Expand all
4462 PutBlobInfo( 4463 PutBlobInfo(
4463 database_id, object_store_id, object_store_data_key, blob_info, handles); 4464 database_id, object_store_id, object_store_data_key, blob_info, handles);
4464 return leveldb::Status::OK(); 4465 return leveldb::Status::OK();
4465 } 4466 }
4466 4467
4467 // This is storing an info, even if empty, even if the previous key had no blob 4468 // This is storing an info, even if empty, even if the previous key had no blob
4468 // info that we know of. It duplicates a bunch of information stored in the 4469 // info that we know of. It duplicates a bunch of information stored in the
4469 // leveldb transaction, but only w.r.t. the user keys altered--we don't keep the 4470 // leveldb transaction, but only w.r.t. the user keys altered--we don't keep the
4470 // changes to exists or index keys here. 4471 // changes to exists or index keys here.
4471 void IndexedDBBackingStore::Transaction::PutBlobInfo( 4472 void IndexedDBBackingStore::Transaction::PutBlobInfo(
4472 int64 database_id, 4473 int64_t database_id,
4473 int64 object_store_id, 4474 int64_t object_store_id,
4474 const std::string& object_store_data_key, 4475 const std::string& object_store_data_key,
4475 std::vector<IndexedDBBlobInfo>* blob_info, 4476 std::vector<IndexedDBBlobInfo>* blob_info,
4476 ScopedVector<storage::BlobDataHandle>* handles) { 4477 ScopedVector<storage::BlobDataHandle>* handles) {
4477 DCHECK_GT(object_store_data_key.size(), 0UL); 4478 DCHECK_GT(object_store_data_key.size(), 0UL);
4478 if (database_id_ < 0) 4479 if (database_id_ < 0)
4479 database_id_ = database_id; 4480 database_id_ = database_id;
4480 DCHECK_EQ(database_id_, database_id); 4481 DCHECK_EQ(database_id_, database_id);
4481 4482
4482 BlobChangeMap::iterator it = blob_change_map_.find(object_store_data_key); 4483 BlobChangeMap::iterator it = blob_change_map_.find(object_store_data_key);
4483 BlobChangeRecord* record = NULL; 4484 BlobChangeRecord* record = NULL;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4519 4520
4520 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( 4521 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor(
4521 const WriteDescriptor& other) = default; 4522 const WriteDescriptor& other) = default;
4522 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = 4523 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() =
4523 default; 4524 default;
4524 IndexedDBBackingStore::Transaction::WriteDescriptor& 4525 IndexedDBBackingStore::Transaction::WriteDescriptor&
4525 IndexedDBBackingStore::Transaction::WriteDescriptor:: 4526 IndexedDBBackingStore::Transaction::WriteDescriptor::
4526 operator=(const WriteDescriptor& other) = default; 4527 operator=(const WriteDescriptor& other) = default;
4527 4528
4528 } // namespace content 4529 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/indexed_db/indexed_db_backing_store.h ('k') | content/browser/indexed_db/indexed_db_backing_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698