public void Write(ClickHouseBinaryProtocolWriter writer) { writer.Write7BitInt32((int)MessageCode); writer.WriteString(string.Empty); switch (QueryKind) { case QueryKind.NoQuery: break; case QueryKind.InitialQuery: writer.Write7BitInt32((int)QueryKind); writer.WriteString(InitialUser ?? string.Empty); //initial user writer.WriteString(InitialQueryId ?? string.Empty); //initial query id writer.WriteString(RemoteAddress); //initial IP address writer.Write7BitInt32(1); //TCP writer.WriteString(string.Empty); //OS user writer.WriteString(Host); writer.WriteString(ClientName); writer.Write7BitInt32(ClientVersion.Major); writer.Write7BitInt32(ClientVersion.Minor); writer.Write7BitInt32(ProtocolRevision); writer.WriteString(string.Empty); //quota key writer.Write7BitInt32(ClientVersion.Build); break; case QueryKind.SecondaryQuery: throw new NotImplementedException(); default: throw new NotSupportedException(); } if (Settings != null) { // All settings are serialized as strings. Before each value the flag `is_important` is serialized. // https://github.com/ClickHouse/ClickHouse/blob/97d97f6b2e50ab3cf21a25a18cbf1aa327f242e5/src/Core/BaseSettings.h#L19 const int isImportantFlag = 0x1; foreach (var pair in Settings) { writer.WriteString(pair.Key); writer.Write7BitInt32(isImportantFlag); writer.WriteString(pair.Value); } } writer.WriteString(string.Empty); // empty string is a marker of the end of the settings writer.Write7BitInt32(StateCodes.Complete); writer.WriteBool(CompressionEnabled); writer.WriteString(Query); }
public void Write(ClickHouseBinaryProtocolWriter writer) { writer.Write7BitInt32((int)MessageCode); writer.WriteString(string.Empty); switch (QueryKind) { case QueryKind.NoQuery: break; case QueryKind.InitialQuery: writer.Write7BitInt32((int)QueryKind); writer.WriteString(InitialUser ?? string.Empty); //initial user writer.WriteString(InitialQueryId ?? string.Empty); //initial query id writer.WriteString(RemoteAddress); //initial IP address writer.Write7BitInt32(1); //TCP writer.WriteString(string.Empty); //OS user writer.WriteString(Host); writer.WriteString(ClientName); writer.Write7BitInt32(ClientVersion.Major); writer.Write7BitInt32(ClientVersion.Minor); writer.Write7BitInt32(ProtocolRevision); writer.WriteString(string.Empty); //quota key writer.Write7BitInt32(ClientVersion.Build); break; case QueryKind.SecondaryQuery: throw new NotImplementedException(); default: throw new NotSupportedException(); } if (Settings != null) { foreach (var pair in Settings) { writer.WriteString(pair.Key); writer.WriteString(pair.Value); } } writer.WriteString(string.Empty); // empty string is a marker of the end of the settings writer.Write7BitInt32(StateCodes.Complete); writer.WriteBool(CompressionEnabled); writer.WriteString(Query); }
public void Write(ClickHouseBinaryProtocolWriter writer) { writer.Write7BitInt32((int)MessageCode); writer.WriteString(string.Empty); switch (QueryKind) { case QueryKind.NoQuery: break; case QueryKind.InitialQuery: writer.Write7BitInt32((int)QueryKind); writer.WriteString(InitialUser ?? string.Empty); //initial user writer.WriteString(InitialQueryId ?? string.Empty); //initial query id writer.WriteString(RemoteAddress); //initial IP address if (ProtocolRevision >= ClickHouseProtocolRevisions.MinRevisionWithInitialQueryStartTime) { // Initial query start time in microseconds. An actual value of this property should be set by the server. Span <byte> zero = stackalloc byte[sizeof(ulong)]; writer.WriteBytes(zero); } writer.Write7BitInt32(1); //TCP writer.WriteString(string.Empty); //OS user writer.WriteString(Host); writer.WriteString(ClientName); writer.Write7BitInt32(ClientVersion.Major); writer.Write7BitInt32(ClientVersion.Minor); writer.Write7BitInt32(ProtocolRevision); writer.WriteString(string.Empty); //quota key if (ProtocolRevision >= ClickHouseProtocolRevisions.MinRevisionWithDistributedDepth) { writer.Write7BitInt32(0); //distributed depth } writer.Write7BitInt32(ClientVersion.Build); if (ProtocolRevision >= ClickHouseProtocolRevisions.MinRevisionWithOpenTelemetry) { writer.WriteByte(0); // TODO: add support for Open Telemetry headers } break; case QueryKind.SecondaryQuery: throw new NotImplementedException(); default: throw new NotSupportedException(); } if (Settings != null) { // All settings are serialized as strings. Before each value the flag `is_important` is serialized. // https://github.com/ClickHouse/ClickHouse/blob/97d97f6b2e50ab3cf21a25a18cbf1aa327f242e5/src/Core/BaseSettings.h#L19 const int isImportantFlag = 0x1; foreach (var pair in Settings) { writer.WriteString(pair.Key); writer.Write7BitInt32(isImportantFlag); writer.WriteString(pair.Value); } } writer.WriteString(string.Empty); // empty string is a marker of the end of the settings if (ProtocolRevision >= ClickHouseProtocolRevisions.MinRevisionWithInterserverSecret) { writer.WriteString(string.Empty); } writer.Write7BitInt32(StateCodes.Complete); writer.WriteBool(CompressionEnabled); writer.WriteString(Query); }