コード例 #1
0
            public IDescriptorSerializerContext StoreNewDescriptors(AbstractBufferedWriter writer, object obj)
            {
                if (obj == null)
                {
                    return(this);
                }
                InfoForType infoForType;
                var         iKnowDescriptor = obj as IKnowDescriptor;

                if (iKnowDescriptor != null)
                {
                    var descriptor = iKnowDescriptor.GetDescriptor();
                    if (!_typeOrDescriptor2InfoMap.TryGetValue(descriptor, out infoForType) &&
                        !_typeSerializersMapping._typeOrDescriptor2Info.TryGetValue(descriptor, out infoForType))
                    {
                        infoForType = new InfoForType {
                            Id = 0, Descriptor = descriptor
                        };
                    }
                }
                else
                {
                    var objType = obj.GetType();
                    if (!_typeOrDescriptor2InfoMap.TryGetValue(objType, out infoForType) &&
                        !_typeSerializersMapping._typeOrDescriptor2Info.TryGetValue(objType, out infoForType))
                    {
                        var descriptor = _typeSerializers.DescriptorOf(objType);
                        if (_typeOrDescriptor2InfoMap.TryGetValue(descriptor, out infoForType))
                        {
                            _typeOrDescriptor2InfoMap[objType] = infoForType;
                        }
                        else if (_typeSerializersMapping._typeOrDescriptor2Info.TryGetValue(descriptor, out infoForType))
                        {
                            _typeSerializersMapping._typeOrDescriptor2Info[objType] = infoForType;
                        }
                        else
                        {
                            infoForType = new InfoForType {
                                Id = 0, Descriptor = descriptor
                            };
                        }
                    }
                }
                if (infoForType.Id == 0)
                {
                    AddDescriptor(infoForType);
                }
                if (!infoForType.KnownNewTypeDiscoverer)
                {
                    infoForType.NewTypeDiscoverer      = _typeSerializers.GetNewDescriptorSaver(infoForType.Descriptor);
                    infoForType.KnownNewTypeDiscoverer = true;
                }
                var action = infoForType.NewTypeDiscoverer;

                if (action != null)
                {
                    action(obj, this);
                }
                return(this);
            }
コード例 #2
0
 void StoreDescriptor(ITypeDescriptor descriptor, AbstractBufferedWriter writer)
 {
     if (descriptor is ListTypeDescriptor)
     {
         writer.WriteUInt8((byte)TypeCategory.List);
     }
     else if (descriptor is DictionaryTypeDescriptor)
     {
         writer.WriteUInt8((byte)TypeCategory.Dictionary);
     }
     else if (descriptor is ObjectTypeDescriptor)
     {
         writer.WriteUInt8((byte)TypeCategory.Class);
     }
     else if (descriptor is EnumTypeDescriptor)
     {
         writer.WriteUInt8((byte)TypeCategory.Enum);
     }
     else
     {
         throw new ArgumentOutOfRangeException();
     }
     ((IPersistTypeDescriptor)descriptor).Persist(writer, (w, d) =>
     {
         SerializerTypeInfo result;
         if (!_typeOrDescriptor2Info.TryGetValue(d, out result))
         {
             if (!_typeOrDescriptor2InfoNew.TryGetValue(d, out result))
             {
                 throw new BTDBException("Invalid state unknown descriptor " + d.Name);
             }
         }
         w.WriteVInt32(result.Id);
     });
 }
コード例 #3
0
 internal void Save(AbstractBufferedWriter writer)
 {
     writer.WriteVUInt32((uint)_primaryKeyFields.Count);
     foreach (var field in _primaryKeyFields)
     {
         field.Save(writer);
     }
     writer.WriteVUInt32((uint)_secondaryKeyFields.Count);
     foreach (var field in _secondaryKeyFields)
     {
         field.Save(writer);
     }
     writer.WriteVUInt32((uint)_secondaryKeys.Count);
     foreach (var key in _secondaryKeys)
     {
         writer.WriteVUInt32(key.Key);
         var info = key.Value;
         writer.WriteVUInt32(0); //unused
         writer.WriteString(info.Name);
         writer.WriteVUInt32((uint)info.Fields.Count);
         foreach (var fi in info.Fields)
         {
             writer.WriteBool(fi.IsFromPrimaryKey);
             writer.WriteVUInt32(fi.Index);
         }
     }
     writer.WriteVUInt32((uint)_fields.Length);
     for (var i = 0; i < _fields.Length; i++)
     {
         _fields[i].Save(writer);
     }
 }
