예제 #1
0
파일: ObjectDB.cs 프로젝트: quyenbc/BTDB
 uint ITableInfoResolver.GetLastPesistedVersion(uint id)
 {
     using (var tr = _keyValueDB.StartTransaction())
     {
         tr.SetKeyPrefix(TableVersionsPrefix);
         var key = new byte[PackUnpack.LengthVUInt(id) + 1];
         var ofs = 0;
         PackUnpack.PackVUInt(key, ref ofs, id);
         key[ofs] = 0xff;
         if (tr.FindKey(key, 0, key.Length, FindKeyStrategy.PreferPrevious) == FindKeyResult.NotFound)
         {
             return(0);
         }
         var key2 = tr.ReadKey();
         if (key2.Length < ofs)
         {
             return(0);
         }
         if (BitArrayManipulation.CompareByteArray(key, 0, ofs, key2, 0, ofs) != 0)
         {
             return(0);
         }
         return(checked ((uint)PackUnpack.UnpackVUInt(key2, ref ofs)));
     }
 }
예제 #2
0
파일: ObjectDB.cs 프로젝트: Waizik/BTDB
        public void Open(IKeyValueDB keyValueDB, bool dispose, DBOptions options)
        {
            _keyValueDB = keyValueDB ?? throw new ArgumentNullException(nameof(keyValueDB));
            _dispose    = dispose;
            _type2Name  = options.CustomType2NameRegistry ?? new Type2NameRegistry();
            _polymorphicTypesRegistry = new PolymorphicTypesRegistry();
            AutoRegisterTypes         = options.AutoRegisterType;
            ActualOptions             = options;
            SymmetricCipher           = options.SymmetricCipher ?? new InvalidSymmetricCipher();

            _tableInfoResolver     = new TableInfoResolver(keyValueDB, this);
            _tablesInfo            = new TablesInfo(_tableInfoResolver);
            _relationsInfoResolver = new RelationInfoResolver(this);
            _relationsInfo         = new RelationsInfo(_relationsInfoResolver);

            using var tr = _keyValueDB.StartTransaction();
            _lastObjId   = (long)tr.GetUlong(0);
            _lastDictId  = tr.GetUlong(1);
            if (_lastObjId == 0)
            {
                if (tr.FindLastKey(AllObjectsPrefix))
                {
                    _lastObjId = (long)PackUnpack.UnpackVUInt(tr.GetKey().Slice(AllObjectsPrefixLen));
                }
            }
            _tablesInfo.LoadTables(LoadTablesEnum(tr));
            _relationsInfo.LoadRelations(LoadRelationNamesEnum(tr));
            if (_lastDictId == 0)
            {
                if (tr.FindExactKey(LastDictIdKey))
                {
                    _lastDictId = PackUnpack.UnpackVUInt(tr.GetValue());
                }
            }
        }
예제 #3
0
        void PackVUIntIsOrderableCore(ulong t)
        {
            var buf1 = new byte[9];
            var o1   = 0;

            PackUnpack.PackVUInt(buf1, ref o1, t - 1);
            var buf2 = new byte[9];
            var o2   = 0;

            PackUnpack.PackVUInt(buf2, ref o2, t);
            if (t <= uint.MaxValue)
            {
                Assert.Equal(o2, PackUnpack.LengthVUInt((uint)t));
            }
            Assert.Equal(o2, PackUnpack.LengthVUInt(t));
            Assert.Equal(o2, PackUnpack.LengthVUInt(buf2, 0));
            Assert.True(0 > BitArrayManipulation.CompareByteArray(buf1, o1, buf2, o2));
            var o1A = 0;

            Assert.Equal(t - 1, PackUnpack.UnpackVUInt(buf1, ref o1A));
            Assert.Equal(o1, o1A);
            var o2A = 0;

            Assert.Equal(t, PackUnpack.UnpackVUInt(buf2, ref o2A));
            Assert.Equal(o2, o2A);
        }
예제 #4
0
        public ulong ReadVUInt64()
        {
            NeedOneByteInBuffer();
            var   l = PackUnpack.LengthVUInt(Buf, Pos);
            ulong res;

            if (Pos + l <= End)
            {
                res = PackUnpack.UnpackVUInt(Buf, ref Pos);
            }
            else
            {
                res = (ulong)(Buf[Pos] & (0xff >> l));
                do
                {
                    Pos++;
                    res <<= 8;
                    NeedOneByteInBuffer();
                    res += Buf[Pos];
                    l--;
                } while (l > 1);
                Pos++;
            }
            return(res);
        }
