コード例 #1
0
ファイル: ODBDictionary.cs プロジェクト: Waizik/BTDB
        public static void DoFreeContent(IReaderCtx ctx, ulong id, int cfgId)
        {
            var readerCtx = (DBReaderCtx)ctx;
            var tr        = readerCtx.GetTransaction();
            var dict      = new ODBDictionary <TKey, TValue>(tr, ODBDictionaryConfiguration.Get(cfgId), id);

            dict.FreeContent(ctx, cfgId);
        }
コード例 #2
0
        TKey ByteArrayToKey(ByteBuffer data)
        {
            var        reader = new ByteBufferReader(data);
            IReaderCtx ctx    = null;

            if (_keyHandler.NeedsCtx())
            {
                ctx = new DBReaderCtx(_tr, reader);
            }
            return(_keyReader(reader, ctx));
        }
コード例 #3
0
ファイル: ODBDictionary.cs プロジェクト: miroslavpokorny/BTDB
        TValue ByteArrayToValue(ByteBuffer data)
        {
            var        reader = new ByteBufferReader(data);
            IReaderCtx ctx    = null;

            if (_valueHandler.NeedsCtx())
            {
                ctx = new DBReaderCtx(_tr, reader);
            }
            return(_valueReader(reader, ctx));
        }
コード例 #4
0
ファイル: ODBSet.cs プロジェクト: yardee/BTDB
        TKey CurrentToKey()
        {
            Span <byte> buffer = stackalloc byte[512];
            var         reader = new SpanReader(_keyValueTr.GetKey(ref MemoryMarshal.GetReference(buffer), buffer.Length).Slice(_prefix.Length));
            IReaderCtx  ctx    = null;

            if (_keyHandler.NeedsCtx())
            {
                ctx = new DBReaderCtx(_tr);
            }
            return(_keyReader(ref reader, ctx));
        }
コード例 #5
0
ファイル: ObjectDBTransaction.cs プロジェクト: keeema/bbcore
        public bool FreeContentInNativeObject(IReaderCtx readerCtx)
        {
            var reader       = readerCtx.Reader();
            var tableId      = reader.ReadVUInt32();
            var tableVersion = reader.ReadVUInt32();
            var tableInfo    = _owner.TablesInfo.FindById(tableId);

            if (tableInfo == null)
            {
                throw new BTDBException($"Unknown TypeId {tableId} of inline object");
            }
            var freeContentTuple = tableInfo.GetFreeContent(tableVersion);
            var readerWithFree   = (DBReaderWithFreeInfoCtx)readerCtx;

            freeContentTuple.Item2(this, null, reader, readerWithFree.DictIds, readerWithFree.Oids);
            return(freeContentTuple.Item1);
        }
コード例 #6
0
ファイル: ObjectDBTransaction.cs プロジェクト: pavolpr/BTDB
        public object ReadInlineObject(IReaderCtx readerCtx)
        {
            var reader       = readerCtx.Reader();
            var tableId      = reader.ReadVUInt32();
            var tableVersion = reader.ReadVUInt32();
            var tableInfo    = _owner.TablesInfo.FindById(tableId);

            if (tableInfo == null)
            {
                throw new BTDBException($"Unknown TypeId {tableId} of inline object");
            }
            EnsureClientTypeNotNull(tableInfo);
            var obj = tableInfo.Creator(this, null);

            readerCtx.RegisterObject(obj);
            tableInfo.GetLoader(tableVersion)(this, null, reader, obj);
            readerCtx.ReadObjectDone();
            return(obj);
        }