コード例 #4
0
        static void StoreObjectCore(TypeSerializers typeSerializers, AbstractBufferedWriter writer, object obj, InfoForType infoForType, ITypeSerializersLightMapping mapping)
        {
            writer.WriteVUInt32((uint)infoForType.Id);
            if (!infoForType.KnownSimpleSaver)
            {
                infoForType.SimpleSaver      = typeSerializers.GetSimpleSaver(infoForType.Descriptor);
                infoForType.KnownSimpleSaver = true;
            }
            var simpleSaver = infoForType.SimpleSaver;

            if (simpleSaver != null)
            {
                simpleSaver(writer, obj);
                return;
            }
            if (!infoForType.KnownComplexSaver)
            {
                infoForType.ComplexSaver      = typeSerializers.GetComplexSaver(infoForType.Descriptor);
                infoForType.KnownComplexSaver = true;
            }
            var complexSaver = infoForType.ComplexSaver;
            var ctx          = new TypeBinarySerializerContext(mapping, writer, obj);

            complexSaver(writer, ctx, obj);
        }
コード例 #5
0
ファイル: FilePureValuesWithId.cs プロジェクト: keeema/bbcore
 public void WriteHeader(AbstractBufferedWriter writer)
 {
     FileCollectionWithFileInfos.WriteHeader(writer, _guid);
     writer.WriteUInt8((byte)KVFileType.PureValuesWithId);
     writer.WriteVInt64(_subId);
     writer.WriteVInt64(_generation);
 }
コード例 #6
0
ファイル: TypeSerializers.cs プロジェクト: martindrlik/BTDB
        public void StoreDescriptor(ITypeDescriptor descriptor, AbstractBufferedWriter writer, Func <ITypeDescriptor, uint> descriptor2Id)
        {
            if (descriptor is ListTypeDescriptor)
            {
                writer.WriteUInt8((byte)TypeCategory.List);
            }
            else if (descriptor is DictionaryTypeDescriptor)
            {
                writer.WriteUInt8((byte)TypeCategory.Dictionary);
            }
            else if (descriptor is ObjectTypeDescriptor)
            {
                writer.WriteUInt8((byte)TypeCategory.Class);
            }
            else if (descriptor is EnumTypeDescriptor)
            {
                writer.WriteUInt8((byte)TypeCategory.Enum);
            }
            else if (descriptor is NullableTypeDescriptor)
            {
                writer.WriteUInt8((byte)TypeCategory.Nullable);
            }
            else
            {
                throw new ArgumentOutOfRangeException();
            }
            var p = descriptor as IPersistTypeDescriptor;

            p.Persist(writer, (w, d) => w.WriteVUInt32(descriptor2Id(d)));
        }
コード例 #7
0
 internal void Store(AbstractBufferedWriter writer)
 {
     writer.WriteVUInt32(BindingId);
     writer.WriteVUInt32(ServiceId);
     writer.WriteVUInt32(MethodId);
     writer.WriteBool(OneWay);
 }
コード例 #8
0
ファイル: FileTransactionLog.cs プロジェクト: keeema/bbcore
 internal void WriteHeader(AbstractBufferedWriter writer)
 {
     FileCollectionWithFileInfos.WriteHeader(writer, _guid);
     writer.WriteUInt8((byte)KVFileType.TransactionLog);
     writer.WriteVInt64(_generation);
     writer.WriteVInt32((int)_previousFileId);
 }
コード例 #9
0
ファイル: FileHashIndex.cs プロジェクト: keeema/bbcore
 internal void WriteHeader(AbstractBufferedWriter writer)
 {
     writer.WriteByteArrayRaw(DiskChunkCache.MagicStartOfFile);
     writer.WriteUInt8((byte)DiskChunkFileType.HashIndex);
     writer.WriteVInt64(_generation);
     writer.WriteVUInt32((uint)KeySize);
     writer.WriteVUInt64((ulong)KeyValueCount);
 }
コード例 #10
0
ファイル: HashKeyIndex.cs プロジェクト: keeema/bbcore
 internal void WriteHeader(AbstractBufferedWriter writer)
 {
     FileCollectionWithFileInfos.WriteHeader(writer, _guid);
     writer.WriteUInt8((byte)KVFileType.HashKeyIndex);
     writer.WriteVInt64(_subId);
     writer.WriteVInt64(_generation);
     writer.WriteVUInt32(_keyLen);
 }
