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 rh...@apache.org on 2008/04/15 15:06:16 UTC
svn commit: r648232 - in /db/derby/code/trunk/java/engine/org/apache/derby:
iapi/services/io/FormatIdUtil.java impl/sql/compile/FromVTI.java
impl/sql/execute/VTIResultSet.java
Author: rhillegas
Date: Tue Apr 15 06:06:10 2008
New Revision: 648232
URL: http://svn.apache.org/viewvc?rev=648232&view=rev
Log:
DERBY-3616: Devise a platform-independent encoding for passing the Table Function signature from the compiler to the execution machinery.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/FormatIdUtil.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/FormatIdUtil.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/FormatIdUtil.java?rev=648232&r1=648231&r2=648232&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/FormatIdUtil.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/FormatIdUtil.java Tue Apr 15 06:06:10 2008
@@ -48,6 +48,11 @@
*/
public final class FormatIdUtil
{
+ private static final int BYTE_MASK = 0xFF;
+ private static final int NIBBLE_MASK = 0xF;
+ private static final int NIBBLE_SHIFT = 4;
+ private static final int HEX_RADIX = 16;
+
private FormatIdUtil() {
}
@@ -76,4 +81,61 @@
return Integer.toString(fmtId);
}
+
+ /**
+ * <p>
+ * Encode a byte array as a string.
+ * </p>
+ */
+ public static String toString( byte[] written, int count )
+ {
+ char[] chars = new char[ count * 2 ];
+ int charIdx = 0;
+
+ for ( int i = 0; i < count; i++ )
+ {
+ int current = written[ i ] & BYTE_MASK;
+ int lowNibble = current & NIBBLE_MASK;
+ int highNibble = current >>> NIBBLE_SHIFT;
+
+ chars[ charIdx++ ] = encodeNibble( lowNibble );
+ chars[ charIdx++ ] = encodeNibble( highNibble );
+ }
+
+ return new String( chars );
+ }
+
+ /**
+ * <p>
+ * Decode a byte array which had been encoded as a string.
+ * </p>
+ */
+ public static byte[] fromString( String objString )
+ {
+ char[] chars = objString.toCharArray();
+ int count = chars.length;
+ byte[] bytes = new byte[ count / 2 ];
+ int byteIdx = 0;
+
+ for ( int i = 0; i < count; i = i + 2 )
+ {
+ int lowNibble = decodeNibble( chars[ i ] );
+ int highNibble = decodeNibble( chars[ i + 1 ] );
+
+ bytes[ byteIdx++ ] = (byte) ( ( highNibble << NIBBLE_SHIFT ) | lowNibble );
+ }
+
+ return bytes;
+ }
+
+ private static char encodeNibble( int nibble )
+ {
+ return Character.forDigit( nibble, HEX_RADIX );
+ }
+
+ private static int decodeNibble( char c )
+ {
+ return Character.digit( c, HEX_RADIX );
+ }
+
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java?rev=648232&r1=648231&r2=648232&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java Tue Apr 15 06:06:10 2008
@@ -23,6 +23,7 @@
import org.apache.derby.iapi.services.io.DynamicByteArrayOutputStream;
import org.apache.derby.iapi.services.io.FormatIdOutputStream;
+import org.apache.derby.iapi.services.io.FormatIdUtil;
import org.apache.derby.iapi.services.loader.ClassInspector;
import org.apache.derby.iapi.services.loader.GeneratedMethod;
@@ -1702,13 +1703,17 @@
dbaos.flush();
byte[] rawResult = dbaos.getByteArray();
+ int count = dbaos.getUsed();
- return new String( rawResult );
+ String retval = FormatIdUtil.toString( rawResult, count );
+
+ return retval;
} catch (Throwable t)
{
throw StandardException.unexpectedUserException( t );
}
}
-
+
+
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java?rev=648232&r1=648231&r2=648232&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java Tue Apr 15 06:06:10 2008
@@ -49,6 +49,7 @@
import org.apache.derby.iapi.error.StandardException;
import org.apache.derby.iapi.services.io.FormatIdInputStream;
+import org.apache.derby.iapi.services.io.FormatIdUtil;
import org.apache.derby.iapi.services.loader.GeneratedMethod;
import org.apache.derby.iapi.types.RowLocation;
@@ -690,7 +691,7 @@
throws StandardException
{
try {
- byte[] bytes = ice.getBytes();
+ byte[] bytes = FormatIdUtil.fromString( ice );
ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
FormatIdInputStream fiis = new FormatIdInputStream( bais );
TypeDescriptor td = (TypeDescriptor) fiis.readObject();
@@ -785,6 +786,5 @@
vsdv.setWidth( dtd.getPrecision(), dtd.getScale(), false );
}
-
}