List:Commits« Previous MessageNext Message »
From:Reggie Burnett Date:October 23 2009 7:04pm
Subject:bzr commit into connector-net-trunk branch (reggie.burnett:790)
Bug#47985
View as plain text  
#At file:///D:/bzr-connector-net/trunk/ based on revid:reggie.burnett@stripped

  790 Reggie Burnett	2009-10-23 [merge]
      - fixed guid type so that multi-byte character sets will not effect how it works.  A column would be
        considered a guid if it has a *character* length of 36, not a *byte* length of 36 (bug #47985)

    modified:
      CHANGES
      MySql.Data/Provider/Source/Driver.cs
      MySql.Data/Provider/Source/Field.cs
      MySql.Data/Provider/Source/NativeDriver.cs
      MySql.Data/Tests/Source/DataTypeTests.cs
=== modified file 'CHANGES'
=== modified file 'CHANGES'
--- a/CHANGES	2009-10-23 15:51:10 +0000
+++ b/CHANGES	2009-10-23 19:02:53 +0000
@@ -1,6 +1,8 @@
 Version 6.2.1
 - implemented support for client SSL certificates
 - fixed indexes schema collection so that it still works with bad table names such as b``a`d (bug #48101)
+- fixed guid type so that multi-byte character sets will not effect how it works.  A column would be
+  considered a guid if it has a *character* length of 36, not a *byte* length of 36 (bug #47985)
 
 Version 6.2.0
 - we now cleanup idle connections in the pool, if they were not used for too long

=== modified file 'MySql.Data/Provider/Source/Driver.cs'
--- a/MySql.Data/Provider/Source/Driver.cs	2009-10-22 15:27:25 +0000
+++ b/MySql.Data/Provider/Source/Driver.cs	2009-10-23 19:02:53 +0000
@@ -151,6 +151,11 @@
             get { return serverCharSetIndex; }
         }
 
+        internal Hashtable CharacterSets
+        {
+            get { return charSets; }
+        }
+
         public bool SupportsOutputParameters 
         {
             get { return Version.isAtLeast(6,0,8); }
@@ -386,30 +391,12 @@
             NextResult(0);
         }
 
-        private void SetFieldEncoding(MySqlField f)
-        {
-            if (charSets == null || f.CharacterSetIndex == -1) return;
-            if (charSets[f.CharacterSetIndex] == null) return;
-
-            CharacterSet cs = CharSetMap.GetCharacterSet(Version, (string) charSets[f.CharacterSetIndex]);
-            // starting with 6.0.4 utf8 has a maxlen of 4 instead of 3.  The old
-            // 3 byte utf8 is utf8mb3
-            if (cs.name.ToLower(System.Globalization.CultureInfo.InvariantCulture) == "utf-8" &&
-                Version.Major >= 6)
-                f.MaxLength = 4;
-            else
-                f.MaxLength = cs.byteCount;
-            f.Encoding = CharSetMap.GetEncoding(Version, (string) charSets[f.CharacterSetIndex]);
-        }
-
         public MySqlField[] GetColumns(int count)
         {
             MySqlField[] fields = new MySqlField[count];
             for (int i = 0; i < count; i++)
                 fields[i] = new MySqlField(connection);
             handler.GetColumnsData(fields);
-            for (int i = 0; i < count; i++)
-                SetFieldEncoding(fields[i]);
 
             return fields;
         }

=== modified file 'MySql.Data/Provider/Source/Field.cs'
--- a/MySql.Data/Provider/Source/Field.cs	2009-10-22 15:27:25 +0000
+++ b/MySql.Data/Provider/Source/Field.cs	2009-10-23 19:02:53 +0000
@@ -24,6 +24,7 @@
 using System.Globalization;
 using System.Text.RegularExpressions;
 using System;
+using System.Collections;
 
 namespace MySql.Data.MySqlClient
 {
@@ -87,7 +88,7 @@
         public int CharacterSetIndex
         {
             get { return charSetIndex; }
-            set { charSetIndex = value; }
+            set { charSetIndex = value; SetFieldEncoding();  }
         }
 
         public MySqlDbType Type
@@ -177,6 +178,11 @@
 			}
 		}
 
+        public int CharacterLength
+        {
+            get { return ColumnLength / MaxLength; }
+        }
+
         #endregion
 
         public void SetTypeAndFlags(MySqlDbType type, ColumnFlags flags)
@@ -261,7 +267,7 @@
             if (connection.Settings.RespectBinaryFlags)
                 CheckForExceptions();
 
-            if (Type == MySqlDbType.String && ColumnLength == 36 && !connection.Settings.OldGuids)
+            if (Type == MySqlDbType.String && CharacterLength == 36 && !connection.Settings.OldGuids)
                 mySqlDbType = MySqlDbType.Guid;
 
             if (!IsBinary) return;
@@ -373,5 +379,24 @@
                     throw new MySqlException("Unknown data type");
             }
         }
+
+        private void SetFieldEncoding()
+        {
+            Hashtable charSets = connection.driver.CharacterSets;
+            DBVersion version = connection.driver.Version;
+
+            if (charSets == null || CharacterSetIndex == -1) return;
+            if (charSets[CharacterSetIndex] == null) return;
+
+            CharacterSet cs = CharSetMap.GetCharacterSet(version, (string)charSets[CharacterSetIndex]);
+            // starting with 6.0.4 utf8 has a maxlen of 4 instead of 3.  The old
+            // 3 byte utf8 is utf8mb3
+            if (cs.name.ToLower(System.Globalization.CultureInfo.InvariantCulture) == "utf-8" &&
+                version.Major >= 6)
+                MaxLength = 4;
+            else
+                MaxLength = cs.byteCount;
+            Encoding = CharSetMap.GetEncoding(version, (string)charSets[CharacterSetIndex]);
+        }
     }
 }

=== modified file 'MySql.Data/Provider/Source/NativeDriver.cs'
--- a/MySql.Data/Provider/Source/NativeDriver.cs	2009-10-23 11:31:00 +0000
+++ b/MySql.Data/Provider/Source/NativeDriver.cs	2009-10-23 19:02:53 +0000
@@ -676,13 +676,12 @@
                 colFlags = (ColumnFlags)packet.ReadInteger(2);
             else
                 colFlags = (ColumnFlags)packet.ReadByte();
-            field.SetTypeAndFlags(type, colFlags);
             field.Scale = (byte)packet.ReadByte();
-
             if (packet.HasMoreData)
             {
                 packet.ReadInteger(2); // reserved
             }
+            field.SetTypeAndFlags(type, colFlags);
         }
 
         private void ExecutePacket(MySqlPacket packetToExecute)

=== modified file 'MySql.Data/Tests/Source/DataTypeTests.cs'
--- a/MySql.Data/Tests/Source/DataTypeTests.cs	2009-10-16 14:49:08 +0000
+++ b/MySql.Data/Tests/Source/DataTypeTests.cs	2009-10-23 19:02:53 +0000
@@ -979,5 +979,30 @@
                 }
             }
         }
+
+        /// <summary>
+        /// Bug #47985	UTF-8 String Length Issue (guids etc)
+        /// </summary>
+        [Test]
+        public void UTF8Char12AsGuid()
+        {
+            execSQL("DROP TABLE IF EXISTS Test");
+            execSQL("CREATE TABLE Test (id INT, name CHAR(12) CHARSET utf8)");
+            execSQL("INSERT INTO Test VALUES (1, 'Name')");
+
+            string connStr = GetConnectionString(true) + ";charset=utf8";
+            using (MySqlConnection c = new MySqlConnection(connStr))
+            {
+                c.Open();
+
+                MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c);
+                using (MySqlDataReader reader = cmd.ExecuteReader())
+                {
+                    reader.Read();
+                    string s = reader.GetString(1);
+                    Assert.AreEqual("Name", s);
+                }
+            }
+        }
     }
 }


Attachment: [text/bzr-bundle] bzr/reggie.burnett@sun.com-20091023190403-rzzr0aeljqbs8oa5.bundle
Thread
bzr commit into connector-net-trunk branch (reggie.burnett:790)Bug#47985Reggie Burnett23 Oct