OSDN Git Service

metadata encoding patch from Kris Jurka
authorDave Cramer <davec@fastcrypt.com>
Fri, 12 Dec 2003 00:21:36 +0000 (00:21 +0000)
committerDave Cramer <davec@fastcrypt.com>
Fri, 12 Dec 2003 00:21:36 +0000 (00:21 +0000)
src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java

index f7f8241..90c1d00 100644 (file)
@@ -5,6 +5,7 @@ import java.sql.*;
 import java.util.*;
 import org.postgresql.core.BaseStatement;
 import org.postgresql.core.Field;
+import org.postgresql.core.Encoding;
 import org.postgresql.util.PSQLException;
 import org.postgresql.util.PSQLState;
 import org.postgresql.Driver;
@@ -22,6 +23,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                                                                   "vacuum,verbose,version";
 
        protected AbstractJdbc1Connection connection; // The connection association
+       protected Encoding encoding;
 
        // These define various OID's. Hopefully they will stay constant.
        protected static final int iVarcharOid = 1043;  // OID for varchar
@@ -73,6 +75,13 @@ public abstract class AbstractJdbc1DatabaseMetaData
        public AbstractJdbc1DatabaseMetaData(AbstractJdbc1Connection conn)
        {
                this.connection = conn;
+               try {
+                       this.encoding = conn.getEncoding();
+               }
+               catch (SQLException sqle) {
+                       this.encoding = Encoding.defaultEncoding();
+               }
+
        }
 
        /*
@@ -1858,15 +1867,15 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                tuple[0] = null;
                                tuple[1] = schema;
                                tuple[2] = procedureName;
-                               tuple[3] = "returnValue".getBytes();
-                               tuple[4] = Integer.toString(java.sql.DatabaseMetaData.procedureColumnReturn).getBytes();
-                               tuple[5] = Integer.toString(connection.getSQLType(returnType)).getBytes();
-                               tuple[6] = connection.getPGType(returnType).getBytes();
+                               tuple[3] = encoding.encode("returnValue");
+                               tuple[4] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.procedureColumnReturn));
+                               tuple[5] = encoding.encode(Integer.toString(connection.getSQLType(returnType)));
+                               tuple[6] = encoding.encode(connection.getPGType(returnType));
                                tuple[7] = null;
                                tuple[8] = null;
                                tuple[9] = null;
                                tuple[10] = null;
-                               tuple[11] = Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown).getBytes();
+                               tuple[11] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown));
                                tuple[12] = null;
                                v.addElement(tuple);
                        }
@@ -1878,15 +1887,15 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                tuple[0] = null;
                                tuple[1] = schema;
                                tuple[2] = procedureName;
-                               tuple[3] = ("$"+(i+1)).getBytes();
-                               tuple[4] = Integer.toString(java.sql.DatabaseMetaData.procedureColumnIn).getBytes();
-                               tuple[5] = Integer.toString(connection.getSQLType(argOid)).getBytes();
-                               tuple[6] = connection.getPGType(argOid).getBytes();
+                               tuple[3] = encoding.encode("$"+(i+1));
+                               tuple[4] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.procedureColumnIn));
+                               tuple[5] = encoding.encode(Integer.toString(connection.getSQLType(argOid)));
+                               tuple[6] = encoding.encode(connection.getPGType(argOid));
                                tuple[7] = null;
                                tuple[8] = null;
                                tuple[9] = null;
                                tuple[10] = null;
-                               tuple[11] = Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown).getBytes();
+                               tuple[11] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown));
                                tuple[12] = null;
                                v.addElement(tuple);
                        }
@@ -1901,15 +1910,15 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                        tuple[0] = null;
                                        tuple[1] = schema;
                                        tuple[2] = procedureName;
-                                       tuple[3] = columnrs.getString("attname").getBytes();
-                                       tuple[4] = Integer.toString(java.sql.DatabaseMetaData.procedureColumnResult).getBytes();
-                                       tuple[5] = Integer.toString(connection.getSQLType(columnTypeOid)).getBytes();
-                                       tuple[6] = connection.getPGType(columnTypeOid).getBytes();
+                                       tuple[3] = columnrs.getBytes("attname");
+                                       tuple[4] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.procedureColumnResult));
+                                       tuple[5] = encoding.encode(Integer.toString(connection.getSQLType(columnTypeOid)));
+                                       tuple[6] = encoding.encode(connection.getPGType(columnTypeOid));
                                        tuple[7] = null;
                                        tuple[8] = null;
                                        tuple[9] = null;
                                        tuple[10] = null;
-                                       tuple[11] = Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown).getBytes();
+                                       tuple[11] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown));
                                        tuple[12] = null;
                                        v.addElement(tuple);
                                }
@@ -2205,7 +2214,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                for (i=0; i < types.length; i++)
                {
                        byte[][] tuple = new byte[1][];
-                       tuple[0] = types[i].getBytes();
+                       tuple[0] = encoding.encode(types[i]);
                        v.addElement(tuple);
                }
 
@@ -2338,46 +2347,46 @@ public abstract class AbstractJdbc1DatabaseMetaData
                        tuple[1] = rs.getBytes("nspname");      // Schema
                        tuple[2] = rs.getBytes("relname");      // Table name
                        tuple[3] = rs.getBytes("attname");      // Column name
-                       tuple[4] = Integer.toString(connection.getSQLType(typeOid)).getBytes();
+                       tuple[4] = encoding.encode(Integer.toString(connection.getSQLType(typeOid)));
                        String pgType = connection.getPGType(typeOid);
-                       tuple[5] = pgType.getBytes();           // Type name
+                       tuple[5] = encoding.encode(pgType);     // Type name
 
                        // by default no decimal_digits
                        // if the type is numeric or decimal we will
                        // overwrite later.
-                       tuple[8] = "0".getBytes();
+                       tuple[8] = encoding.encode("0");
 
                        if (pgType.equals("bpchar") || pgType.equals("varchar"))
                        {
                                int atttypmod = rs.getInt("atttypmod");
-                               tuple[6] = Integer.toString(atttypmod != -1 ? atttypmod - VARHDRSZ : 0).getBytes();
+                               tuple[6] = encoding.encode(Integer.toString(atttypmod != -1 ? atttypmod - VARHDRSZ : 0));
                        }
                        else if (pgType.equals("numeric") || pgType.equals("decimal")) 
                        {
                                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();
+                               tuple[6] = encoding.encode(Integer.toString( ( attypmod >> 16 ) & 0xffff ));
+                               tuple[8] = encoding.encode(Integer.toString(attypmod & 0xffff));
+                               tuple[9] = encoding.encode("10");
                        }
                        else if (pgType.equals("bit") || pgType.equals("varbit")) {
                                tuple[6] = rs.getBytes("atttypmod");
-                               tuple[9] = "2".getBytes();
+                               tuple[9] = encoding.encode("2");
                        }
                        else {
                                tuple[6] = rs.getBytes("attlen");
-                               tuple[9] = "10".getBytes();
+                               tuple[9] = encoding.encode("10");
                        }
 
                        tuple[7] = null;                                                // Buffer length
 
-                       tuple[10] = Integer.toString(rs.getBoolean("attnotnull") ? java.sql.DatabaseMetaData.columnNoNulls : java.sql.DatabaseMetaData.columnNullable).getBytes();      // Nullable
+                       tuple[10] = encoding.encode(Integer.toString(rs.getBoolean("attnotnull") ? java.sql.DatabaseMetaData.columnNoNulls : java.sql.DatabaseMetaData.columnNullable));        // Nullable
                        tuple[11] = rs.getBytes("description");                         // Description (if any)
                        tuple[12] = rs.getBytes("adsrc");                               // Column default
                        tuple[13] = null;                                               // sql data type (unused)
                        tuple[14] = null;                                               // sql datetime sub (unused)
                        tuple[15] = tuple[6];                                   // char octet length
                        tuple[16] = rs.getBytes("attnum");              // ordinal position
-                       tuple[17] = (rs.getBoolean("attnotnull") ? "NO" : "YES").getBytes();    // Is nullable
+                       tuple[17] = encoding.encode(rs.getBoolean("attnotnull") ? "NO" : "YES");        // Is nullable
 
                        v.addElement(tuple);
                }
@@ -2476,7 +2485,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                        }
                        sortStringArray(permNames);
                        for (i=0; i<permNames.length; i++) {
-                               byte[] privilege = permNames[i].getBytes();
+                               byte[] privilege = encoding.encode(permNames[i]);
                                Vector grantees = (Vector)permissions.get(permNames[i]);
                                for (int j=0; j<grantees.size(); j++) {
                                        String grantee = (String)grantees.elementAt(j);
@@ -2486,10 +2495,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                        tuple[1] = schemaName;
                                        tuple[2] = tableName;
                                        tuple[3] = column;
-                                       tuple[4] = owner.getBytes();
-                                       tuple[5] = grantee.getBytes();
+                                       tuple[4] = encoding.encode(owner);
+                                       tuple[5] = encoding.encode(grantee);
                                        tuple[6] = privilege;
-                                       tuple[7] = grantable.getBytes();
+                                       tuple[7] = encoding.encode(grantable);
                                        v.addElement(tuple);
                                }
                        }
@@ -2579,7 +2588,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                        }
                        sortStringArray(permNames);
                        for (i=0; i<permNames.length; i++) {
-                               byte[] privilege = permNames[i].getBytes();
+                               byte[] privilege = encoding.encode(permNames[i]);
                                Vector grantees = (Vector)permissions.get(permNames[i]);
                                for (int j=0; j<grantees.size(); j++) {
                                        String grantee = (String)grantees.elementAt(j);
@@ -2588,10 +2597,10 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                        tuple[0] = null;
                                        tuple[1] = schema;
                                        tuple[2] = table;
-                                       tuple[3] = owner.getBytes();
-                                       tuple[4] = grantee.getBytes();
+                                       tuple[3] = encoding.encode(owner);
+                                       tuple[4] = encoding.encode(grantee);
                                        tuple[5] = privilege;
-                                       tuple[6] = grantable.getBytes();
+                                       tuple[6] = encoding.encode(grantable);
                                        v.addElement(tuple);
                                }
                        }
@@ -2785,14 +2794,14 @@ public abstract class AbstractJdbc1DatabaseMetaData
                while (rs.next()) {
                        byte tuple[][] = new byte[8][];
                        int columnTypeOid = rs.getInt("atttypid");
-                       tuple[0] = Integer.toString(scope).getBytes();
+                       tuple[0] = encoding.encode(Integer.toString(scope));
                        tuple[1] = rs.getBytes("attname");
-                       tuple[2] = Integer.toString(connection.getSQLType(columnTypeOid)).getBytes();
-                       tuple[3] = connection.getPGType(columnTypeOid).getBytes();
+                       tuple[2] = encoding.encode(Integer.toString(connection.getSQLType(columnTypeOid)));
+                       tuple[3] = encoding.encode(connection.getPGType(columnTypeOid));
                        tuple[4] = null;
                        tuple[5] = null;
                        tuple[6] = null;
-                       tuple[7] = Integer.toString(java.sql.DatabaseMetaData.bestRowNotPseudo).getBytes();
+                       tuple[7] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.bestRowNotPseudo));
                        v.addElement(tuple);
                }
 
@@ -2854,13 +2863,13 @@ public abstract class AbstractJdbc1DatabaseMetaData
                 */
 
                tuple[0] = null;
