#if MYSQL_6_10

// Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
//
// MySQL Connector/NET is licensed under the terms of the GPLv2
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most 
// MySQL Connectors. There are special exceptions to the terms and 
// conditions of the GPLv2 as it is applied to this software, see the 
// FLOSS License Exception
// <http://www.mysql.com/about/legal/licensing/foss-exception.html>.
//
// This program is free software; you can redistribute it and/or modify 
// it under the terms of the GNU General Public License as published 
// by the Free Software Foundation; version 2 of the License.
//
// This program is distributed in the hope that it will be useful, but 
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 
// for more details.
//
// You should have received a copy of the GNU General Public License along 
// with this program; if not, write to the Free Software Foundation, Inc., 
// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA

using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;

namespace Externals.MySql.Data.MySqlClient
{
    /// <summary>
    /// Summary description for ClientParam.
    /// </summary>
    [Flags]
    internal enum ClientFlags : ulong
    {
        LONG_PASSWORD = 1, // new more secure passwords
        FOUND_ROWS = 2, // found instead of affected rows
        LONG_FLAG = 4, // Get all column flags
        CONNECT_WITH_DB = 8, // One can specify db on connect
        NO_SCHEMA = 16, // Don't allow db.table.column
        COMPRESS = 32, // Client can use compression protocol
        ODBC = 64, // ODBC client
        LOCAL_FILES = 128, // Can use LOAD DATA LOCAL
        IGNORE_SPACE = 256, // Ignore spaces before '('
        PROTOCOL_41 = 512, // Support new 4.1 protocol
        INTERACTIVE = 1024, // This is an interactive client
        SSL = 2048, // Switch to SSL after handshake
        IGNORE_SIGPIPE = 4096, // IGNORE sigpipes
        TRANSACTIONS = 8192, // Client knows about transactions
        RESERVED = 16384,               // old 4.1 protocol flag
        SECURE_CONNECTION = 32768,      // new 4.1 authentication
        MULTI_STATEMENTS = 65536,       // Allow multi-stmt support
        MULTI_RESULTS = 131072,         // Allow multiple resultsets
        PS_MULTI_RESULTS = 1UL << 18,    // allow multi results using PS protocol
        PLUGIN_AUTH = (1UL << 19), //Client supports plugin authentication
        CONNECT_ATTRS = (1UL << 20),    // Allows client connection attributes
        CAN_HANDLE_EXPIRED_PASSWORD = (1UL << 22),   // Support for password expiration > 5.6.6
        CLIENT_SSL_VERIFY_SERVER_CERT = (1UL << 30),
        CLIENT_REMEMBER_OPTIONS = (1UL << 31)
    }

    [Flags]
    internal enum ServerStatusFlags
    {
        InTransaction = 1, // Transaction has started
        AutoCommitMode = 2, // Server in auto_commit mode 
        MoreResults = 4, // More results on server
        AnotherQuery = 8, // Multi query - next query exists
        BadIndex = 16,
        NoIndex = 32,
        CursorExists = 64,
        LastRowSent = 128,
        OutputParameters = 4096
    }


    /// <summary>
    /// DB Operations Code
    /// </summary>
    internal enum DBCmd : byte
    {
        SLEEP = 0,
        QUIT = 1,
        INIT_DB = 2,
        QUERY = 3,
        FIELD_LIST = 4,
        CREATE_DB = 5,
        DROP_DB = 6,
        RELOAD = 7,
        SHUTDOWN = 8,
        STATISTICS = 9,
        PROCESS_INFO = 10,
        CONNECT = 11,
        PROCESS_KILL = 12,
        DEBUG = 13,
        PING = 14,
        TIME = 15,
        DELAYED_INSERT = 16,
        CHANGE_USER = 17,
        BINLOG_DUMP = 18,
        TABLE_DUMP = 19,
        CONNECT_OUT = 20,
        REGISTER_SLAVE = 21,
        PREPARE = 22,
        EXECUTE = 23,
        LONG_DATA = 24,
        CLOSE_STMT = 25,
        RESET_STMT = 26,
        SET_OPTION = 27,
        FETCH = 28
    }


