You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by km...@apache.org on 2010/07/22 00:57:27 UTC

svn commit: r966452 - in /db/derby/code/trunk/java: drda/org/apache/derby/impl/drda/ testing/org/apache/derbyTesting/functionTests/tests/derbynet/

Author: kmarsden
Date: Wed Jul 21 22:57:27 2010
New Revision: 966452

URL: http://svn.apache.org/viewvc?rev=966452&view=rev
Log:
DERBY-4746  (Server) Implement UTF8 support on DRDA

Made a small change to the Utf8CcsidManagerTest to accommodate for the fact that the convertToJavaString takes the offset and numCount in bytes and not characters. 

Contributed by Tiago R Espinha (tiago dot derby at yahoo dot co dot uk)


Modified:
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/CcsidManager.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMWriter.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/EbcdicCcsidManager.java
    db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/Utf8CcsidManager.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/Utf8CcsidManagerTest.java

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/CcsidManager.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/CcsidManager.java?rev=966452&r1=966451&r2=966452&view=diff
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/CcsidManager.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/CcsidManager.java Wed Jul 21 22:57:27 2010
@@ -32,6 +32,10 @@ abstract class CcsidManager
   // bytes containing the character representation "value" for the particular ccsid.
   byte[] numToCharRepresentation;
 
+  /* DRDA CCSID levels for UTF8 and EBCDIC */
+  public static final int UTF8_CCSID = 1208;
+  public static final int EBCDIC_CCSID = 500;
+  
   CcsidManager (byte space, byte dot, byte[] numToCharRepresentation)
   {
     this.space = space;
@@ -39,7 +43,13 @@ abstract class CcsidManager
     this.numToCharRepresentation = numToCharRepresentation;
   }
 
-
+  /**
+   * Returns the length in bytes for the String str using a particular ccsid.
+   * @param str The Java String from which to obtain the length.
+   * @return The length in bytes of the String str.
+   */
+  abstract int getByteLength (String str);
+  
   // Convert a Java String into bytes for a particular ccsid.
   //
   // @param sourceString A Java String to convert.

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMWriter.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMWriter.java?rev=966452&r1=966451&r2=966452&view=diff
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMWriter.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/DDMWriter.java Wed Jul 21 22:57:27 2010
@@ -902,7 +902,7 @@ class DDMWriter
 	 */
 	void writeScalarString (int codePoint, String string)
 	{
-		int stringLength = string.length();
+		int stringLength = ccsidManager.getByteLength(string);
 		ensureLength ((stringLength * 2)  + 4);
 		buffer.putShort((short) (stringLength + 4));
 		buffer.putShort((short) codePoint);

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/EbcdicCcsidManager.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/EbcdicCcsidManager.java?rev=966452&r1=966451&r2=966452&view=diff
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/EbcdicCcsidManager.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/EbcdicCcsidManager.java Wed Jul 21 22:57:27 2010
@@ -170,4 +170,8 @@ class EbcdicCcsidManager extends CcsidMa
 		return new String (theChars);
 	}
 
+    int getByteLength(String str) {
+        return str.length();
+    }
+
 }

Modified: db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/Utf8CcsidManager.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/Utf8CcsidManager.java?rev=966452&r1=966451&r2=966452&view=diff
==============================================================================
--- db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/Utf8CcsidManager.java (original)
+++ db/derby/code/trunk/java/drda/org/apache/derby/impl/drda/Utf8CcsidManager.java Wed Jul 21 22:57:27 2010
@@ -67,9 +67,12 @@ public class Utf8CcsidManager extends Cc
         return null;
     }
 
+    /**
+     * Offset and numToConvert are given in terms of bytes! Not characters!
+     */
     public String convertToJavaString(byte[] sourceBytes, int offset, int numToConvert) {
         try {
-            return new String(sourceBytes,"UTF-8").substring(offset, offset+numToConvert);
+            return new String(sourceBytes, offset, numToConvert, "UTF-8");
         } catch (UnsupportedEncodingException e) {
             if (SanityManager.DEBUG) {
                 SanityManager.THROWASSERT("Could not convert byte[] to Java String using UTF-8 encoding with offset",e);
@@ -90,4 +93,15 @@ public class Utf8CcsidManager extends Cc
         buffer.put(convertFromJavaString(sourceString));
     }
 
+    int getByteLength(String str) {
+        try {
+            return str.getBytes("UTF-8").length;
+        } catch (UnsupportedEncodingException e) {
+            if (SanityManager.DEBUG) {
+                SanityManager.THROWASSERT("Could not obtain byte length of Java String in Utf8CcsidManager",e);
+            }
+        }
+        return -1;
+    }
+
 }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/Utf8CcsidManagerTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/Utf8CcsidManagerTest.java?rev=966452&r1=966451&r2=966452&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/Utf8CcsidManagerTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/Utf8CcsidManagerTest.java Wed Jul 21 22:57:27 2010
@@ -88,7 +88,7 @@ public class Utf8CcsidManagerTest extend
         assertEquals(ucs2String, convertedString);
         
         // Convert just the two characters as offset above and compare
-        String convertedOffset = ccsidManager.convertToJavaString(utf8Bytes, 1, 2);
+        String convertedOffset = ccsidManager.convertToJavaString(utf8Bytes, 3, 6);
         assertEquals(offsetUcs2String, convertedOffset);
     }