예제 #5
0
파일: ObjectDB.cs 프로젝트: Waizik/BTDB
 internal static IEnumerable <KeyValuePair <uint, string> > LoadRelationNamesEnum(IKeyValueDBTransaction tr)
 {
     tr.InvalidateCurrentKey();
     while (tr.FindNextKey(RelationNamesPrefix))
     {
         yield return(new KeyValuePair <uint, string>((uint)PackUnpack.UnpackVUInt(tr.GetValue()), new SpanReader(tr.GetKey().Slice(RelationNamesPrefixLen)).ReadString()));
     }
 }
예제 #6
0
        ulong ReadOidFromCurrentKeyInTransaction()
        {
            var key    = _keyValueTr.GetKey();
            var bufOfs = key.Offset;
            var oid    = PackUnpack.UnpackVUInt(key.Buffer, ref bufOfs);

            return(oid);
        }
예제 #7
0
        private void LoadItem()
        {
            int ofs = _ofs;

            _keyLen   = (int)PackUnpack.UnpackVUInt(_data, ref ofs);
            _valueLen = (long)PackUnpack.UnpackVUInt(_data, ref ofs);
            _ofsAfterKeyAndValueLen = ofs;
        }
예제 #8
0
        ulong ReadOidFromCurrentKeyInTransaction()
        {
            int len;

            byte[] buf;
            int    bufOfs;

            _keyValueTr.PeekKey(0, out len, out buf, out bufOfs);
            ulong oid = PackUnpack.UnpackVUInt(buf, ref bufOfs);

            return(oid);
        }
예제 #9
0
        internal static void RecalculateHeader(byte[] data, int count)
        {
            var ofs1 = HeaderSize + HeaderForEntry * count;
            var ofs  = ofs1;

            for (int i = 0; i < count; i++)
            {
                var keyLen   = (int)PackUnpack.UnpackVUInt(data, ref ofs);
                var valueLen = (long)PackUnpack.UnpackVUInt(data, ref ofs);
                ofs += CalcEntrySizeWOLengths(keyLen, valueLen);
                PackUnpack.PackUInt16LE(data, HeaderSize + HeaderForEntry * i, (ushort)(ofs - ofs1));
            }
        }
예제 #10
0
 void ReceiveBody()
 {
     try
     {
         _connector.OnNext(true);
         var buf = new byte[9];
         while (!_disconnected)
         {
             if (!Receive(buf, 0, 1))
             {
                 return;
             }
             var packLen = PackUnpack.LengthVUInt(buf, 0);
             if (packLen > 1)
             {
                 if (!Receive(buf, 1, packLen - 1))
                 {
                     return;
                 }
             }
             int o   = 0;
             var len = PackUnpack.UnpackVUInt(buf, ref o);
             if (len > int.MaxValue)
             {
                 throw new InvalidDataException();
             }
             var result = new byte[len];
             if (len != 0)
             {
                 if (!Receive(result, 0, (int)len))
                 {
                     return;
                 }
             }
             _receiver.OnNext(ByteBuffer.NewAsync(result));
         }
     }
     catch (Exception)
     {
         SignalDisconnected();
     }
     SignalDisconnected();
 }
예제 #11
0
 public IEnumerable <UnseenKey> UnseenKeys()
 {
     using var trkv = _keyValueDb.StartReadOnlyTransaction();
     foreach (var prefix in SupportedKeySpaces())
     {
         if (!trkv.FindFirstKey(prefix))
         {
             continue;
         }
         do
         {
             yield return(new UnseenKey
             {
                 Key = trkv.GetKeyToArray(),
                 ValueSize = (uint)PackUnpack.UnpackVUInt(trkv.GetValue())
             });
         } while (trkv.FindNextKey(prefix));
     }
 }
예제 #12
0
 uint ITableInfoResolver.GetLastPersistedVersion(uint id)
 {
     using (var tr = _keyValueDB.StartTransaction())
     {
         tr.SetKeyPrefix(TableVersionsPrefix);
         var key = TableInfo.BuildKeyForTableVersions(id, uint.MaxValue);
         if (tr.Find(ByteBuffer.NewSync(key)) == FindResult.NotFound)
         {
             return(0);
         }
         var key2 = tr.GetKeyAsByteArray();
         var ofs  = PackUnpack.LengthVUInt(id);
         if (key2.Length < ofs)
         {
             return(0);
         }
         if (BitArrayManipulation.CompareByteArray(key, ofs, key2, ofs) != 0)
         {
             return(0);
         }
         return(checked ((uint)PackUnpack.UnpackVUInt(key2, ref ofs)));
     }
 }