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 |