    /// <summary>
    /// Specifies MySQL specific data type of a field, property, for use in a <see cref="MySqlParameter"/>.
    /// </summary>
    internal enum MySqlDbType
    {
        /// <summary>
        /// <see cref="Decimal"/>
        /// <para>A fixed precision and scale numeric value between -1038 
        /// -1 and 10 38 -1.</para>
        /// </summary>
        Decimal = 0,
        /// <summary>
        /// <see cref="Byte"/><para>The signed range is -128 to 127. The unsigned 
        /// range is 0 to 255.</para>
        /// </summary>
        Byte = 1,
        /// <summary>
        /// <see cref="Int16"/><para>A 16-bit signed integer. The signed range is 
        /// -32768 to 32767. The unsigned range is 0 to 65535</para>
        /// </summary>
        Int16 = 2,
        /// <summary>
        /// Specifies a 24 (3 byte) signed or unsigned value.
        /// </summary>
        Int24 = 9,
        /// <summary>
        /// <see cref="Int32"/><para>A 32-bit signed integer</para>
        /// </summary>
        Int32 = 3,
        /// <summary>
        /// <see cref="Int64"/><para>A 64-bit signed integer.</para>
        /// </summary>
        Int64 = 8,
        /// <summary>
        /// <see cref="Single"/><para>A small (single-precision) floating-point 
        /// number. Allowable values are -3.402823466E+38 to -1.175494351E-38, 
        /// 0, and 1.175494351E-38 to 3.402823466E+38.</para>
        /// </summary>
        Float = 4,
        /// <summary>
        /// <see cref="Double"/><para>A normal-size (double-precision) 
        /// floating-point number. Allowable values are -1.7976931348623157E+308 
        /// to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 
        /// 1.7976931348623157E+308.</para>
        /// </summary>
        Double = 5,
        /// <summary>
        /// A timestamp. The range is '1970-01-01 00:00:00' to sometime in the 
        /// year 2037
        /// </summary>
        Timestamp = 7,
        ///<summary>
        ///Date The supported range is '1000-01-01' to '9999-12-31'.
        ///</summary>
        Date = 10,
        /// <summary>
        /// Time <para>The range is '-838:59:59' to '838:59:59'.</para>
        /// </summary>
        Time = 11,
        ///<summary>
        ///DateTime The supported range is '1000-01-01 00:00:00' to 
        ///'9999-12-31 23:59:59'.
        ///</summary>
        DateTime = 12,
        ///<summary>
        ///Datetime The supported range is '1000-01-01 00:00:00' to 
        ///'9999-12-31 23:59:59'.
        ///</summary>
        [Obsolete("The Datetime enum value is obsolete.  Please use DateTime.")]
        Datetime = 12,
        /// <summary>
        /// A year in 2- or 4-digit format (default is 4-digit). The 
        /// allowable values are 1901 to 2155, 0000 in the 4-digit year 
        /// format, and 1970-2069 if you use the 2-digit format (70-69).
        /// </summary>
        Year = 13,
        /// <summary>
        /// <b>Obsolete</b>  Use Datetime or Date type
        /// </summary>
        Newdate = 14,
        /// <summary>
        /// A variable-length string containing 0 to 65535 characters
        /// </summary>
        VarString = 15,
        /// <summary>
        /// Bit-field data type
        /// </summary>
        Bit = 16,
        /// <summary>
        /// JSON
        /// </summary>
        JSON = 245,
        /// <summary>
        /// New Decimal
        /// </summary>
        NewDecimal = 246,
        /// <summary>
        /// An enumeration. A string object that can have only one value, 
        /// chosen from the list of values 'value1', 'value2', ..., NULL 
        /// or the special "" error value. An ENUM can have a maximum of 
        /// 65535 distinct values
        /// </summary>
        Enum = 247,
        /// <summary>
        /// A set. A string object that can have zero or more values, each 
        /// of which must be chosen from the list of values 'value1', 'value2', 
        /// ... A SET can have a maximum of 64 members.
        /// </summary>
        Set = 248,
        /// <summary>
        /// A binary column with a maximum length of 255 (2^8 - 1) 
        /// characters
        /// </summary>
        TinyBlob = 249,
        /// <summary>
        /// A binary column with a maximum length of 16777215 (2^24 - 1) bytes.
        /// </summary>
        MediumBlob = 250,
        /// <summary>
        /// A binary column with a maximum length of 4294967295 or 
        /// 4G (2^32 - 1) bytes.
        /// </summary>
        LongBlob = 251,
        /// <summary>
        /// A binary column with a maximum length of 65535 (2^16 - 1) bytes.
        /// </summary>
        Blob = 252,
        /// <summary>
        /// A variable-length string containing 0 to 255 bytes.
        /// </summary>
        VarChar = 253,
        /// <summary>
        /// A fixed-length string.
        /// </summary>
        String = 254,
        /// <summary>
        /// Geometric (GIS) data type.
        /// </summary>
        Geometry = 255,
        /// <summary>
        /// Unsigned 8-bit value.
        /// </summary>
        UByte = 501,
        /// <summary>
        /// Unsigned 16-bit value.
        /// </summary>
        UInt16 = 502,
        /// <summary>
        /// Unsigned 24-bit value.
        /// </summary>
        UInt24 = 509,
        /// <summary>
        /// Unsigned 32-bit value.
        /// </summary>
        UInt32 = 503,
        /// <summary>
        /// Unsigned 64-bit value.
        /// </summary>
        UInt64 = 508,
        /// <summary>
        /// Fixed length binary string.
        /// </summary>
        Binary = 754,
        /// <summary>
        /// Variable length binary string.
        /// </summary>
        VarBinary = 753,
        /// <summary>
        /// A text column with a maximum length of 255 (2^8 - 1) characters.
        /// </summary>
        TinyText = 749,
        /// <summary>
        /// A text column with a maximum length of 16777215 (2^24 - 1) characters.
        /// </summary>
        MediumText = 750,
        /// <summary>
        /// A text column with a maximum length of 4294967295 or 
        /// 4G (2^32 - 1) characters.
        /// </summary>
        LongText = 751,
        /// <summary>
        /// A text column with a maximum length of 65535 (2^16 - 1) characters.
        /// </summary>
        Text = 752,
        /// <summary>
        /// A guid column.
        /// </summary>
        Guid = 854
    };