-               tuple[1] = "ctid".getBytes();
-               tuple[2] = Integer.toString(connection.getSQLType("tid")).getBytes();
-               tuple[3] = "tid".getBytes();
+               tuple[1] = encoding.encode("ctid");
+               tuple[2] = encoding.encode(Integer.toString(connection.getSQLType("tid")));
+               tuple[3] = encoding.encode("tid");
                tuple[4] = null;
                tuple[5] = null;
                tuple[6] = null;
-               tuple[7] = Integer.toString(java.sql.DatabaseMetaData.versionColumnPseudo).getBytes();
+               tuple[7] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.versionColumnPseudo));
                v.addElement(tuple);
 
                /* Perhaps we should check that the given
@@ -3157,7 +3166,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                else if ("restrict".equals(rule))
                                        action = java.sql.DatabaseMetaData.importedKeyRestrict;
 
-                               tuple[9] = Integer.toString(action).getBytes();
+                               tuple[9] = encoding.encode(Integer.toString(action));
 
                        }
 
@@ -3177,7 +3186,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                        action = java.sql.DatabaseMetaData.importedKeySetDefault;
                                else if ("restrict".equals(rule))
                                        action = java.sql.DatabaseMetaData.importedKeyRestrict;
-                               tuple[10] = Integer.toString(action).getBytes();
+                               tuple[10] = encoding.encode(Integer.toString(action));
                        }
 
 
@@ -3217,11 +3226,11 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                pkeyColumn = (String)tokens.elementAt(element);
                        }
 
-                       tuple[3] = pkeyColumn.getBytes(); //PKCOLUMN_NAME
-                       tuple[7] = fkeyColumn.getBytes(); //FKCOLUMN_NAME
+                       tuple[3] = encoding.encode(pkeyColumn); //PKCOLUMN_NAME
+                       tuple[7] = encoding.encode(fkeyColumn); //FKCOLUMN_NAME
 
                        tuple[8] = rs.getBytes(6); //KEY_SEQ
-                       tuple[11] = fkName.getBytes(); //FK_NAME this will give us a unique name for the foreign key
+                       tuple[11] = encoding.encode(fkName); //FK_NAME this will give us a unique name for the foreign key
                        tuple[12] = rs.getBytes(7); //PK_NAME
 
                        // DEFERRABILITY
@@ -3235,7 +3244,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                                else
                                        deferrability = java.sql.DatabaseMetaData.importedKeyInitiallyImmediate;
                        }
-                       tuple[13] = Integer.toString(deferrability).getBytes();
+                       tuple[13] = encoding.encode(Integer.toString(deferrability));
 
                        tuples.addElement(tuple);
                }
@@ -3498,18 +3507,18 @@ public abstract class AbstractJdbc1DatabaseMetaData
                ResultSet rs = connection.createStatement().executeQuery(sql);
                // cache some results, this will keep memory useage down, and speed
                // things up a little.
-               byte b9[] = "9".getBytes();
-               byte b10[] = "10".getBytes();
-               byte bf[] = "f".getBytes();
-               byte bnn[] = Integer.toString(java.sql.DatabaseMetaData.typeNoNulls).getBytes();
-               byte bts[] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes();
+               byte b9[] = encoding.encode("9");
+               byte b10[] = encoding.encode("10");
+               byte bf[] = encoding.encode("f");
+               byte bnn[] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.typeNoNulls));
+               byte bts[] = encoding.encode(Integer.toString(java.sql.DatabaseMetaData.typeSearchable));
 
                while (rs.next())
                {
                        byte[][] tuple = new byte[18][];
                        String typname = rs.getString(1);
-                       tuple[0] = typname.getBytes();
-                       tuple[1] = Integer.toString(connection.getSQLType(typname)).getBytes();
+                       tuple[0] = encoding.encode(typname);
+                       tuple[1] = encoding.encode(Integer.toString(connection.getSQLType(typname)));
                        tuple[2] = b9;  // for now
                        tuple[6] = bnn; // for now
                        tuple[7] = bf; // false for now - not case sensitive