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; }
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(); }
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); } } }