예제 #1
0
        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);
        }
예제 #2
0
        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(ClientName);
            writer.Write7BitInt32(ClientVersion.Major);
            writer.Write7BitInt32(ClientVersion.Minor);
            writer.Write7BitInt32(ProtocolRevision);

            writer.WriteString(Database ?? string.Empty);
            writer.WriteString(User);
            writer.WriteString(Password ?? string.Empty);
        }
        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);
        }