static void Register(MySqlTypeConversionPlan plan)
 {
     s_implicitConvPlan.Add(plan.SourceMySqlType, plan);
 }
 static void RegisterWithDefaultStringConv(MySqlTypeConversionPlan plan)
 {
     //for all plan
     plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.GenString);
     s_implicitConvPlan.Add(plan.SourceMySqlType, plan);
 }
        static MySqlTypeConversionInfo()
        {
            //-----------------------------------------------------------
            s_dataTypeMaps.Add(typeof(bool), ProperDataType.Bool);
            s_dataTypeMaps.Add(typeof(byte), ProperDataType.Byte);
            s_dataTypeMaps.Add(typeof(sbyte), ProperDataType.Sbyte);
            s_dataTypeMaps.Add(typeof(char), ProperDataType.Char);
            s_dataTypeMaps.Add(typeof(Int16), ProperDataType.Int16);
            s_dataTypeMaps.Add(typeof(UInt16), ProperDataType.UInt16);
            s_dataTypeMaps.Add(typeof(int), ProperDataType.Int32);
            s_dataTypeMaps.Add(typeof(uint), ProperDataType.UInt32);
            s_dataTypeMaps.Add(typeof(long), ProperDataType.Int64);
            s_dataTypeMaps.Add(typeof(ulong), ProperDataType.UInt64);
            s_dataTypeMaps.Add(typeof(float), ProperDataType.Float32);
            s_dataTypeMaps.Add(typeof(double), ProperDataType.Double64);
            s_dataTypeMaps.Add(typeof(DateTime), ProperDataType.DateTime);
            s_dataTypeMaps.Add(typeof(string), ProperDataType.String);
            s_dataTypeMaps.Add(typeof(byte[]), ProperDataType.Buffer);
            //-----------------------------------------------------------
            {
                //mysql src is blob
                var plan = new MySqlTypeConversionPlan(MySqlDataType.BLOB);
                //target
                plan.AddConvTarget(typeof(byte[]), MySqlDataConversionTechnique.Direct);
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.BlobToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.LONG_BLOB);
                //target
                plan.AddConvTarget(typeof(byte[]), MySqlDataConversionTechnique.Direct);
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.BlobToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.MEDIUM_BLOB);
                //target
                plan.AddConvTarget(typeof(byte[]), MySqlDataConversionTechnique.Direct);
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.BlobToString);
                Register(plan);
            }

            //-----------------------------------------------------------
            {
                //mysql src is string
                var plan = new MySqlTypeConversionPlan(MySqlDataType.STRING);
                //target
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.StringToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.VARCHAR);
                //target
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.StringToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.VAR_STRING);
                //target
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.StringToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.DECIMAL);
                //target
                plan.AddConvTarget(typeof(float), MySqlDataConversionTechnique.DecimalToFloat);
                plan.AddConvTarget(typeof(double), MySqlDataConversionTechnique.DecimalToDouble);
                plan.AddConvTarget(typeof(decimal), MySqlDataConversionTechnique.DecimalToDecimal);
                Register(plan);
            }
            //-----------------------------------------------------------
            {
                //TODO: review here
                //1. if we use prepared statement, we have information about signed/unsiged field
                //see ... a flag byte which has the highest bit set if the type is unsigned [80]  ...
                //https://dev.mysql.com/doc/internals/en/com-stmt-execute.html#packet-COM_STMT_EXECUTE
                //
                //2. if we not use prepared statement then ..
                //WARNING:
                //my sql not store sign or unsign data in field packet ?
                //but we can get it from sql that show table information
                //so only at this point, we have a tiny (int) -> it can be interpreted as byte or sbyte?



                var plan = new MySqlTypeConversionPlan(MySqlDataType.TINY); //1 byte int
                plan.AddConvTargets(
                    new[] { typeof(byte), typeof(char),
                            typeof(short), typeof(ushort),
                            typeof(int), typeof(uint),
                            typeof(long), typeof(double),
                            typeof(decimal) },
                    MySqlDataConversionTechnique.Direct);
                //TODO: review sbyte?
                //conv bool
                RegisterWithDefaultStringConv(plan);
            }
            //-----------------------------------------------------------
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.SHORT); //2 byte int

                plan.AddConvTargets(
                    new[] { typeof(char),
                            typeof(short), typeof(ushort),
                            typeof(int), typeof(uint),
                            typeof(long), typeof(ulong),
                            typeof(float), typeof(double), typeof(decimal) },
                    MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }

            //-----------------------------------------------------------
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.INT24); //3 byte int

                plan.AddConvTargets(
                    new[] { typeof(int), typeof(uint),
                            typeof(long), typeof(ulong),
                            typeof(float), typeof(double), typeof(decimal) },
                    MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.LONG); //4 byte int
                plan.AddConvTargets(
                    new[] { typeof(int), typeof(uint),
                            typeof(long), typeof(ulong),
                            typeof(float), typeof(double), typeof(decimal) },
                    MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.LONGLONG); //8 byte int
                //target
                plan.AddConvTargets(
                    new[] {
                    typeof(long), typeof(ulong),
                    typeof(double), typeof(decimal)
                },
                    MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            //-----------------------------------------------------------
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.FLOAT);  //4  byte
                plan.AddConvTargets(
                    new[] {
                    typeof(float), typeof(double),
                    typeof(decimal)
                },
                    MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.DOUBLE);  //4  byte
                plan.AddConvTargets(
                    new[] {
                    typeof(double),
                    typeof(decimal)
                },
                    MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            //-----------------------------------------------------------
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.NEWDECIMAL);
                plan.AddConvTargets(
                    new[] { typeof(decimal) },
                    MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.NEWDATE);
                RegisterWithDefaultStringConv(plan);
            }
            //-----------------------------------------------------------
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.DATE);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.TIME);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.DATETIME);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.TIMESTAMP);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            //-----------------------------------------------------------
        }
 static void Register(MySqlTypeConversionPlan plan)
 {
     implicitConvPlan.Add(plan.SourceMySqlType, plan);
 }
 static void RegisterWithDefaultStringConv(MySqlTypeConversionPlan plan)
 {
     //for all plan
     plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.GenString);
     implicitConvPlan.Add(plan.SourceMySqlType, plan);
 }
        static MySqlTypeConversionInfo()
        {
            //-----------------------------------------------------------
            dataTypeMaps.Add(typeof(bool), ProperDataType.Bool);
            dataTypeMaps.Add(typeof(byte), ProperDataType.Byte);
            dataTypeMaps.Add(typeof(sbyte), ProperDataType.Sbyte);
            dataTypeMaps.Add(typeof(char), ProperDataType.Char);
            dataTypeMaps.Add(typeof(Int16), ProperDataType.Int16);
            dataTypeMaps.Add(typeof(UInt16), ProperDataType.UInt16);
            dataTypeMaps.Add(typeof(int), ProperDataType.Int32);
            dataTypeMaps.Add(typeof(uint), ProperDataType.UInt32);
            dataTypeMaps.Add(typeof(long), ProperDataType.Int64);
            dataTypeMaps.Add(typeof(ulong), ProperDataType.UInt64);
            dataTypeMaps.Add(typeof(float), ProperDataType.Float32);
            dataTypeMaps.Add(typeof(double), ProperDataType.Double64);
            dataTypeMaps.Add(typeof(DateTime), ProperDataType.DateTime);
            dataTypeMaps.Add(typeof(string), ProperDataType.String);
            dataTypeMaps.Add(typeof(byte[]), ProperDataType.Buffer);
            //-----------------------------------------------------------  
            {
                //mysql src is blob
                var plan = new MySqlTypeConversionPlan(MySqlDataType.BLOB);
                //target
                plan.AddConvTarget(typeof(byte[]), MySqlDataConversionTechnique.Direct);
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.BlobToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.LONG_BLOB);
                //target
                plan.AddConvTarget(typeof(byte[]), MySqlDataConversionTechnique.Direct);
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.BlobToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.MEDIUM_BLOB);
                //target
                plan.AddConvTarget(typeof(byte[]), MySqlDataConversionTechnique.Direct);
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.BlobToString);
                Register(plan);
            }

            //----------------------------------------------------------- 
            {
                //mysql src is string
                var plan = new MySqlTypeConversionPlan(MySqlDataType.STRING);
                //target 
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.StringToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.VARCHAR);
                //target 
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.StringToString);
                Register(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.VAR_STRING);
                //target 
                plan.AddConvTarget(typeof(string), MySqlDataConversionTechnique.StringToString);
                Register(plan);
            }
            //----------------------------------------------------------- 
            {
                //TODO: review here
                //1. if we use prepared statement, we have information about signed/unsiged field
                //see ... a flag byte which has the highest bit set if the type is unsigned [80]  ...
                //https://dev.mysql.com/doc/internals/en/com-stmt-execute.html#packet-COM_STMT_EXECUTE
                //
                //2. if we not use prepared statement then ..
                //WARNING: 
                //my sql not store sign or unsign data in field packet ?
                //but we can get it from sql that show table information
                //so only at this point, we have a tiny (int) -> it can be interpreted as byte or sbyte?              




                var plan = new MySqlTypeConversionPlan(MySqlDataType.TINY); //1 byte int     
                plan.AddConvTargets(
                  new[] {  typeof(byte),typeof(char),
                           typeof(short),typeof(ushort),
                           typeof(int),typeof(uint),
                           typeof(long),typeof(double),
                           typeof(decimal)
                        },
                        MySqlDataConversionTechnique.Direct);
                //TODO: review sbyte?
                //conv bool  
                RegisterWithDefaultStringConv(plan);
            }
            //----------------------------------------------------------- 
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.SHORT); //2 byte int 

                plan.AddConvTargets(
                 new[] {   typeof(char),
                           typeof(short),typeof(ushort),
                           typeof(int),typeof(uint),
                           typeof(long),typeof(ulong),
                           typeof(float),typeof(double),typeof(decimal)
                       },
                       MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }

            //----------------------------------------------------------- 
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.INT24); //3 byte int 

                plan.AddConvTargets(
                 new[] {   typeof(int),typeof(uint),
                           typeof(long),typeof(ulong),
                           typeof(float),typeof(double),typeof(decimal)
                       },
                       MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.LONG); //4 byte int
                plan.AddConvTargets(
                new[] {   typeof(int),typeof(uint),
                          typeof(long),typeof(ulong),
                          typeof(float),typeof(double),typeof(decimal)
                      },
                      MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.LONGLONG); //8 byte int 
                //target
                plan.AddConvTargets(
                 new[] {
                          typeof(long),typeof(ulong),
                          typeof(double),typeof(decimal)
                       },
                       MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            //-----------------------------------------------------------
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.FLOAT);  //4  byte
                plan.AddConvTargets(
                 new[] {
                          typeof(float),typeof(double),
                          typeof(decimal)
                       },
                       MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.DOUBLE);  //4  byte
                plan.AddConvTargets(
                 new[] {
                          typeof(double),
                          typeof(decimal)
                       },
                       MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            //-----------------------------------------------------------
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.NEWDECIMAL);
                plan.AddConvTargets(
                  new[] {  typeof(decimal)
                        },
                        MySqlDataConversionTechnique.Direct);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.NEWDATE);
                RegisterWithDefaultStringConv(plan);
            }
            //----------------------------------------------------------- 
            {

                var plan = new MySqlTypeConversionPlan(MySqlDataType.DATE);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.TIME);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.DATETIME);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            {
                var plan = new MySqlTypeConversionPlan(MySqlDataType.TIMESTAMP);
                plan.AddConvTarget(typeof(DateTime), MySqlDataConversionTechnique.GenDateTime);
                RegisterWithDefaultStringConv(plan);
            }
            //----------------------------------------------------------- 
        }