コード例 #11
0
ファイル: TableVersionInfo.cs プロジェクト: quyenbc/BTDB
 internal void Save(AbstractBufferedWriter writer)
 {
     writer.WriteVUInt32((uint)FieldCount);
     for (int i = 0; i < FieldCount; i++)
     {
         this[i].Save(writer);
     }
 }
コード例 #12
0
        void StartNewPureValueFile()
        {
            _pureValueFile       = _fileCollection.AddFile("hpv");
            _pureValueFileWriter = _pureValueFile.GetAppenderWriter();
            var fileInfo = new FilePureValuesWithId(_subDBId, _fileCollection.NextGeneration(), _fileCollection.Guid);

            fileInfo.WriteHeader(_pureValueFileWriter);
            _fileCollection.SetInfo(_pureValueFile.Index, fileInfo);
        }
コード例 #13
0
        void StartNewHashIndexFile()
        {
            _hashIndexFile   = _fileCollection.AddFile("hid");
            _hashIndexWriter = _hashIndexFile.GetAppenderWriter();
            var fileInfo = new HashKeyIndex(_subDBId, _fileCollection.NextGeneration(), _fileCollection.Guid, (uint)_keyLen);

            fileInfo.WriteHeader(_hashIndexWriter);
            _fileCollection.SetInfo(_hashIndexFile.Index, fileInfo);
        }
コード例 #14
0
 public void Persist(AbstractBufferedWriter writer, Action <AbstractBufferedWriter, ITypeDescriptor> nestedDescriptorPersistor)
 {
     writer.WriteString(Name);
     writer.WriteVUInt32((uint)_fields.Count);
     foreach (var pair in _fields)
     {
         writer.WriteString(pair.Key);
         nestedDescriptorPersistor(writer, pair.Value);
     }
 }
コード例 #15
0
ファイル: FileKeyIndex.cs プロジェクト: saryn/BTDB
 internal void WriteHeader(AbstractBufferedWriter writer)
 {
     FileCollectionWithFileInfos.WriteHeader(writer, _guid);
     writer.WriteUInt8((byte)KVFileType.ModernKeyIndex);
     writer.WriteVInt64(_generation);
     writer.WriteVUInt32(_trLogFileId);
     writer.WriteVUInt32(_trLogOffset);
     writer.WriteVUInt64((ulong)_keyValueCount);
     writer.WriteVUInt64(_commitUlong);
     writer.WriteUInt8((byte)_compressionType);
 }
コード例 #16
0
 internal static void WriteHeader(AbstractBufferedWriter writer, Guid?guid)
 {
     if (guid.HasValue)
     {
         writer.WriteByteArrayRaw(MagicStartOfFileWithGuid);
         writer.WriteGuid(guid.Value);
     }
     else
     {
         writer.WriteByteArrayRaw(MagicStartOfFile);
     }
 }
コード例 #17
0
        public void StoreObject(AbstractBufferedWriter writer, object obj)
        {
            if (obj == null)
            {
                writer.WriteUInt8(0);
                return;
            }
            TypeSerializers typeSerializers;
            var             infoForType = GetInfoFromObject(obj, out typeSerializers);

            StoreObjectCore(typeSerializers, writer, obj, infoForType, this);
        }
コード例 #18
0
 public void FinishNewDescriptors(AbstractBufferedWriter writer)
 {
     if (SomeTypeStored)
     {
         for (int i = _id2InfoMap.Count - 1; i >= 0; i--)
         {
             writer.WriteVUInt32((uint)(i + _typeSerializersMapping._id2DescriptorMap.Count));
             _typeSerializers.StoreDescriptor(_id2InfoMap[i].Descriptor, writer, Descriptor2Id);
         }
         writer.WriteUInt8(0);
     }
 }