    internal enum Field_Type : byte
    {
        DECIMAL = 0,
        BYTE = 1,
        SHORT = 2,
        LONG = 3,
        FLOAT = 4,
        DOUBLE = 5,
        NULL = 6,
        TIMESTAMP = 7,
        LONGLONG = 8,
        INT24 = 9,
        DATE = 10,
        TIME = 11,
        DATETIME = 12,
        YEAR = 13,
        NEWDATE = 14,
        ENUM = 247,
        SET = 248,
        TINY_BLOB = 249,
        MEDIUM_BLOB = 250,
        LONG_BLOB = 251,
        BLOB = 252,
        VAR_STRING = 253,
        STRING = 254,
    }

    /// <summary>
    /// Allows the user to specify the type of connection that should
    /// be used.
    /// </summary>
    internal enum MySqlConnectionProtocol
    {
        /// <summary>
        /// TCP/IP style connection. Works everywhere.
        /// </summary>
        Sockets = 1,
        /// <summary>
        /// TCP/IP style connection. Works everywhere.
        /// </summary>
        Socket = 1,
        /// <summary>
        /// TCP/IP style connection. Works everywhere.
        /// </summary>
        Tcp = 1,
        /// <summary>
        /// Named pipe connection. Works only on Windows systems.
        /// </summary>
        Pipe = 2,
        /// <summary>
        /// Named pipe connection. Works only on Windows systems.
        /// </summary>
        NamedPipe = 2,
        /// <summary>
        /// Unix domain socket connection. Works only with Unix systems.
        /// </summary>
        UnixSocket = 3,
        /// <summary>
        /// Unix domain socket connection. Works only with Unix systems.
        /// </summary>
        Unix = 3,
        /// <summary>
        /// Shared memory connection. Currently works only with Windows systems.
        /// </summary>
        SharedMemory = 4,
        /// <summary>
        /// Shared memory connection. Currently works only with Windows systems.
        /// </summary>
        Memory = 4
    }

