Пример #1
0
        public static PayloadData Create(string user, byte[] authResponse, string schemaName)
        {
            var writer = new PayloadWriter();

            writer.WriteByte((byte)CommandKind.ChangeUser);
            writer.WriteNullTerminatedString(user);
            writer.WriteByte(checked ((byte)authResponse.Length));
            writer.Write(authResponse);
            writer.WriteNullTerminatedString(schemaName ?? "");
            writer.WriteByte((byte)CharacterSet.Utf8Mb4Binary);
            writer.WriteByte(0);
            writer.WriteNullTerminatedString("mysql_native_password");

            return(new PayloadData(new ArraySegment <byte>(writer.ToBytes())));
        }
Пример #2
0
        public static PayloadData Create(uint statementId, IList <StatementParameter> parameters)
        {
            var writer = new PayloadWriter();

            writer.WriteByte((byte)CommandKind.ExecuteStatement);
            writer.WriteUInt32(statementId);
            writer.WriteByte(0);             // flags == CURSOR_TYPE_NO_CURSOR
            writer.WriteUInt32(1);           // iteration count is always 1
            if (parameters.Count > 0)
            {
                int parametersProcessed = 0;
                while (parametersProcessed < parameters.Count)
                {
                    byte nullBitmap = 0;
                    for (int i = 0; i < Math.Min(8, parameters.Count - parametersProcessed); i++)
                    {
                        if (parameters[parametersProcessed + i].IsNull)
                        {
                            nullBitmap |= (byte)(1 << i);
                        }
                    }
                    writer.WriteByte(nullBitmap);
                    parametersProcessed += 8;
                }

                writer.WriteByte((byte)(parameters.Count == 0 ? 0 : 1));                  // new parameters bound
                foreach (var parameter in parameters)
                {
                    writer.WriteByte((byte)parameter.Type);
                    writer.WriteByte((byte)(parameter.IsUnsigned ? 0x80 : 0));
                }
                foreach (var parameter in parameters)
                {
                    writer.Write(parameter.Data);
                }
            }

            return(new PayloadData(new ArraySegment <byte>(writer.ToBytes())));
        }