コード例 #7
0
ファイル: ODBDictionary.cs プロジェクト: Waizik/BTDB
        void FreeContent(IReaderCtx readerCtx, int cfgId)
        {
            var config = ODBDictionaryConfiguration.Get(cfgId);
            var ctx    = (DBReaderWithFreeInfoCtx)readerCtx;

            if (config.FreeContent == null)
            {
                var method      = ILBuilder.Instance.NewMethod <FreeContentFun>($"IDictFinder_Cfg_{cfgId}");
                var ilGenerator = method.Generator;

                var readerLoc = ilGenerator.DeclareLocal(typeof(IReaderCtx));
                ilGenerator
                .Ldarg(0)
                .Ldarg(2)
                // ReSharper disable once ObjectCreationAsStatement
                .Newobj(() => new DBReaderWithFreeInfoCtx(null, null))
                .Stloc(readerLoc);

                var readerOrCtx = _valueHandler.NeedsCtx() ? (Action <IILGen>?)(il => il.Ldloc(readerLoc)) : null;
                _valueHandler.FreeContent(ilGenerator, il => il.Ldarg(1), readerOrCtx);
                ilGenerator.Ret();
                config.FreeContent = method.Create();
            }

            var findIDictAction = (FreeContentFun)config.FreeContent;

            long prevProtectionCounter = 0;
            long pos = 0;

            while (true)
            {
                if (pos == 0)
                {
                    if (!_keyValueTr.FindFirstKey(_prefix))
                    {
                        break;
                    }
                }
                else
                {
                    if (_keyValueTr.CursorMovedCounter != prevProtectionCounter)
                    {
                        if (!_keyValueTr.SetKeyIndex(_prefix, pos))
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (!_keyValueTr.FindNextKey(_prefix))
                        {
                            break;
                        }
                    }
                }

                prevProtectionCounter = _keyValueTr.CursorMovedCounter;
                var valueBytes  = _keyValueTr.GetValue();
                var valueReader = new SpanReader(valueBytes);
                findIDictAction(ctx.GetTransaction(), ref valueReader, ctx.DictIds);

                pos++;
            }
        }
コード例 #8
0
ファイル: ODBDictionary.cs プロジェクト: miroslavpokorny/BTDB
        void FreeContent(IReaderCtx readerCtx, int cfgId)
        {
            var config = ODBDictionaryConfiguration.Get(cfgId);
            var ctx    = (DBReaderWithFreeInfoCtx)readerCtx;

            if (config.FreeContent == null)
            {
                var method = ILBuilder.Instance
                             .NewMethod <Action <IInternalObjectDBTransaction, AbstractBufferedReader, IList <ulong> > >(
                    $"IDictFinder_Cfg_{cfgId}");
                var ilGenerator = method.Generator;

                var readerLoc = ilGenerator.DeclareLocal(typeof(IReaderCtx));
                ilGenerator
                .Ldarg(0)
                .Ldarg(1)
                .Ldarg(2)
                // ReSharper disable once ObjectCreationAsStatement
                .Newobj(() => new DBReaderWithFreeInfoCtx(null, null, null))
                .Stloc(readerLoc);

                Action <IILGen> readerOrCtx;
                if (_valueHandler.NeedsCtx())
                {
                    readerOrCtx = il => il.Ldloc(readerLoc);
                }
                else
                {
                    readerOrCtx = il => il.Ldarg(1);
                }
                _valueHandler.FreeContent(ilGenerator, readerOrCtx);
                ilGenerator.Ret();
                config.FreeContent = method.Create();
            }

            var findIDictAction =
                (Action <IInternalObjectDBTransaction, AbstractBufferedReader, IList <ulong> >)config.FreeContent;

            long prevProtectionCounter = 0;
            long pos = 0;

            while (true)
            {
                _keyValueTrProtector.Start();
                if (pos == 0)
                {
                    _keyValueTr.SetKeyPrefix(_prefix);
                    if (!_keyValueTr.FindFirstKey())
                    {
                        break;
                    }
                }
                else
                {
                    if (_keyValueTrProtector.WasInterupted(prevProtectionCounter))
                    {
                        _keyValueTr.SetKeyPrefix(_prefix);
                        if (!_keyValueTr.SetKeyIndex(pos))
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (!_keyValueTr.FindNextKey())
                        {
                            break;
                        }
                    }
                }

                prevProtectionCounter = _keyValueTrProtector.ProtectionCounter;
                var valueBytes  = _keyValueTr.GetValueAsByteArray();
                var valueReader = new ByteArrayReader(valueBytes);
                findIDictAction(ctx.GetTransaction(), valueReader, ctx.DictIds);

                pos++;
            }
        }
コード例 #9
0
ファイル: DBIndirect.cs プロジェクト: yardee/BTDB
        public static IIndirect <T> LoadImpl(ref SpanReader reader, IReaderCtx readerCtx)
        {
            var oid = reader.ReadVInt64();

            return(new DBIndirect <T>(((IDBReaderCtx)readerCtx).GetTransaction(), (ulong)oid));
        }