Ejemplo n.º 1
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())));
        }
        private static PayloadWriter CreateCapabilitiesPayload(ProtocolCapabilities serverCapabilities, ConnectionSettings cs, ProtocolCapabilities additionalCapabilities = 0)
        {
            var writer = new PayloadWriter();

            writer.WriteInt32((int)(
                                  ProtocolCapabilities.Protocol41 |
                                  ProtocolCapabilities.LongPassword |
                                  ProtocolCapabilities.SecureConnection |
                                  (serverCapabilities & ProtocolCapabilities.PluginAuth) |
                                  (serverCapabilities & ProtocolCapabilities.PluginAuthLengthEncodedClientData) |
                                  ProtocolCapabilities.MultiStatements |
                                  ProtocolCapabilities.MultiResults |
                                  ProtocolCapabilities.PreparedStatementMultiResults |
                                  (string.IsNullOrWhiteSpace(cs.Database) ? 0 : ProtocolCapabilities.ConnectWithDatabase) |
                                  (cs.UseAffectedRows ? 0 : ProtocolCapabilities.FoundRows) |
                                  (cs.UseCompression ? ProtocolCapabilities.Compress : ProtocolCapabilities.None) |
                                  additionalCapabilities));
            writer.WriteInt32(0x40000000);
            writer.WriteByte((byte)CharacterSet.Utf8Mb4Binary);
            writer.Write(new byte[23]);

            return(writer);
        }