コード例 #19
0
ファイル: Compactor.cs プロジェクト: JanVargovsky/BTDB
        void MoveValuesContent(AbstractBufferedWriter writer, uint wastefullFileId, uint pvlFileId)
        {
            const uint blockSize       = 256 * 1024;
            var        wasteFullStream = _keyValueDB.FileCollection.GetFile(wastefullFileId);
            var        totalSize       = wasteFullStream.GetSize();
            var        blocks          = (int)((totalSize + blockSize - 1) / blockSize);
            var        wasteInMemory   = new byte[blocks][];
            var        pos             = 0UL;
            var        readLimiter     = new BytesPerSecondLimiter(_keyValueDB._compactorReadBytesPerSecondLimit);

            for (var i = 0; i < blocks; i++)
            {
                _cancellation.ThrowIfCancellationRequested();
                wasteInMemory[i] = new byte[blockSize];
                var readSize = totalSize - pos;
                if (readSize > blockSize)
                {
                    readSize = blockSize;
                }
                wasteFullStream.RandomRead(wasteInMemory[i], 0, (int)readSize, pos, true);
                pos += readSize;
                readLimiter.Limit(pos);
            }

            _root.Iterate((valueFileId, valueOfs, valueSize) =>
            {
                if (valueFileId != wastefullFileId)
                {
                    return;
                }
                var size = (uint)Math.Abs(valueSize);
                _newPositionMap.Add(((ulong)wastefullFileId << 32) | valueOfs,
                                    ((ulong)pvlFileId << 32) + (ulong)writer.GetCurrentPosition());
                pos = valueOfs;
                while (size > 0)
                {
                    _cancellation.ThrowIfCancellationRequested();
                    var blockId    = pos / blockSize;
                    var blockStart = pos % blockSize;
                    var writeSize  = (uint)(blockSize - blockStart);
                    if (writeSize > size)
                    {
                        writeSize = size;
                    }
                    writer.WriteBlock(wasteInMemory[blockId], (int)blockStart, (int)writeSize);
                    size -= writeSize;
                    pos  += writeSize;
                    _writerBytesPerSecondLimiter.Limit((ulong)writer.GetCurrentPosition());
                }
            });
        }
コード例 #20
0
 public void Store(AbstractBufferedWriter writer)
 {
     writer.WriteString(_name);
     writer.WriteVUInt32((uint)_methodInfs.Length);
     foreach (var methodInf in _methodInfs)
     {
         methodInf.Store(writer);
     }
     writer.WriteVUInt32((uint)PropertyInfs.Length);
     foreach (var propertyInf in PropertyInfs)
     {
         propertyInf.Store(writer);
     }
 }
コード例 #21
0
        // ReSharper disable UnusedMember.Global
        public static void SaverImpl <T>(AbstractBufferedWriter writer, IList <T> ilist) where T : class
        // ReSharper restore UnusedMember.Global
        {
            if (ilist == null)
            {
                writer.WriteVUInt32(0);
                return;
            }
            var oids = ((ListOfDBObject <T>)ilist).Oids;

            writer.WriteVUInt32((uint)oids.Count);
            foreach (var oid in oids)
            {
                writer.WriteVUInt64(oid);
            }
        }
コード例 #22
0
 public void Persist(AbstractBufferedWriter writer, Action <AbstractBufferedWriter, ITypeDescriptor> nestedDescriptorPersistor)
 {
     writer.WriteString(_name);
     writer.WriteVUInt32((_signed ? 1u : 0) + (_flags ? 2u : 0) + 4u * (uint)_pairs.Count);
     foreach (var pair in _pairs)
     {
         writer.WriteString(pair.Key);
         if (_signed)
         {
             writer.WriteVInt64((long)pair.Value);
         }
         else
         {
             writer.WriteVUInt64(pair.Value);
         }
     }
 }
