]> granicus.if.org Git - postgresql/commitdiff
Merge changes from head to 7.3 branch: better error message on character set conversi...
authorBarry Lind <barry@xythos.com>
Sun, 9 Feb 2003 23:41:46 +0000 (23:41 +0000)
committerBarry Lind <barry@xythos.com>
Sun, 9 Feb 2003 23:41:46 +0000 (23:41 +0000)
 Modified Files:
  Tag: REL7_3_STABLE
  jdbc/org/postgresql/errors.properties
  jdbc/org/postgresql/core/Encoding.java
  jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java

src/interfaces/jdbc/org/postgresql/core/Encoding.java
src/interfaces/jdbc/org/postgresql/errors.properties
src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java

index bd7bc52b9e4c0edcb47d6c2d915149112d8eb97c..42b8c88634cd20af7e5992bbd7535692bd255318 100644 (file)
@@ -8,7 +8,7 @@ import org.postgresql.util.*;
 /*
  * Converts to and from the character encoding used by the backend.
  *
- * $Id: Encoding.java,v 1.7.2.1 2002/11/14 05:54:39 barry Exp $
+ * $Id: Encoding.java,v 1.7.2.2 2003/02/09 23:41:46 barry Exp $
  */
 
 public class Encoding
@@ -235,36 +235,40 @@ public class Encoding
        private static final int pow2_12 = 4096;        // 212
        private char[] cdata = new char[50];
 
-       private synchronized String decodeUTF8(byte data[], int offset, int length) {
-               char[] l_cdata = cdata;
-               if (l_cdata.length < (length)) {
-                       l_cdata = new char[length];
-               }
-               int i = offset;
-               int j = 0;
-               int k = length + offset;
-               int z, y, x, val;
-               while (i < k) {
-                       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;
-                       } 
-               }
+       private synchronized String decodeUTF8(byte data[], int offset, int length) throws SQLException {
+               try {
+                       char[] l_cdata = cdata;
+                       if (l_cdata.length < (length)) {
+                               l_cdata = new char[length];
+                       }
+                       int i = offset;
+                       int j = 0;
+                       int k = length + offset;
+                       int z, y, x, val;
+                       while (i < k) {
+                               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;
+                       String s = new String(l_cdata, 0, j);
+                       return s;
+               } catch (Exception l_e) {
+                       throw new PSQLException("postgresql.con.invalidchar", l_e);
+               }
        }
 
 }
index ff872664f449caa682685fa2755e34f48d796e1c..ca649b06c26aa70a2864c96b099be54224bb401a 100644 (file)
@@ -5,6 +5,7 @@ postgresql.con.auth:The authentication type {0} is not supported. Check that you
 postgresql.con.authfail:An error occured while getting the authentication request.
 postgresql.con.backend:Backend start-up failed: {0}
 postgresql.con.call:Callable Statements are not supported at this time.
+postgresql.con.invalidchar:Invalid character data was found.  This is most likely caused by stored data containing characters that are invalid for the character set the database was created in.  The most common example of this is storing 8bit data in a SQL_ASCII database.
 postgresql.con.closed:Connection is closed.  Operation is not permitted.
 postgresql.con.creobj:Failed to create object for {0} {1}
 postgresql.con.failed:The connection attempt failed because {0}
index 1027d3f28a204af725371fabc1419adff0283a6e..794b9ae9908048420ab68293896d903d740acb9f 100644 (file)
@@ -2337,7 +2337,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                        }
                        else if (pgType.equals("numeric") || pgType.equals("decimal")) 
                        {
-                               int attypmod = rs.getInt(8) - VARHDRSZ;
+                               int attypmod = rs.getInt("atttypmod") - VARHDRSZ;
                                tuple[6] = Integer.toString( ( attypmod >> 16 ) & 0xffff ).getBytes();
                                tuple[8] = Integer.toString(attypmod & 0xffff).getBytes();
                                tuple[9] = "10".getBytes();