    /// <summary>
    /// SSL options for connection.
    /// </summary>
    internal enum MySqlSslMode
    {
        /// <summary>
        /// Do not use SSL.
        /// </summary>
        None,
        /// <summary>
        /// Use SSL, if server supports it.
        /// </summary>
        Preferred,
        /// <summary>
        /// Use SSL, if server supports it.
        /// </summary>
        Prefered = Preferred,
        /// <summary>
        /// Always use SSL. Deny connection if server does not support SSL.
        /// Do not perform server certificate validation.
        /// This is the default SSL mode when not specified as part of the connection string.
        /// </summary>
        Required,
        /// <summary>
        /// Always use SSL. Validate server SSL certificate, but different host name mismatch.
        /// </summary>
        VerifyCA,
        /// <summary>
        /// Always use SSL and perform full certificate validation.
        /// </summary>
        VerifyFull
    }

    /// <summary>
    /// Specifies the connection types supported
    /// </summary>
    internal enum MySqlDriverType
    {
        /// <summary>
        /// Use TCP/IP sockets.
        /// </summary>
        Native,
        /// <summary>
        /// Use client library.
        /// </summary>
        Client,
        /// <summary>
        /// Use MySQL embedded server.
        /// </summary>
        Embedded
    }

    /// <summary>
    /// Defines the location of the certificate store.
    /// </summary>
    internal enum MySqlCertificateStoreLocation
    {
        /// <summary>
        /// Do not use certificate store.
        /// </summary>
        None,
        /// <summary>
        /// Use certificate store for the current user.
        /// </summary>
        CurrentUser,
        /// <summary>
        /// User certificate store for the machine.
        /// </summary>
        LocalMachine
    }

    internal class MySqlConnectAttrs
    {
        static string _version;
        static string _os;
        static string _platform;

        static MySqlConnectAttrs()
        {
            InitVersion();
            InitOS();
            InitPlatform();
        }

        [DisplayName("_client_name")]
        public string ClientName => "MySql Connector/NET";

        [DisplayName("_pid")]
        public string PID
        {
            get
            {
                string pid = string.Empty;
                try
                {
                    pid = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture);
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.ToString());
                }

                return pid;
            }
        }

        [DisplayName("_client_version")]
        public string ClientVersion
        {
            get { return _version; }
        }

        [DisplayName("_os")]
        public string OS
        {
            get { return _os; }
        }

        [DisplayName("_thread")]
        public string Thread
        {
            get
            {
                string thread = string.Empty;
                try
                {
                    thread = System.Diagnostics.Process.GetCurrentProcess().Threads[0].Id.ToString(CultureInfo.InvariantCulture);
                }
                catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); }

                return thread;
            }
        }

        [DisplayName("_platform")]
        public string Platform
        {
            get { return _platform; }
        }

        private static void InitVersion()
        {
            _version = string.Empty;
            try
            {
                _version = typeof(MySqlConnectAttrs).GetTypeInfo().Assembly.GetName().Version.ToString();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
            }
        }

        private static void InitOS()
        {
            _os = string.Empty;
            try
            {
                if (Externals.MySql.Data.Common.Platform.IsDotNetCore())
                {
                    _os = ".Net Core";
                }
                _os = Environment.OSVersion.Platform.ToString();
                if (_os == "Win32NT")
                {
                    _os = "Win";
                    _os += Is64BitOS() ? "64" : "32";
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
            }
        }

        private static void InitPlatform()
        {
            _platform = Is64BitOS() ? "x86_64" : "x86_32";
        }

        private static bool Is64BitOS()
        {
            return Environment.Is64BitOperatingSystem;
            // return Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "AMD64";
        }
    }
}

#endif