metadata encoding patch from Kris Jurka

This commit is contained in:
Dave Cramer 2003-12-12 00:21:36 +00:00
parent 42610b1b8a
commit f9d3ed65c4

View 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