Exemplo n.º 1
0
        private IEnumerable <byte[]> GetBytesData()
        {
            using (var it = _levelDb.CreateIterator()) {
                for (it.SeekToFirst(); it.IsValid(); it.Next())
                {
                    var piece = new StringPiece(it.Key());

                    KeyPrefix          prefix;
                    ObjectStoreDataKey store;
                    if (!KeyPrefix.Decode(piece, out prefix) || prefix.Type != KeyType.ObjectStoreData ||
                        !ObjectStoreDataKey.Decode(piece.Reset(), out store))
                    {
                        continue;
                    }

                    var  dataSlice = new StringPiece(it.Value());
                    long version;
                    if (!dataSlice.DecodeVarInt(out version))
                    {
                        continue;
                    }
                    yield return(dataSlice.ToSwappedArray());
                }
            }
        }
Exemplo n.º 2
0
            public static bool Decode(StringPiece slice, out ObjectStoreDataKey result)
            {
                KeyPrefix prefix;

                if (!KeyPrefix.Decode(slice, out prefix))
                {
                    result = default(ObjectStoreDataKey);
                    return(false);
                }

                result = new ObjectStoreDataKey();
                if (!ExtractEncodedIdbKey(slice, out result.EncodedUserKey))
                {
                    return(false);
                }

                return(true);
            }
Exemplo n.º 3
0
        // https://cs.chromium.org/chromium/src/content/browser/indexed_db/indexed_db_database_callbacks.cc
        private static int Compare(StringPiece a, StringPiece b, bool onlyCompareIndexKeys)
        {
            var sliceA = a.Fork();
            var sliceB = b.Fork();

            KeyPrefix prefixA, prefixB;

            if (!KeyPrefix.Decode(sliceA, out prefixA) || !KeyPrefix.Decode(sliceB, out prefixB))
            {
                return(0);
            }

            {
                var x = prefixA.CompareTo(prefixB);
                if (x != 0)
                {
                    return(x);
                }
            }

            switch (prefixA.Type)
            {
            case KeyType.GlobalMetadata: {
                if (sliceA.Empty || sliceB.Empty)
                {
                    return(0);
                }

                var typeByteA = sliceA.Next();
                var typeByteB = sliceB.Next();

                {
                    var x = typeByteA - typeByteB;
                    if (x != 0)
                    {
                        return(x);
                    }
                }

                if (typeByteA < KMaxSimpleGlobalMetaDataTypeByte)
                {
                    return(0);
                }

                // Compare<> is used (which re-decodes the prefix) rather than an
                // specialized CompareSuffix<> because metadata is relatively uncommon
                // in the database.
                switch (typeByteA)
                {
                case KDatabaseFreeListTypeByte:
                    return(DatabaseFreeListKey.Compare(a, b));

                case KDatabaseNameTypeByte:
                    return(DatabaseNameKey.Compare(a, b));
                }
                break;
            }

            case KeyType.DatabaseMetadata: {
                if (sliceA.Empty || sliceB.Empty)
                {
                    return(0);
                }

                var typeByteA = sliceA.Next();
                var typeByteB = sliceB.Next();

                {
                    var x = typeByteA - typeByteB;
                    if (x != 0)
                    {
                        return(x);
                    }
                }

                if (typeByteA < (int)MetaDataType.MaxSimpleMetadataType)
                {
                    return(0);
                }

                switch (typeByteA)
                {
                case KObjectStoreMetaDataTypeByte:
                    return(ObjectStoreMetaDataKey.Compare(a, b));

                case KIndexMetaDataTypeByte:
                    return(IndexMetaDataKey.Compare(a, b));

                case KObjectStoreNamesTypeByte:
                    return(ObjectStoreNamesKey.Compare(a, b));

                case KObjectStoreFreeListTypeByte:
                    return(ObjectStoreFreeListKey.Compare(a, b));

                case KIndexFreeListTypeByte:
                    return(IndexFreeListKey.Compare(a, b));

                case KIndexNamesKeyTypeByte:
                    return(IndexNamesKey.Compare(a, b));
                }

                break;
            }

            case KeyType.ObjectStoreData:
                return(sliceA.Empty || sliceB.Empty ? CompareSizes(sliceA.Left, sliceB.Left) :
                       ObjectStoreDataKey.CompareSuffix(sliceA, sliceB));

            case KeyType.ExistsEntry:
                return(sliceA.Empty || sliceB.Empty ? CompareSizes(sliceA.Left, sliceB.Left) :
                       ExistsEntryKey.CompareSuffix(sliceA, sliceB));

            case KeyType.BlobEntry:
                return(sliceA.Empty || sliceB.Empty ? CompareSizes(sliceA.Left, sliceB.Left) :
                       BlobEntryKey.CompareSuffix(sliceA, sliceB));

            case KeyType.IndexData:
                return(sliceA.Empty || sliceB.Empty ? CompareSizes(sliceA.Left, sliceB.Left) :
                       IndexDataKey.CompareSuffix(sliceA, sliceB, onlyCompareIndexKeys));

            case KeyType.InvalidType:
                break;
            }

            return(0);
        }