diff options
| author | Barry Lind <barry@xythos.com> | 2002-10-20 02:55:50 +0000 | 
|---|---|---|
| committer | Barry Lind <barry@xythos.com> | 2002-10-20 02:55:50 +0000 | 
| commit | 06b297938d9c16eff26a29d2fed5a867a6122b15 (patch) | |
| tree | 6ef3e7583543b5e14123db008ea0b43c83b40b3f /src/interfaces/jdbc/org/postgresql | |
| parent | e9f07b14e11932a1cfb39e4196a90025d639f864 (diff) | |
Applied patch from Teofilis Martisius to improve performance.
Also removed some unused files and fixed the which needed a small change
after the previous patch to build.xml.
 Modified Files:
 	jdbc/Makefile jdbc/org/postgresql/core/Encoding.java
 	jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java
 Removed Files:
 	jdbc/utils/CheckVersion.java jdbc/utils/buildDriver
 	jdbc/utils/changelog.pl
Diffstat (limited to 'src/interfaces/jdbc/org/postgresql')
| -rw-r--r-- | src/interfaces/jdbc/org/postgresql/core/Encoding.java | 45 | ||||
| -rw-r--r-- | src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java | 10 | 
2 files changed, 52 insertions, 3 deletions
| diff --git a/src/interfaces/jdbc/org/postgresql/core/Encoding.java b/src/interfaces/jdbc/org/postgresql/core/Encoding.java index 95d4af5781f..ea395b844bc 100644 --- a/src/interfaces/jdbc/org/postgresql/core/Encoding.java +++ b/src/interfaces/jdbc/org/postgresql/core/Encoding.java @@ -8,7 +8,7 @@ import org.postgresql.util.*;  /*   * Converts to and from the character encoding used by the backend.   * - * $Id: Encoding.java,v 1.6 2002/09/06 21:23:05 momjian Exp $ + * $Id: Encoding.java,v 1.7 2002/10/20 02:55:50 barry Exp $   */  public class Encoding @@ -161,6 +161,9 @@ public class Encoding  			}  			else  			{ +				if (encoding.equals("UTF-8")) { +					return decodeUTF8(encodedString, offset, length); +				}  				return new String(encodedString, offset, length, encoding);  			}  		} @@ -223,4 +226,44 @@ public class Encoding  			return false;  		}  	} + +	/** +	 * custom byte[] -> String conversion routine, 3x-10x faster than +	 * standard new String(byte[]) +	 */ +	private static final int pow2_6 = 64;		// 26 +	private static final int pow2_12 = 4096;	// 212 +	private static char[] cdata = new char[50]; + +	private synchronized String decodeUTF8(byte data[], int offset, int length) { +		char[] l_cdata = cdata; +		if (l_cdata.length < (length-offset)) { +			l_cdata = new char[length-offset]; +		} +		int i = offset; +		int j = 0; +		int z, y, x, val; +		while (i < length) { +			z = data[i] & 0xFF; +			if (z < 0x80) { +				l_cdata[j++] = (char)data[i]; +				i++; +			} else if (z >= 0xE0) {		// length == 3 +				y = data[i+1] & 0xFF; +				x = data[i+2] & 0xFF; +				val = (z-0xE0)*pow2_12 + (y-0x80)*pow2_6 + (x-0x80); +				l_cdata[j++] = (char) val; +				i+= 3; +			} else {		// length == 2 (maybe add checking for length > 3, throw exception if it is +				y = data[i+1] & 0xFF; +				val = (z - 0xC0)* (pow2_6)+(y-0x80); +				l_cdata[j++] = (char) val; +				i+=2; +			}  +		} +	 +		String s = new String(l_cdata, 0, j); +		return s; +	} +  } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java index dbf785709b1..f161c6616cd 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java @@ -14,7 +14,7 @@ import org.postgresql.largeobject.LargeObjectManager;  import org.postgresql.util.*; -/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Connection.java,v 1.11 2002/10/17 05:33:52 barry Exp $ +/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Connection.java,v 1.12 2002/10/20 02:55:50 barry Exp $   * This class defines methods of the jdbc1 specification.  This class is   * extended by org.postgresql.jdbc2.AbstractJdbc2Connection which adds the jdbc2   * methods.  The real Connection class (for jdbc1) is org.postgresql.jdbc1.Jdbc1Connection @@ -367,10 +367,16 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec  		//jdbc by default assumes autocommit is on until setAutoCommit(false)  		//is called.  Therefore we need to ensure a new connection is   		//initialized to autocommit on. +		//We also set the client encoding so that the driver only needs  +		//to deal with utf8.  We can only do this in 7.3 because multibyte  +		//support is now always included  		if (haveMinimumServerVersion("7.3"))   		{  			java.sql.ResultSet acRset = -				ExecSQL("show autocommit"); +				ExecSQL("set client_encoding = 'UNICODE'; show autocommit"); + +			//set encoding to be unicode +			encoding = Encoding.getEncoding("UNICODE", null);  			if (!acRset.next())  			{ | 
