Esempio n. 1
0
 internal RelationInfo CreateByName(IInternalObjectDBTransaction tr, string name, Type interfaceType)
 {
     name = string.Intern(name);
     uint id;
     if (!_name2Id.TryGetValue(name, out id))
     {
         id = _freeId++;
         _name2Id[name] = id;
         tr.KeyValueDBTransaction.SetKeyPrefixUnsafe(ObjectDB.RelationNamesPrefix);
         var nameWriter = new ByteBufferWriter();
         nameWriter.WriteString(name);
         var idWriter = new ByteBufferWriter();
         idWriter.WriteVUInt32(id);
         tr.KeyValueDBTransaction.CreateOrUpdateKeyValue(nameWriter.Data, idWriter.Data);
     }
     RelationInfo relation;
     if (_id2Relation.TryGetValue(id, out relation))
     {
         throw new BTDBException($"Relation with name '{name}' was already initialized");
     }
     var clientType = FindClientType(interfaceType);
     relation = new RelationInfo(id, name, _relationInfoResolver, interfaceType, clientType, tr);
     _id2Relation[id] = relation;
     return relation;
 }
Esempio n. 2
0
 public byte[] ToConfiguration()
 {
     var writer = new ByteBufferWriter();
     writer.WriteVUInt32((_signed ? 1u : 0) + (Flags ? 2u : 0) + 4u * (uint)Names.Length);
     foreach (var name in Names)
     {
         writer.WriteString(name);
     }
     foreach (var value in Values)
     {
         if (_signed) writer.WriteVInt64((long)value);
         else writer.WriteVUInt64(value);
     }
     return writer.Data.ToByteArray();
 }
Esempio n. 3
0
 void SerializeIntoBuffer(object metadata, IReadOnlyList<object> events, out int startOffset,
                          out IDescriptorSerializerContext serializerContext, out BlockType blockType,
                          out int lenWithoutEndPadding, out ByteBuffer block)
 {
     startOffset = (int)EndBufferLen + HeaderSize;
     var writer = new ByteBufferWriter();
     writer.WriteBlock(_zeroes, 0, startOffset);
     serializerContext = Mapping;
     if (metadata != null)
         serializerContext = serializerContext.StoreNewDescriptors(writer, metadata);
     if (events != null)
     {
         foreach (var o in events)
         {
             serializerContext = serializerContext.StoreNewDescriptors(writer, o);
         }
         if (events.Count == 0) events = null;
     }
     serializerContext.FinishNewDescriptors(writer);
     blockType = BlockType.FirstBlock;
     if (serializerContext.SomeTypeStored)
         blockType |= BlockType.HasTypeDeclaration;
     if (metadata != null)
     {
         serializerContext.StoreObject(writer, metadata);
         blockType |= BlockType.HasMetadata;
     }
     if (events != null)
     {
         if (events.Count == 1)
         {
             serializerContext.StoreObject(writer, events[0]);
             blockType |= BlockType.HasOneEvent;
         }
         else
         {
             writer.WriteVUInt32((uint)events.Count);
             foreach (var o in events)
             {
                 serializerContext.StoreObject(writer, o);
             }
             blockType |= BlockType.HasMoreEvents;
         }
     }
     lenWithoutEndPadding = (int)writer.GetCurrentPosition();
     writer.WriteBlock(_zeroes, 0, (int)(SectorSize - 1));
     block = writer.Data;
     if (CompressionStrategy.ShouldTryToCompress(lenWithoutEndPadding - startOffset))
     {
         var compressedBlock = ByteBuffer.NewSync(block.Buffer, startOffset, lenWithoutEndPadding - startOffset);
         if (CompressionStrategy.Compress(ref compressedBlock))
         {
             blockType |= BlockType.Compressed;
             Array.Copy(compressedBlock.Buffer, compressedBlock.Offset, block.Buffer, startOffset, compressedBlock.Length);
             lenWithoutEndPadding = startOffset + compressedBlock.Length;
             Array.Copy(_zeroes, 0, block.Buffer, lenWithoutEndPadding, (int)SectorSize - 1);
         }
     }
 }