Chromium Code Reviews| OLD | NEW |
|---|---|
| 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_leveldb_coding.h" | 5 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 size_t count = array.size(); | 368 size_t count = array.size(); |
| 369 EncodeVarInt(count, into); | 369 EncodeVarInt(count, into); |
| 370 for (size_t i = 0; i < count; ++i) { | 370 for (size_t i = 0; i < count; ++i) { |
| 371 EncodeStringWithLength(array[i], into); | 371 EncodeStringWithLength(array[i], into); |
| 372 } | 372 } |
| 373 break; | 373 break; |
| 374 } | 374 } |
| 375 } | 375 } |
| 376 } | 376 } |
| 377 | 377 |
| 378 void EncodeBlobJournal(const BlobJournalType& journal, std::string* into) { | |
| 379 BlobJournalType::const_iterator iter; | |
| 380 for (iter = journal.begin(); iter != journal.end(); ++iter) { | |
|
cmumford
2014/04/30 21:29:30
If the journal is empty (which may not be possible
ericu
2014/04/30 22:16:10
Yes. The convention in this file is that all Enco
| |
| 381 EncodeVarInt(iter->first, into); | |
| 382 EncodeVarInt(iter->second, into); | |
| 383 } | |
| 384 } | |
| 385 | |
| 378 bool DecodeByte(StringPiece* slice, unsigned char* value) { | 386 bool DecodeByte(StringPiece* slice, unsigned char* value) { |
| 379 if (slice->empty()) | 387 if (slice->empty()) |
| 380 return false; | 388 return false; |
| 381 | 389 |
| 382 *value = (*slice)[0]; | 390 *value = (*slice)[0]; |
| 383 slice->remove_prefix(1); | 391 slice->remove_prefix(1); |
| 384 return true; | 392 return true; |
| 385 } | 393 } |
| 386 | 394 |
| 387 bool DecodeBool(StringPiece* slice, bool* value) { | 395 bool DecodeBool(StringPiece* slice, bool* value) { |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 600 } | 608 } |
| 601 DCHECK(slice->empty()); | 609 DCHECK(slice->empty()); |
| 602 *value = IndexedDBKeyPath(array); | 610 *value = IndexedDBKeyPath(array); |
| 603 return true; | 611 return true; |
| 604 } | 612 } |
| 605 } | 613 } |
| 606 NOTREACHED(); | 614 NOTREACHED(); |
| 607 return false; | 615 return false; |
| 608 } | 616 } |
| 609 | 617 |
| 618 bool DecodeBlobJournal(StringPiece* slice, BlobJournalType* journal) { | |
| 619 BlobJournalType output; | |
|
cmumford
2014/04/30 21:29:30
Should an empty slice be considered an error?
ericu
2014/04/30 22:16:10
No, that's an empty journal.
| |
| 620 while (!slice->empty()) { | |
| 621 int64 database_id = -1; | |
| 622 int64 blob_key = -1; | |
| 623 if (!DecodeVarInt(slice, &database_id)) | |
| 624 return false; | |
| 625 if (!KeyPrefix::IsValidDatabaseId(database_id)) | |
| 626 return false; | |
| 627 if (!DecodeVarInt(slice, &blob_key)) | |
| 628 return false; | |
| 629 if (!DatabaseMetaDataKey::IsValidBlobKey(blob_key) && | |
| 630 (blob_key != DatabaseMetaDataKey::kAllBlobsKey)) { | |
| 631 return false; | |
| 632 } | |
| 633 output.push_back(std::make_pair(database_id, blob_key)); | |
| 634 } | |
| 635 journal->swap(output); | |
| 636 return true; | |
| 637 } | |
| 638 | |
| 610 bool ConsumeEncodedIDBKey(StringPiece* slice) { | 639 bool ConsumeEncodedIDBKey(StringPiece* slice) { |
| 611 unsigned char type = (*slice)[0]; | 640 unsigned char type = (*slice)[0]; |
| 612 slice->remove_prefix(1); | 641 slice->remove_prefix(1); |
| 613 | 642 |
| 614 switch (type) { | 643 switch (type) { |
| 615 case kIndexedDBKeyNullTypeByte: | 644 case kIndexedDBKeyNullTypeByte: |
| 616 case kIndexedDBKeyMinKeyTypeByte: | 645 case kIndexedDBKeyMinKeyTypeByte: |
| 617 return true; | 646 return true; |
| 618 case kIndexedDBKeyArrayTypeByte: { | 647 case kIndexedDBKeyArrayTypeByte: { |
| 619 int64 length; | 648 int64 length; |
| (...skipping 1380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2000 scoped_ptr<IndexedDBKey> IndexDataKey::primary_key() const { | 2029 scoped_ptr<IndexedDBKey> IndexDataKey::primary_key() const { |
| 2001 scoped_ptr<IndexedDBKey> key; | 2030 scoped_ptr<IndexedDBKey> key; |
| 2002 StringPiece slice(encoded_primary_key_); | 2031 StringPiece slice(encoded_primary_key_); |
| 2003 if (!DecodeIDBKey(&slice, &key)) { | 2032 if (!DecodeIDBKey(&slice, &key)) { |
| 2004 // TODO(jsbell): Return error. | 2033 // TODO(jsbell): Return error. |
| 2005 } | 2034 } |
| 2006 return key.Pass(); | 2035 return key.Pass(); |
| 2007 } | 2036 } |
| 2008 | 2037 |
| 2009 } // namespace content | 2038 } // namespace content |
| OLD | NEW |