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

Side by Side Diff: Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.cpp

Issue 12310146: Merge 143347 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1364/
Patch Set: Created 7 years, 9 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 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 Vector<char> ret = encodeVarInt(s.length()); 328 Vector<char> ret = encodeVarInt(s.length());
329 ret.append(encodeString(s)); 329 ret.append(encodeString(s));
330 return ret; 330 return ret;
331 } 331 }
332 332
333 const char* decodeStringWithLength(const char* p, const char* limit, String& fou ndString) 333 const char* decodeStringWithLength(const char* p, const char* limit, String& fou ndString)
334 { 334 {
335 ASSERT(limit >= p); 335 ASSERT(limit >= p);
336 int64_t len; 336 int64_t len;
337 p = decodeVarInt(p, limit, len); 337 p = decodeVarInt(p, limit, len);
338 if (!p) 338 if (!p || len < 0 || p + len * 2 > limit)
339 return 0;
340 if (p + len * 2 > limit)
341 return 0; 339 return 0;
342 340
343 foundString = decodeString(p, p + len * 2); 341 foundString = decodeString(p, p + len * 2);
344 p += len * 2; 342 p += len * 2;
345 return p; 343 return p;
346 } 344 }
347 345
348 int compareEncodedStringsWithLength(const char*& p, const char* limitP, const ch ar*& q, const char* limitQ) 346 int compareEncodedStringsWithLength(const char*& p, const char* limitP, const ch ar*& q, const char* limitQ, bool& ok)
349 { 347 {
350 ASSERT(&p != &q); 348 ASSERT(&p != &q);
351 ASSERT(limitP >= p); 349 ASSERT(limitP >= p);
352 ASSERT(limitQ >= q); 350 ASSERT(limitQ >= q);
353 int64_t lenP, lenQ; 351 int64_t lenP, lenQ;
354 p = decodeVarInt(p, limitP, lenP); 352 p = decodeVarInt(p, limitP, lenP);
355 q = decodeVarInt(q, limitQ, lenQ); 353 q = decodeVarInt(q, limitQ, lenQ);
354 if (!p || !q || lenP < 0 || lenQ < 0) {
355 ok = false;
356 return 0;
357 }
356 ASSERT(p && q); 358 ASSERT(p && q);
357 ASSERT(lenP >= 0); 359 ASSERT(lenP >= 0);
358 ASSERT(lenQ >= 0); 360 ASSERT(lenQ >= 0);
359 ASSERT(p + lenP * 2 <= limitP); 361 ASSERT(p + lenP * 2 <= limitP);
360 ASSERT(q + lenQ * 2 <= limitQ); 362 ASSERT(q + lenQ * 2 <= limitQ);
361 363
362 const char* startP = p; 364 const char* startP = p;
363 const char* startQ = q; 365 const char* startQ = q;
364 p += lenP * 2; 366 p += lenP * 2;
365 q += lenQ * 2; 367 q += lenQ * 2;
366 368
367 if (p > limitP || q > limitQ) 369 if (p > limitP || q > limitQ) {
370 ok = false;
368 return 0; 371 return 0;
372 }
369 373
374 ok = true;
370 const size_t lmin = static_cast<size_t>(lenP < lenQ ? lenP : lenQ); 375 const size_t lmin = static_cast<size_t>(lenP < lenQ ? lenP : lenQ);
371 if (int x = memcmp(startP, startQ, lmin * 2)) 376 if (int x = memcmp(startP, startQ, lmin * 2))
372 return x; 377 return x;
373 378
374 if (lenP == lenQ) 379 if (lenP == lenQ)
375 return 0; 380 return 0;
376 381
377 return (lenP > lenQ) ? 1 : -1; 382 return (lenP > lenQ) ? 1 : -1;
378 } 383 }
379 384
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 unsigned char type = *p++; 460 unsigned char type = *p++;
456 461
457 switch (type) { 462 switch (type) {
458 case IDBKeyNullTypeByte: 463 case IDBKeyNullTypeByte:
459 foundKey = IDBKey::createInvalid(); 464 foundKey = IDBKey::createInvalid();
460 return p; 465 return p;
461 466
462 case IDBKeyArrayTypeByte: { 467 case IDBKeyArrayTypeByte: {
463 int64_t length; 468 int64_t length;
464 p = decodeVarInt(p, limit, length); 469 p = decodeVarInt(p, limit, length);
465 if (!p) 470 if (!p || length < 0)
466 return 0;
467 if (length < 0)
468 return 0; 471 return 0;
469 IDBKey::KeyArray array; 472 IDBKey::KeyArray array;
470 while (length--) { 473 while (length--) {
471 RefPtr<IDBKey> key; 474 RefPtr<IDBKey> key;
472 p = decodeIDBKey(p, limit, key); 475 p = decodeIDBKey(p, limit, key);
473 if (!p) 476 if (!p)
474 return 0; 477 return 0;
475 array.append(key); 478 array.append(key);
476 } 479 }
477 foundKey = IDBKey::createArray(array); 480 foundKey = IDBKey::createArray(array);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 518
516 unsigned char type = *p++; 519 unsigned char type = *p++;
517 520
518 switch (type) { 521 switch (type) {
519 case IDBKeyNullTypeByte: 522 case IDBKeyNullTypeByte:
520 case IDBKeyMinKeyTypeByte: 523 case IDBKeyMinKeyTypeByte:
521 break; 524 break;
522 case IDBKeyArrayTypeByte: { 525 case IDBKeyArrayTypeByte: {
523 int64_t length; 526 int64_t length;
524 p = decodeVarInt(p, limit, length); 527 p = decodeVarInt(p, limit, length);
525 if (!p) 528 if (!p || length < 0)
526 return 0;
527 if (length < 0)
528 return 0; 529 return 0;
529 while (length--) { 530 while (length--) {
530 p = extractEncodedIDBKey(p, limit); 531 p = extractEncodedIDBKey(p, limit);
531 if (!p) 532 if (!p)
532 return 0; 533 return 0;
533 } 534 }
534 break; 535 break;
535 } 536 }
536 case IDBKeyStringTypeByte: { 537 case IDBKeyStringTypeByte: {
537 int64_t length; 538 int64_t length;
538 p = decodeVarInt(p, limit, length); 539 p = decodeVarInt(p, limit, length);
539 if (!p) 540 if (!p || length < 0 || p + length * 2 > limit)
540 return 0;
541 if (p + length * 2 > limit)
542 return 0; 541 return 0;
543 p += length * 2; 542 p += length * 2;
544 break; 543 break;
545 } 544 }
546 case IDBKeyDateTypeByte: 545 case IDBKeyDateTypeByte:
547 case IDBKeyNumberTypeByte: 546 case IDBKeyNumberTypeByte:
548 if (p + sizeof(double) > limit) 547 if (p + sizeof(double) > limit)
549 return 0; 548 return 0;
550 p += sizeof(double); 549 p += sizeof(double);
551 break; 550 break;
(...skipping 23 matching lines...) Expand all
575 case IDBKeyNumberTypeByte: 574 case IDBKeyNumberTypeByte:
576 return IDBKey::NumberType; 575 return IDBKey::NumberType;
577 case IDBKeyMinKeyTypeByte: 576 case IDBKeyMinKeyTypeByte:
578 return IDBKey::MinType; 577 return IDBKey::MinType;
579 } 578 }
580 579
581 ASSERT_NOT_REACHED(); 580 ASSERT_NOT_REACHED();
582 return IDBKey::InvalidType; 581 return IDBKey::InvalidType;
583 } 582 }
584 583
585 int compareEncodedIDBKeys(const char*& ptrA, const char* limitA, const char*& pt rB, const char* limitB) 584 int compareEncodedIDBKeys(const char*& ptrA, const char* limitA, const char*& pt rB, const char* limitB, bool& ok)
586 { 585 {
586 ok = true;
587 ASSERT(&ptrA != &ptrB); 587 ASSERT(&ptrA != &ptrB);
588 ASSERT(ptrA < limitA); 588 ASSERT(ptrA < limitA);
589 ASSERT(ptrB < limitB); 589 ASSERT(ptrB < limitB);
590 unsigned char typeA = *ptrA++; 590 unsigned char typeA = *ptrA++;
591 unsigned char typeB = *ptrB++; 591 unsigned char typeB = *ptrB++;
592 592
593 if (int x = IDBKey::compareTypes(keyTypeByteToKeyType(typeA), keyTypeByteToK eyType(typeB))) 593 if (int x = IDBKey::compareTypes(keyTypeByteToKeyType(typeA), keyTypeByteToK eyType(typeB)))
594 return x; 594 return x;
595 595
596 switch (typeA) { 596 switch (typeA) {
597 case IDBKeyNullTypeByte: 597 case IDBKeyNullTypeByte:
598 case IDBKeyMinKeyTypeByte: 598 case IDBKeyMinKeyTypeByte:
599 // Null type or max type; no payload to compare. 599 // Null type or max type; no payload to compare.
600 return 0; 600 return 0;
601 case IDBKeyArrayTypeByte: { 601 case IDBKeyArrayTypeByte: {
602 int64_t lengthA, lengthB; 602 int64_t lengthA, lengthB;
603 ptrA = decodeVarInt(ptrA, limitA, lengthA); 603 ptrA = decodeVarInt(ptrA, limitA, lengthA);
604 if (!ptrA) 604 ptrB = decodeVarInt(ptrB, limitB, lengthB);
605 if (!ptrA || !ptrB || lengthA < 0 || lengthB < 0) {
606 ok = false;
605 return 0; 607 return 0;
606 ptrB = decodeVarInt(ptrB, limitB, lengthB); 608 }
607 if (!ptrB)
608 return 0;
609 if (lengthA < 0 || lengthB < 0)
610 return 0;
611 for (int64_t i = 0; i < lengthA && i < lengthB; ++i) { 609 for (int64_t i = 0; i < lengthA && i < lengthB; ++i) {
612 if (int cmp = compareEncodedIDBKeys(ptrA, limitA, ptrB, limitB)) 610 int result = compareEncodedIDBKeys(ptrA, limitA, ptrB, limitB, ok);
613 return cmp; 611 if (!ok || result)
612 return result;
614 } 613 }
615 if (lengthA < lengthB) 614 if (lengthA < lengthB)
616 return -1; 615 return -1;
617 if (lengthA > lengthB) 616 if (lengthA > lengthB)
618 return 1; 617 return 1;
619 return 0; 618 return 0;
620 } 619 }
621 case IDBKeyStringTypeByte: 620 case IDBKeyStringTypeByte:
622 return compareEncodedStringsWithLength(ptrA, limitA, ptrB, limitB); 621 return compareEncodedStringsWithLength(ptrA, limitA, ptrB, limitB, ok);
623 case IDBKeyDateTypeByte: 622 case IDBKeyDateTypeByte:
624 case IDBKeyNumberTypeByte: { 623 case IDBKeyNumberTypeByte: {
625 double d, e; 624 double d, e;
626 ptrA = decodeDouble(ptrA, limitA, &d); 625 ptrA = decodeDouble(ptrA, limitA, &d);
626 ptrB = decodeDouble(ptrB, limitB, &e);
627 ASSERT(ptrA); 627 ASSERT(ptrA);
628 ptrB = decodeDouble(ptrB, limitB, &e);
629 ASSERT(ptrB); 628 ASSERT(ptrB);
629 if (!ptrA || !ptrB) {
630 ok = false;
631 return 0;
632 }
630 if (d < e) 633 if (d < e)
631 return -1; 634 return -1;
632 if (d > e) 635 if (d > e)
633 return 1; 636 return 1;
634 return 0; 637 return 0;
635 } 638 }
636 } 639 }
637 640
638 ASSERT_NOT_REACHED(); 641 ASSERT_NOT_REACHED();
639 return 0; 642 return 0;
640 } 643 }
641 644
642 int compareEncodedIDBKeys(const Vector<char>& keyA, const Vector<char>& keyB) 645 int compareEncodedIDBKeys(const Vector<char>& keyA, const Vector<char>& keyB, bo ol& ok)
643 { 646 {
644 ASSERT(keyA.size() >= 1); 647 ASSERT(keyA.size() >= 1);
645 ASSERT(keyB.size() >= 1); 648 ASSERT(keyB.size() >= 1);
646 649
647 const char* ptrA = keyA.data(); 650 const char* ptrA = keyA.data();
648 const char* limitA = ptrA + keyA.size(); 651 const char* limitA = ptrA + keyA.size();
649 const char* ptrB = keyB.data(); 652 const char* ptrB = keyB.data();
650 const char* limitB = ptrB + keyB.size(); 653 const char* limitB = ptrB + keyB.size();
651 654
652 return compareEncodedIDBKeys(ptrA, limitA, ptrB, limitB); 655 return compareEncodedIDBKeys(ptrA, limitA, ptrB, limitB, ok);
653 } 656 }
654 657
655 Vector<char> encodeIDBKeyPath(const IDBKeyPath& keyPath) 658 Vector<char> encodeIDBKeyPath(const IDBKeyPath& keyPath)
656 { 659 {
657 // May be typed, or may be a raw string. An invalid leading 660 // May be typed, or may be a raw string. An invalid leading
658 // byte is used to identify typed coding. New records are 661 // byte is used to identify typed coding. New records are
659 // always written as typed. 662 // always written as typed.
660 Vector<char, DefaultInlineBufferSize> ret; 663 Vector<char, DefaultInlineBufferSize> ret;
661 ret.append(IDBKeyPathTypeCodedByte1); 664 ret.append(IDBKeyPathTypeCodedByte1);
662 ret.append(IDBKeyPathTypeCodedByte2); 665 ret.append(IDBKeyPathTypeCodedByte2);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 return IDBKeyPath(array); 719 return IDBKeyPath(array);
717 } 720 }
718 } 721 }
719 ASSERT_NOT_REACHED(); 722 ASSERT_NOT_REACHED();
720 return IDBKeyPath(); 723 return IDBKeyPath();
721 } 724 }
722 725
723 namespace { 726 namespace {
724 727
725 template<typename KeyType> 728 template<typename KeyType>
726 int compare(const LevelDBSlice& a, const LevelDBSlice& b, bool ignoreDuplicates = false) 729 int compare(const LevelDBSlice& a, const LevelDBSlice& b, bool ignoreDuplicates, bool& ok)
727 { 730 {
728 KeyType keyA; 731 KeyType keyA;
729 KeyType keyB; 732 KeyType keyB;
730 733
731 const char* ptrA = KeyType::decode(a.begin(), a.end(), &keyA); 734 const char* ptrA = KeyType::decode(a.begin(), a.end(), &keyA);
732 ASSERT_UNUSED(ptrA, ptrA); 735 ASSERT(ptrA);
736 if (!ptrA) {
737 ok = false;
738 return 0;
739 }
733 const char* ptrB = KeyType::decode(b.begin(), b.end(), &keyB); 740 const char* ptrB = KeyType::decode(b.begin(), b.end(), &keyB);
734 ASSERT_UNUSED(ptrB, ptrB); 741 ASSERT(ptrB);
742 if (!ptrB) {
743 ok = false;
744 return 0;
745 }
735 746
747 ok = true;
736 return keyA.compare(keyB); 748 return keyA.compare(keyB);
737 } 749 }
738 750
739 template<> 751 template<>
740 int compare<ExistsEntryKey>(const LevelDBSlice& a, const LevelDBSlice& b, bool i gnoreDuplicates) 752 int compare<ExistsEntryKey>(const LevelDBSlice& a, const LevelDBSlice& b, bool i gnoreDuplicates, bool& ok)
741 { 753 {
742 KeyPrefix prefixA; 754 KeyPrefix prefixA;
743 KeyPrefix prefixB; 755 KeyPrefix prefixB;
744 const char* ptrA = KeyPrefix::decode(a.begin(), a.end(), &prefixA); 756 const char* ptrA = KeyPrefix::decode(a.begin(), a.end(), &prefixA);
745 const char* ptrB = KeyPrefix::decode(b.begin(), b.end(), &prefixB); 757 const char* ptrB = KeyPrefix::decode(b.begin(), b.end(), &prefixB);
746 ASSERT(ptrA); 758 ASSERT(ptrA);
747 ASSERT(ptrB); 759 ASSERT(ptrB);
748 ASSERT(prefixA.m_databaseId); 760 ASSERT(prefixA.m_databaseId);
749 ASSERT(prefixA.m_objectStoreId); 761 ASSERT(prefixA.m_objectStoreId);
750 ASSERT(prefixA.m_indexId == ExistsEntryKey::SpecialIndexNumber); 762 ASSERT(prefixA.m_indexId == ExistsEntryKey::SpecialIndexNumber);
751 ASSERT(prefixB.m_databaseId); 763 ASSERT(prefixB.m_databaseId);
752 ASSERT(prefixB.m_objectStoreId); 764 ASSERT(prefixB.m_objectStoreId);
753 ASSERT(prefixB.m_indexId == ExistsEntryKey::SpecialIndexNumber); 765 ASSERT(prefixB.m_indexId == ExistsEntryKey::SpecialIndexNumber);
754 ASSERT(ptrA != a.end()); 766 ASSERT(ptrA != a.end());
755 ASSERT(ptrB != b.end()); 767 ASSERT(ptrB != b.end());
756 // Prefixes are not compared - it is assumed this was already done. 768 // Prefixes are not compared - it is assumed this was already done.
757 ASSERT(!prefixA.compare(prefixB)); 769 ASSERT(!prefixA.compare(prefixB));
758 770
759 return compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end()); 771 return compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end(), ok);
760 } 772 }
761 773
762 template<> 774 template<>
763 int compare<ObjectStoreDataKey>(const LevelDBSlice& a, const LevelDBSlice& b, bo ol ignoreDuplicates) 775 int compare<ObjectStoreDataKey>(const LevelDBSlice& a, const LevelDBSlice& b, bo ol ignoreDuplicates, bool& ok)
764 { 776 {
765 KeyPrefix prefixA; 777 KeyPrefix prefixA;
766 KeyPrefix prefixB; 778 KeyPrefix prefixB;
767 const char* ptrA = KeyPrefix::decode(a.begin(), a.end(), &prefixA); 779 const char* ptrA = KeyPrefix::decode(a.begin(), a.end(), &prefixA);
768 const char* ptrB = KeyPrefix::decode(b.begin(), b.end(), &prefixB); 780 const char* ptrB = KeyPrefix::decode(b.begin(), b.end(), &prefixB);
769 ASSERT(ptrA); 781 ASSERT(ptrA);
770 ASSERT(ptrB); 782 ASSERT(ptrB);
771 ASSERT(prefixA.m_databaseId); 783 ASSERT(prefixA.m_databaseId);
772 ASSERT(prefixA.m_objectStoreId); 784 ASSERT(prefixA.m_objectStoreId);
773 ASSERT(prefixA.m_indexId == ObjectStoreDataKey::SpecialIndexNumber); 785 ASSERT(prefixA.m_indexId == ObjectStoreDataKey::SpecialIndexNumber);
774 ASSERT(prefixB.m_databaseId); 786 ASSERT(prefixB.m_databaseId);
775 ASSERT(prefixB.m_objectStoreId); 787 ASSERT(prefixB.m_objectStoreId);
776 ASSERT(prefixB.m_indexId == ObjectStoreDataKey::SpecialIndexNumber); 788 ASSERT(prefixB.m_indexId == ObjectStoreDataKey::SpecialIndexNumber);
777 ASSERT(ptrA != a.end()); 789 ASSERT(ptrA != a.end());
778 ASSERT(ptrB != b.end()); 790 ASSERT(ptrB != b.end());
779 // Prefixes are not compared - it is assumed this was already done. 791 // Prefixes are not compared - it is assumed this was already done.
780 ASSERT(!prefixA.compare(prefixB)); 792 ASSERT(!prefixA.compare(prefixB));
781 793
782 return compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end()); 794 return compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end(), ok);
783 } 795 }
784 796
785 template<> 797 template<>
786 int compare<IndexDataKey>(const LevelDBSlice& a, const LevelDBSlice& b, bool ign oreDuplicates) 798 int compare<IndexDataKey>(const LevelDBSlice& a, const LevelDBSlice& b, bool ign oreDuplicates, bool& ok)
787 { 799 {
788 KeyPrefix prefixA; 800 KeyPrefix prefixA;
789 KeyPrefix prefixB; 801 KeyPrefix prefixB;
790 const char* ptrA = KeyPrefix::decode(a.begin(), a.end(), &prefixA); 802 const char* ptrA = KeyPrefix::decode(a.begin(), a.end(), &prefixA);
791 const char* ptrB = KeyPrefix::decode(b.begin(), b.end(), &prefixB); 803 const char* ptrB = KeyPrefix::decode(b.begin(), b.end(), &prefixB);
792 ASSERT(ptrA); 804 ASSERT(ptrA);
793 ASSERT(ptrB); 805 ASSERT(ptrB);
794 ASSERT(prefixA.m_databaseId); 806 ASSERT(prefixA.m_databaseId);
795 ASSERT(prefixA.m_objectStoreId); 807 ASSERT(prefixA.m_objectStoreId);
796 ASSERT(prefixA.m_indexId >= MinimumIndexId); 808 ASSERT(prefixA.m_indexId >= MinimumIndexId);
797 ASSERT(prefixB.m_databaseId); 809 ASSERT(prefixB.m_databaseId);
798 ASSERT(prefixB.m_objectStoreId); 810 ASSERT(prefixB.m_objectStoreId);
799 ASSERT(prefixB.m_indexId >= MinimumIndexId); 811 ASSERT(prefixB.m_indexId >= MinimumIndexId);
800 ASSERT(ptrA != a.end()); 812 ASSERT(ptrA != a.end());
801 ASSERT(ptrB != b.end()); 813 ASSERT(ptrB != b.end());
802 // Prefixes are not compared - it is assumed this was already done. 814 // Prefixes are not compared - it is assumed this was already done.
803 ASSERT(!prefixA.compare(prefixB)); 815 ASSERT(!prefixA.compare(prefixB));
804 816
805 // index key 817 // index key
806 if (int x = compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end())) 818 int result = compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end(), ok);
807 return x; 819 if (!ok || result)
820 return result;
808 if (ignoreDuplicates) 821 if (ignoreDuplicates)
809 return 0; 822 return 0;
810 823
811 // sequence number [optional] 824 // sequence number [optional]
812 int64_t sequenceNumberA = -1; 825 int64_t sequenceNumberA = -1;
813 int64_t sequenceNumberB = -1; 826 int64_t sequenceNumberB = -1;
814 if (ptrA != a.end()) 827 if (ptrA != a.end())
815 ptrA = decodeVarInt(ptrA, a.end(), sequenceNumberA); 828 ptrA = decodeVarInt(ptrA, a.end(), sequenceNumberA);
816 if (ptrB != b.end()) 829 if (ptrB != b.end())
817 ptrB = decodeVarInt(ptrB, b.end(), sequenceNumberB); 830 ptrB = decodeVarInt(ptrB, b.end(), sequenceNumberB);
818 831
819 // primar key [optional] 832 // primary key [optional]
820 if (!ptrA || !ptrB) 833 if (!ptrA || !ptrB)
821 return 0; 834 return 0;
822 if (ptrA == a.end() && ptrB == b.end()) 835 if (ptrA == a.end() && ptrB == b.end())
823 return 0; 836 return 0;
824 if (ptrA == a.end()) 837 if (ptrA == a.end())
825 return -1; 838 return -1;
826 if (ptrB == b.end()) 839 if (ptrB == b.end())
827 return 1; 840 return 1;
828 841
829 if (int x = compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end())) 842 result = compareEncodedIDBKeys(ptrA, a.end(), ptrB, b.end(), ok);
830 return x; 843 if (!ok || result)
844 return result;
831 845
832 return compareInts(sequenceNumberA, sequenceNumberB); 846 return compareInts(sequenceNumberA, sequenceNumberB);
833 } 847 }
834 848
835 } 849 int compare(const LevelDBSlice& a, const LevelDBSlice& b, bool indexKeys, bool& ok)
836
837 int compare(const LevelDBSlice& a, const LevelDBSlice& b, bool indexKeys)
838 { 850 {
839 const char* ptrA = a.begin(); 851 const char* ptrA = a.begin();
840 const char* ptrB = b.begin(); 852 const char* ptrB = b.begin();
841 const char* endA = a.end(); 853 const char* endA = a.end();
842 const char* endB = b.end(); 854 const char* endB = b.end();
843 855
844 KeyPrefix prefixA; 856 KeyPrefix prefixA;
845 KeyPrefix prefixB; 857 KeyPrefix prefixB;
846 858
847 ptrA = KeyPrefix::decode(ptrA, endA, &prefixA); 859 ptrA = KeyPrefix::decode(ptrA, endA, &prefixA);
848 ptrB = KeyPrefix::decode(ptrB, endB, &prefixB); 860 ptrB = KeyPrefix::decode(ptrB, endB, &prefixB);
849 ASSERT(ptrA); 861 ASSERT(ptrA);
850 ASSERT(ptrB); 862 ASSERT(ptrB);
863 if (!ptrA || !ptrB) {
864 ok = false;
865 return 0;
866 }
851 867
868 ok = true;
852 if (int x = prefixA.compare(prefixB)) 869 if (int x = prefixA.compare(prefixB))
853 return x; 870 return x;
854 871
855 if (prefixA.type() == KeyPrefix::GlobalMetaData) { 872 if (prefixA.type() == KeyPrefix::GlobalMetaData) {
856 ASSERT(ptrA != endA); 873 ASSERT(ptrA != endA);
857 ASSERT(ptrB != endB); 874 ASSERT(ptrB != endB);
858 875
859 unsigned char typeByteA = *ptrA++; 876 unsigned char typeByteA = *ptrA++;
860 unsigned char typeByteB = *ptrB++; 877 unsigned char typeByteB = *ptrB++;
861 878
862 if (int x = typeByteA - typeByteB) 879 if (int x = typeByteA - typeByteB)
863 return x; 880 return x;
864 if (typeByteA < MaxSimpleGlobalMetaDataTypeByte) 881 if (typeByteA < MaxSimpleGlobalMetaDataTypeByte)
865 return 0; 882 return 0;
866 883
884 const bool ignoreDuplicates = false;
867 if (typeByteA == DatabaseFreeListTypeByte) 885 if (typeByteA == DatabaseFreeListTypeByte)
868 return compare<DatabaseFreeListKey>(a, b); 886 return compare<DatabaseFreeListKey>(a, b, ignoreDuplicates, ok);
869 if (typeByteA == DatabaseNameTypeByte) 887 if (typeByteA == DatabaseNameTypeByte)
870 return compare<DatabaseNameKey>(a, b); 888 return compare<DatabaseNameKey>(a, b, ignoreDuplicates, ok);
871 } 889 }
872 890
873 if (prefixA.type() == KeyPrefix::DatabaseMetaData) { 891 if (prefixA.type() == KeyPrefix::DatabaseMetaData) {
874 ASSERT(ptrA != endA); 892 ASSERT(ptrA != endA);
875 ASSERT(ptrB != endB); 893 ASSERT(ptrB != endB);
876 894
877 unsigned char typeByteA = *ptrA++; 895 unsigned char typeByteA = *ptrA++;
878 unsigned char typeByteB = *ptrB++; 896 unsigned char typeByteB = *ptrB++;
879 897
880 if (int x = typeByteA - typeByteB) 898 if (int x = typeByteA - typeByteB)
881 return x; 899 return x;
882 if (typeByteA < DatabaseMetaDataKey::MaxSimpleMetaDataType) 900 if (typeByteA < DatabaseMetaDataKey::MaxSimpleMetaDataType)
883 return 0; 901 return 0;
884 902
903 const bool ignoreDuplicates = false;
885 if (typeByteA == ObjectStoreMetaDataTypeByte) 904 if (typeByteA == ObjectStoreMetaDataTypeByte)
886 return compare<ObjectStoreMetaDataKey>(a, b); 905 return compare<ObjectStoreMetaDataKey>(a, b, ignoreDuplicates, ok);
887 if (typeByteA == IndexMetaDataTypeByte) 906 if (typeByteA == IndexMetaDataTypeByte)
888 return compare<IndexMetaDataKey>(a, b); 907 return compare<IndexMetaDataKey>(a, b, ignoreDuplicates, ok);
889 if (typeByteA == ObjectStoreFreeListTypeByte) 908 if (typeByteA == ObjectStoreFreeListTypeByte)
890 return compare<ObjectStoreFreeListKey>(a, b); 909 return compare<ObjectStoreFreeListKey>(a, b, ignoreDuplicates, ok);
891 if (typeByteA == IndexFreeListTypeByte) 910 if (typeByteA == IndexFreeListTypeByte)
892 return compare<IndexFreeListKey>(a, b); 911 return compare<IndexFreeListKey>(a, b, ignoreDuplicates, ok);
893 if (typeByteA == ObjectStoreNamesTypeByte) 912 if (typeByteA == ObjectStoreNamesTypeByte)
894 return compare<ObjectStoreNamesKey>(a, b); 913 return compare<ObjectStoreNamesKey>(a, b, ignoreDuplicates, ok);
895 if (typeByteA == IndexNamesKeyTypeByte) 914 if (typeByteA == IndexNamesKeyTypeByte)
896 return compare<IndexNamesKey>(a, b); 915 return compare<IndexNamesKey>(a, b, ignoreDuplicates, ok);
897 } 916 }
898 917
899 if (prefixA.type() == KeyPrefix::ObjectStoreData) { 918 if (prefixA.type() == KeyPrefix::ObjectStoreData) {
900 if (ptrA == endA && ptrB == endB) 919 if (ptrA == endA && ptrB == endB)
901 return 0; 920 return 0;
902 if (ptrA == endA) 921 if (ptrA == endA)
903 return -1; 922 return -1;
904 if (ptrB == endB) 923 if (ptrB == endB)
905 return 1; // FIXME: This case of non-existing user keys should not h ave to be handled this way. 924 return 1; // FIXME: This case of non-existing user keys should not h ave to be handled this way.
906 925
907 return compare<ObjectStoreDataKey>(a, b); 926 const bool ignoreDuplicates = false;
927 return compare<ObjectStoreDataKey>(a, b, ignoreDuplicates, ok);
908 } 928 }
909 if (prefixA.type() == KeyPrefix::ExistsEntry) { 929 if (prefixA.type() == KeyPrefix::ExistsEntry) {
910 if (ptrA == endA && ptrB == endB) 930 if (ptrA == endA && ptrB == endB)
911 return 0; 931 return 0;
912 if (ptrA == endA) 932 if (ptrA == endA)
913 return -1; 933 return -1;
914 if (ptrB == endB) 934 if (ptrB == endB)
915 return 1; // FIXME: This case of non-existing user keys should not h ave to be handled this way. 935 return 1; // FIXME: This case of non-existing user keys should not h ave to be handled this way.
916 936
917 return compare<ExistsEntryKey>(a, b); 937 const bool ignoreDuplicates = false;
938 return compare<ExistsEntryKey>(a, b, ignoreDuplicates, ok);
918 } 939 }
919 if (prefixA.type() == KeyPrefix::IndexData) { 940 if (prefixA.type() == KeyPrefix::IndexData) {
920 if (ptrA == endA && ptrB == endB) 941 if (ptrA == endA && ptrB == endB)
921 return 0; 942 return 0;
922 if (ptrA == endA) 943 if (ptrA == endA)
923 return -1; 944 return -1;
924 if (ptrB == endB) 945 if (ptrB == endB)
925 return 1; // FIXME: This case of non-existing user keys should not h ave to be handled this way. 946 return 1; // FIXME: This case of non-existing user keys should not h ave to be handled this way.
926 947
927 bool ignoreDuplicates = indexKeys; 948 bool ignoreDuplicates = indexKeys;
928 return compare<IndexDataKey>(a, b, ignoreDuplicates); 949 return compare<IndexDataKey>(a, b, ignoreDuplicates, ok);
929 } 950 }
930 951
931 ASSERT_NOT_REACHED(); 952 ASSERT_NOT_REACHED();
953 ok = false;
932 return 0; 954 return 0;
933 } 955 }
934 956
957 }
958
959 int compare(const LevelDBSlice& a, const LevelDBSlice& b, bool indexKeys)
960 {
961 bool ok;
962 int result = compare(a, b, indexKeys, ok);
963 ASSERT(ok);
964 if (!ok)
965 return 0;
966 return result;
967 }
935 968
936 KeyPrefix::KeyPrefix() 969 KeyPrefix::KeyPrefix()
937 : m_databaseId(InvalidType) 970 : m_databaseId(InvalidType)
938 , m_objectStoreId(InvalidType) 971 , m_objectStoreId(InvalidType)
939 , m_indexId(InvalidType) 972 , m_indexId(InvalidType)
940 { 973 {
941 } 974 }
942 975
943 KeyPrefix::KeyPrefix(int64_t databaseId, int64_t objectStoreId, int64_t indexId) 976 KeyPrefix::KeyPrefix(int64_t databaseId, int64_t objectStoreId, int64_t indexId)
944 : m_databaseId(databaseId) 977 : m_databaseId(databaseId)
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 ret.append(encodedUserKey); 1564 ret.append(encodedUserKey);
1532 1565
1533 return ret; 1566 return ret;
1534 } 1567 }
1535 1568
1536 Vector<char> ObjectStoreDataKey::encode(int64_t databaseId, int64_t objectStoreI d, const IDBKey& userKey) 1569 Vector<char> ObjectStoreDataKey::encode(int64_t databaseId, int64_t objectStoreI d, const IDBKey& userKey)
1537 { 1570 {
1538 return encode(databaseId, objectStoreId, encodeIDBKey(userKey)); 1571 return encode(databaseId, objectStoreId, encodeIDBKey(userKey));
1539 } 1572 }
1540 1573
1541 int ObjectStoreDataKey::compare(const ObjectStoreDataKey& other) 1574 int ObjectStoreDataKey::compare(const ObjectStoreDataKey& other, bool& ok)
1542 { 1575 {
1543 return compareEncodedIDBKeys(m_encodedUserKey, other.m_encodedUserKey); 1576 return compareEncodedIDBKeys(m_encodedUserKey, other.m_encodedUserKey, ok);
1544 } 1577 }
1545 1578
1546 PassRefPtr<IDBKey> ObjectStoreDataKey::userKey() const 1579 PassRefPtr<IDBKey> ObjectStoreDataKey::userKey() const
1547 { 1580 {
1548 RefPtr<IDBKey> key; 1581 RefPtr<IDBKey> key;
1549 decodeIDBKey(m_encodedUserKey.begin(), m_encodedUserKey.end(), key); 1582 decodeIDBKey(m_encodedUserKey.begin(), m_encodedUserKey.end(), key);
1550 return key; 1583 return key;
1551 } 1584 }
1552 1585
1553 const int64_t ObjectStoreDataKey::SpecialIndexNumber = ObjectStoreDataIndexId; 1586 const int64_t ObjectStoreDataKey::SpecialIndexNumber = ObjectStoreDataIndexId;
(...skipping 18 matching lines...) Expand all
1572 Vector<char> ret = prefix.encode(); 1605 Vector<char> ret = prefix.encode();
1573 ret.append(encodedKey); 1606 ret.append(encodedKey);
1574 return ret; 1607 return ret;
1575 } 1608 }
1576 1609
1577 Vector<char> ExistsEntryKey::encode(int64_t databaseId, int64_t objectStoreId, c onst IDBKey& userKey) 1610 Vector<char> ExistsEntryKey::encode(int64_t databaseId, int64_t objectStoreId, c onst IDBKey& userKey)
1578 { 1611 {
1579 return encode(databaseId, objectStoreId, encodeIDBKey(userKey)); 1612 return encode(databaseId, objectStoreId, encodeIDBKey(userKey));
1580 } 1613 }
1581 1614
1582 int ExistsEntryKey::compare(const ExistsEntryKey& other) 1615 int ExistsEntryKey::compare(const ExistsEntryKey& other, bool& ok)
1583 { 1616 {
1584 return compareEncodedIDBKeys(m_encodedUserKey, other.m_encodedUserKey); 1617 return compareEncodedIDBKeys(m_encodedUserKey, other.m_encodedUserKey, ok);
1585 } 1618 }
1586 1619
1587 PassRefPtr<IDBKey> ExistsEntryKey::userKey() const 1620 PassRefPtr<IDBKey> ExistsEntryKey::userKey() const
1588 { 1621 {
1589 RefPtr<IDBKey> key; 1622 RefPtr<IDBKey> key;
1590 decodeIDBKey(m_encodedUserKey.begin(), m_encodedUserKey.end(), key); 1623 decodeIDBKey(m_encodedUserKey.begin(), m_encodedUserKey.end(), key);
1591 return key; 1624 return key;
1592 } 1625 }
1593 1626
1594 const int64_t ExistsEntryKey::SpecialIndexNumber = ExistsEntryIndexId; 1627 const int64_t ExistsEntryKey::SpecialIndexNumber = ExistsEntryIndexId;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1655 Vector<char> IndexDataKey::encodeMinKey(int64_t databaseId, int64_t objectStoreI d, int64_t indexId) 1688 Vector<char> IndexDataKey::encodeMinKey(int64_t databaseId, int64_t objectStoreI d, int64_t indexId)
1656 { 1689 {
1657 return encode(databaseId, objectStoreId, indexId, minIDBKey(), minIDBKey()); 1690 return encode(databaseId, objectStoreId, indexId, minIDBKey(), minIDBKey());
1658 } 1691 }
1659 1692
1660 Vector<char> IndexDataKey::encodeMaxKey(int64_t databaseId, int64_t objectStoreI d, int64_t indexId) 1693 Vector<char> IndexDataKey::encodeMaxKey(int64_t databaseId, int64_t objectStoreI d, int64_t indexId)
1661 { 1694 {
1662 return encode(databaseId, objectStoreId, indexId, maxIDBKey(), maxIDBKey(), INT64_MAX); 1695 return encode(databaseId, objectStoreId, indexId, maxIDBKey(), maxIDBKey(), INT64_MAX);
1663 } 1696 }
1664 1697
1665 int IndexDataKey::compare(const IndexDataKey& other, bool ignoreDuplicates) 1698 int IndexDataKey::compare(const IndexDataKey& other, bool ignoreDuplicates, bool & ok)
1666 { 1699 {
1667 ASSERT(m_databaseId >= 0); 1700 ASSERT(m_databaseId >= 0);
1668 ASSERT(m_objectStoreId >= 0); 1701 ASSERT(m_objectStoreId >= 0);
1669 ASSERT(m_indexId >= 0); 1702 ASSERT(m_indexId >= 0);
1670 if (int x = compareEncodedIDBKeys(m_encodedUserKey, other.m_encodedUserKey)) 1703 int result = compareEncodedIDBKeys(m_encodedUserKey, other.m_encodedUserKey, ok);
1671 return x; 1704 if (!ok || result)
1705 return result;
1672 if (ignoreDuplicates) 1706 if (ignoreDuplicates)
1673 return 0; 1707 return 0;
1674 if (int x = compareEncodedIDBKeys(m_encodedPrimaryKey, other.m_encodedPrimar yKey)) 1708 result = compareEncodedIDBKeys(m_encodedPrimaryKey, other.m_encodedPrimaryKe y, ok);
1675 return x; 1709 if (!ok || result)
1710 return result;
1676 return compareInts(m_sequenceNumber, other.m_sequenceNumber); 1711 return compareInts(m_sequenceNumber, other.m_sequenceNumber);
1677 } 1712 }
1678 1713
1679 int64_t IndexDataKey::databaseId() const 1714 int64_t IndexDataKey::databaseId() const
1680 { 1715 {
1681 ASSERT(m_databaseId >= 0); 1716 ASSERT(m_databaseId >= 0);
1682 return m_databaseId; 1717 return m_databaseId;
1683 } 1718 }
1684 1719
1685 int64_t IndexDataKey::objectStoreId() const 1720 int64_t IndexDataKey::objectStoreId() const
(...skipping 20 matching lines...) Expand all
1706 RefPtr<IDBKey> key; 1741 RefPtr<IDBKey> key;
1707 decodeIDBKey(m_encodedPrimaryKey.begin(), m_encodedPrimaryKey.end(), key); 1742 decodeIDBKey(m_encodedPrimaryKey.begin(), m_encodedPrimaryKey.end(), key);
1708 return key; 1743 return key;
1709 } 1744 }
1710 1745
1711 } // namespace IDBLevelDBCoding 1746 } // namespace IDBLevelDBCoding
1712 } // namespace WebCore 1747 } // namespace WebCore
1713 1748
1714 #endif // USE(LEVELDB) 1749 #endif // USE(LEVELDB)
1715 #endif // ENABLE(INDEXED_DATABASE) 1750 #endif // ENABLE(INDEXED_DATABASE)
OLDNEW
« no previous file with comments | « Source/WebCore/Modules/indexeddb/IDBLevelDBCoding.h ('k') | Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698