コード例 #23
0
        internal void WriteHeader(AbstractBufferedWriter writer)
        {
            FileCollectionWithFileInfos.WriteHeader(writer, _guid);
            writer.WriteUInt8((byte)KVFileType.ModernKeyIndexWithUlongs);
            writer.WriteVInt64(_generation);
            writer.WriteVUInt32(_trLogFileId);
            writer.WriteVUInt32(_trLogOffset);
            writer.WriteVUInt64((ulong)_keyValueCount);
            writer.WriteVUInt64(_commitUlong);
            writer.WriteUInt8((byte)_compressionType);
            var ulongCount = (uint)(_ulongs?.Length ?? 0);

            writer.WriteVUInt32(ulongCount);
            if (ulongCount > 0)
            {
                for (var i = 0; i < ulongCount; i++)
                {
                    writer.WriteVUInt64(_ulongs ![i]);
コード例 #24
0
ファイル: KeyValueDB.cs プロジェクト: pavolpr/BTDB
        void WriteStartOfNewTransactionLogFile()
        {
            if (_writerWithTransactionLog != null)
            {
                _writerWithTransactionLog.WriteUInt8((byte)KVCommandType.EndOfFile);
                _writerWithTransactionLog.FlushBuffer();
                _fileWithTransactionLog.HardFlush();
                _fileWithTransactionLog.Truncate();
                _fileIdWithPreviousTransactionLog = _fileIdWithTransactionLog;
            }
            _fileWithTransactionLog   = FileCollection.AddFile("trl");
            _fileIdWithTransactionLog = _fileWithTransactionLog.Index;
            var transactionLog = new FileTransactionLog(FileCollection.NextGeneration(), FileCollection.Guid, _fileIdWithPreviousTransactionLog);

            _writerWithTransactionLog = _fileWithTransactionLog.GetAppenderWriter();
            transactionLog.WriteHeader(_writerWithTransactionLog);
            FileCollection.SetInfo(_fileIdWithTransactionLog, transactionLog);
        }
コード例 #25
0
ファイル: MethodInf.cs プロジェクト: keeema/bbcore
 public void Store(AbstractBufferedWriter writer)
 {
     writer.WriteString(_name);
     writer.WriteString(_ifaceName);
     if (_resultFieldHandler != null)
     {
         writer.WriteString(_resultFieldHandler.Name);
         writer.WriteByteArray(_resultFieldHandler.Configuration);
     }
     else
     {
         writer.WriteString(null);
     }
     writer.WriteVUInt32((uint)_parameters.Length);
     foreach (var parameter in _parameters)
     {
         parameter.Store(writer);
     }
 }
コード例 #26
0
ファイル: KeyValueDB.cs プロジェクト: pavolpr/BTDB
 internal void WriteStartTransaction()
 {
     if (_fileIdWithTransactionLog == 0)
     {
         WriteStartOfNewTransactionLogFile();
     }
     else
     {
         if (_writerWithTransactionLog == null)
         {
             _fileWithTransactionLog   = FileCollection.GetFile(_fileIdWithTransactionLog);
             _writerWithTransactionLog = _fileWithTransactionLog.GetAppenderWriter();
         }
         if (_writerWithTransactionLog.GetCurrentPosition() > MaxTrLogFileSize)
         {
             WriteStartOfNewTransactionLogFile();
         }
     }
     _writerWithTransactionLog.WriteUInt8((byte)KVCommandType.TransactionStart);
     _writerWithTransactionLog.WriteByteArrayRaw(MagicStartOfTransaction);
 }
コード例 #27
0
        public IDescriptorSerializerContext StoreNewDescriptors(AbstractBufferedWriter writer, object?obj)
        {
            if (obj == null)
            {
                return(this);
            }
            InfoForType infoForType;
            var         objType = obj.GetType();

            if (obj is IKnowDescriptor iKnowDescriptor)
            {
                var descriptor = iKnowDescriptor.GetDescriptor();
                if (!_typeOrDescriptor2Info.TryGetValue(descriptor, out infoForType))
                {
                    infoForType = new InfoForType {
                        Id = 0, Descriptor = descriptor
                    };
                }
            }
            else
            {
                if (!_typeOrDescriptor2Info.TryGetValue(objType, out infoForType))
                {
                    var descriptor = _typeSerializers.DescriptorOf(objType);
                    if (!_typeOrDescriptor2Info.TryGetValue(descriptor !, out infoForType))
                    {
                        infoForType = new InfoForType {
                            Id = 0, Descriptor = descriptor
                        };
                    }
                    else
                    {
                        _typeOrDescriptor2Info[objType] = infoForType;
                    }
                }
            }
コード例 #28
0
ファイル: KeyValueDBReplayProxy.cs プロジェクト: quyenbc/BTDB
 public KeyValueDBReplayProxy(IKeyValueDB db, AbstractBufferedWriter log)
 {
     _db = db;
     _log = log;
 }
コード例 #29
0
ファイル: DBWriterCtx.cs プロジェクト: miroslavpokorny/BTDB
 public DBWriterCtx(IInternalObjectDBTransaction transaction, AbstractBufferedWriter writer)
 {
     _transaction = transaction;
     _writer      = writer;
 }
コード例 #30
0
 public void Persist(AbstractBufferedWriter writer, Action <AbstractBufferedWriter, ITypeDescriptor> nestedDescriptorPersistor)
 {
     nestedDescriptorPersistor(writer, _keyDescriptor);
     nestedDescriptorPersistor(writer, _valueDescriptor);
 }
コード例 #31
0
 public void FinishNewDescriptors(AbstractBufferedWriter writer)
 {
 }