Hi,
Here is a diff for DatabaseMetaData.getImportedKeys() and
DatabaseMetaData.getExportedKeys(). Please check that it works :)
Thanks,
Jason Davies
[EMAIL PROTECTED]
Index: jdbc1/DatabaseMetaData.java
===================================================================
RCS file:
/projects/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java,v
retrieving revision 1.35
diff -c -r1.35 DatabaseMetaData.java
*** jdbc1/DatabaseMetaData.java 2001/10/25 05:59:59 1.35
--- jdbc1/DatabaseMetaData.java 2001/10/26 01:21:02
***************
*** 2260,2345 ****
);
}
! private void importLoop(Vector tuples, java.sql.ResultSet keyRelation) throws
SQLException
! {
! String s, s2;
! String origTable = null, primTable = new String(""), schema;
! int i;
! Vector v = new Vector();
!
! s = keyRelation.getString(1);
! s2 = s;
! //System.out.println(s);
!
! for (i = 0;;i++)
! {
! s = s.substring(s.indexOf("\\000") + 4);
! if (s.compareTo("") == 0)
! {
! //System.out.println();
! break;
! }
! s2 = s.substring(0, s.indexOf("\\000"));
! switch (i)
! {
! case 0:
! origTable = s2;
! break;
! case 1:
! primTable = s2;
! break;
! case 2:
! schema = s2;
! break;
! default:
! v.addElement(s2);
! }
! }
!
! java.sql.ResultSet rstmp = connection.ExecSQL("select * from " +
origTable + " where 1=0");
! java.sql.ResultSetMetaData origCols = rstmp.getMetaData();
!
! String stmp;
! // Vector tuples=new Vector();
! byte tuple[][];
!
! // the foreign keys are only on even positions in the Vector.
! for (i = 0;i < v.size();i += 2)
{
! stmp = (String)v.elementAt(i);
!
! for (int j = 1;j <= origCols.getColumnCount();j++)
{
! if (stmp.compareTo(origCols.getColumnName(j)) == 0)
{
! tuple = new byte[14][0];
!
! for (int k = 0;k < 14;k++)
! tuple[k] = null;
!
! //PKTABLE_NAME
! tuple[2] = primTable.getBytes();
! //PKTABLE_COLUMN
! stmp = (String)v.elementAt(i + 1);
! tuple[3] = stmp.getBytes();
! //FKTABLE_NAME
! tuple[6] = origTable.getBytes();
! //FKCOLUMN_NAME
! tuple[7] =
origCols.getColumnName(j).getBytes();
! //KEY_SEQ
! tuple[8] = Integer.toString(j).getBytes();
!
! tuples.addElement(tuple);
!
! //System.out.println(origCols.getColumnName(j)+
! //": "+j+" -> "+primTable+": "+
! //(String)v.elementAt(i+1));
! break;
}
}
}
! //return tuples;
}
/**
--- 2260,2330 ----
);
}
! private byte[][] parseConstraint(java.sql.ResultSet keyRelation) throws
SQLException
! {
! byte tuple[][]=new byte[14][0];
! for (int k = 0;k < 14;k++)
! tuple[k] = null;
! String s=keyRelation.getString(1);
! int pos=s.indexOf("\\000");
! if(pos>-1)
! {
! tuple[11]=s.substring(0,pos).getBytes();; // FK_NAME
! int pos2=s.indexOf("\\000", pos+1);
! if(pos2>-1)
{
! tuple[2]=s.substring(pos+4, pos2).getBytes();; // PKTABLE_NAME
! pos=s.indexOf("\\000", pos2+1);
! if(pos>-1)
! {
! tuple[6]=s.substring(pos2+4, pos).getBytes();; // FKTABLE_NAME
! pos=s.indexOf("\\000", pos+1); // Ignore MATCH type
! if(pos>-1)
{
! pos2=s.indexOf("\\000",pos+1);
! if(pos2>-1)
! {
! tuple[3]=s.substring(pos+4, pos2).getBytes();; //
PKCOLUMN_NAME
! pos=s.indexOf("\\000", pos2+1);
! if(pos>-1)
{
! tuple[7]=s.substring(pos2+4, pos).getBytes();
//FKCOLUMN_NAME
}
+ }
}
+ }
}
+ }
+
+ // UPDATE_RULE
+ String rule=keyRelation.getString(2);
+ int action=importedKeyNoAction;
+ if("cascade".equals(rule)) action=importedKeyCascade;
+ else if("setnull".equals(rule)) action=importedKeySetNull;
+ else if("setdefault".equals(rule)) action=importedKeySetDefault;
+ tuple[9]=Integer.toString(action).getBytes();
+
+ // DELETE_RULE
+ rule=keyRelation.getString(3);
+ action=importedKeyNoAction;
+ if("cascade".equals(rule)) action=importedKeyCascade;
+ else if("setnull".equals(rule)) action=importedKeySetNull;
+ else if("setdefault".equals(rule)) action=importedKeySetDefault;
+ tuple[10]=Integer.toString(action).getBytes();
+
+ // DEFERRABILITY
+ int deferrability=importedKeyNotDeferrable;
+ boolean deferrable=keyRelation.getBoolean(4);
+ if(deferrable)
+ {
+ if(keyRelation.getBoolean(5))
+ deferrability=importedKeyInitiallyDeferred;
+ else
+ deferrability=importedKeyInitiallyImmediate;
+ }
+ tuple[13]=Integer.toString(deferrability).getBytes();
! return tuple;
}
/**
***************
*** 2395,2405 ****
*/
public java.sql.ResultSet getImportedKeys(String catalog, String schema,
String table) throws SQLException
{
- // Added by Ola Sundell <[EMAIL PROTECTED]>
- // FIXME: error checking galore!
- java.sql.ResultSet rsret;
Field f[] = new Field[14];
- byte tuple[][];
f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
--- 2380,2386 ----
***************
*** 2416,2434 ****
f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
! java.sql.ResultSet rs = connection.ExecSQL("select t.tgargs " +
! "from pg_class as c,
pg_trigger as t " +
! "where c.relname like
'" + table + "' and c.relfilenode=t.tgrelid");
Vector tuples = new Vector();
while (rs.next())
{
! importLoop(tuples, rs);
}
! rsret = new ResultSet(connection, f, tuples, "OK", 1);
!
! return rsret;
}
/**
--- 2397,2429 ----
f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
! java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs,"
! + "substring(a.proname from
9 for (char_length(a.proname)-12)),"
! + "substring(b.proname from
9 for (char_length(b.proname)-12)),"
! + "a.tgdeferrable,"
! + "a.tginitdeferred "
! + "FROM "
! + "(SELECT t.tgargs,
t.tgconstrname, p.proname, t.tgdeferrable,"
! + "t.tginitdeferred "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE
c.relfilenode=t.tgrelid AND t.tgfoid = p.oid "
! + "AND p.proname LIKE
'RI_FKey_%_upd') as a,"
! + "(SELECT t.tgconstrname,
p.proname "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE
c.relfilenode=t.tgrelid AND t.tgfoid = p.oid "
! + "AND p.proname LIKE
'RI_FKey_%_del') as b,"
! + "(SELECT t.tgconstrname
FROM pg_class as c, pg_trigger as t "
! + "WHERE c.relname like
'"+table+"' AND c.relfilenode=t.tgrelid) as c "
! + "WHERE
a.tgconstrname=b.tgconstrname AND a.tgconstrname=c.tgconstrname"
! );
Vector tuples = new Vector();
while (rs.next())
{
! tuples.add(parseConstraint(rs));
}
! return new ResultSet(connection, f, tuples, "OK", 1);
}
/**
***************
*** 2486,2492 ****
*/
public java.sql.ResultSet getExportedKeys(String catalog, String schema,
String table) throws SQLException
{
! throw org.postgresql.Driver.notImplemented();
}
/**
--- 2481,2527 ----
*/
public java.sql.ResultSet getExportedKeys(String catalog, String schema,
String table) throws SQLException
{
! Field f[] = new Field[14];
!
! f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
! f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
! f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32);
! f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32);
! f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32);
! f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32);
! f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32);
! f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32);
! f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2);
! f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2);
! f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2);
! f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32);
! f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
! f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
!
! java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs,"
! + "substring(a.proname from
9 for (char_length(a.proname)-12)),"
! + "substring(b.proname from
9 for (char_length(b.proname)-12)),"
! + "a.tgdeferrable,"
! + "a.tginitdeferred "
! + "FROM "
! + "(SELECT t.tgargs,
t.tgconstrname, p.proname,"
! + "t.tgdeferrable,
t.tginitdeferred "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE c.relname like
'"+table+"' AND c.relfilenode=t.tgrelid "
! + "AND t.tgfoid = p.oid AND
p.proname LIKE 'RI_FKey_%_upd') as a, "
! + "(SELECT t.tgconstrname,
p.proname "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE c.relname like
'"+table+"' AND c.relfilenode=t.tgrelid "
! + "AND t.tgfoid = p.oid AND
p.proname LIKE 'RI_FKey_%_del') as b "
! + "WHERE
a.tgconstrname=b.tgconstrname");
! Vector tuples = new Vector();
!
! while (rs.next())
! {
! tuples.add(parseConstraint(rs));
! }
!
! return new ResultSet(connection, f, tuples, "OK", 1);
}
/**
Index: jdbc2/DatabaseMetaData.java
===================================================================
RCS file:
/projects/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java,v
retrieving revision 1.40
diff -c -r1.40 DatabaseMetaData.java
*** jdbc2/DatabaseMetaData.java 2001/10/25 05:59:59 1.40
--- jdbc2/DatabaseMetaData.java 2001/10/26 01:21:10
***************
*** 2273,2359 ****
);
}
! private Vector importLoop(java.sql.ResultSet keyRelation) throws SQLException
! {
! String s, s2;
! String origTable = null, primTable = new String(""), schema;
! int i;
! Vector v;
!
! s = keyRelation.getString(1);
! s2 = s;
! // System.out.println(s);
! v = new Vector();
! for (i = 0;;i++)
! {
! s = s.substring(s.indexOf("\\000") + 4);
! if (s.compareTo("") == 0)
! {
! //System.out.println();
! break;
! }
! s2 = s.substring(0, s.indexOf("\\000"));
! switch (i)
! {
! case 0:
! origTable = s2;
! break;
! case 1:
! primTable = s2;
! break;
! case 2:
! schema = s2;
! break;
! default:
! v.add(s2);
! }
! }
!
! java.sql.ResultSet rstmp = connection.ExecSQL("select * from " +
origTable + " where 1=0");
! java.sql.ResultSetMetaData origCols = rstmp.getMetaData();
!
! String stmp;
! Vector tuples = new Vector();
! byte tuple[][];
!
! // the foreign keys are only on even positions in the Vector.
! for (i = 0;i < v.size();i += 2)
{
! stmp = (String)v.elementAt(i);
!
! for (int j = 1;j <= origCols.getColumnCount();j++)
{
! if (stmp.compareTo(origCols.getColumnName(j)) == 0)
{
! tuple = new byte[14][0];
!
! for (int k = 0;k < 14;k++)
! tuple[k] = null;
!
! //PKTABLE_NAME
! tuple[2] = primTable.getBytes();
! //PKTABLE_COLUMN
! stmp = (String)v.elementAt(i + 1);
! tuple[3] = stmp.getBytes();
! //FKTABLE_NAME
! tuple[6] = origTable.getBytes();
! //FKCOLUMN_NAME
! tuple[7] =
origCols.getColumnName(j).getBytes();
! //KEY_SEQ
! tuple[8] = Integer.toString(j).getBytes();
!
! tuples.add(tuple);
! /*
!
System.out.println(origCols.getColumnName(j)+
! ": "+j+" -> "+primTable+": "+
! (String)v.elementAt(i+1));
! */
! break;
}
}
}
! return tuples;
}
/**
--- 2273,2343 ----
);
}
! private byte[][] parseConstraint(java.sql.ResultSet keyRelation) throws
SQLException
! {
! byte tuple[][]=new byte[14][0];
! for (int k = 0;k < 14;k++)
! tuple[k] = null;
! String s=keyRelation.getString(1);
! int pos=s.indexOf("\\000");
! if(pos>-1)
! {
! tuple[11]=s.substring(0,pos).getBytes();; // FK_NAME
! int pos2=s.indexOf("\\000", pos+1);
! if(pos2>-1)
{
! tuple[2]=s.substring(pos+4, pos2).getBytes();; // PKTABLE_NAME
! pos=s.indexOf("\\000", pos2+1);
! if(pos>-1)
! {
! tuple[6]=s.substring(pos2+4, pos).getBytes();; // FKTABLE_NAME
! pos=s.indexOf("\\000", pos+1); // Ignore MATCH type
! if(pos>-1)
{
! pos2=s.indexOf("\\000",pos+1);
! if(pos2>-1)
! {
! tuple[3]=s.substring(pos+4, pos2).getBytes();; //
PKCOLUMN_NAME
! pos=s.indexOf("\\000", pos2+1);
! if(pos>-1)
{
! tuple[7]=s.substring(pos2+4, pos).getBytes();
//FKCOLUMN_NAME
}
+ }
}
+ }
}
+ }
+
+ // UPDATE_RULE
+ String rule=keyRelation.getString(2);
+ int action=importedKeyNoAction;
+ if("cascade".equals(rule)) action=importedKeyCascade;
+ else if("setnull".equals(rule)) action=importedKeySetNull;
+ else if("setdefault".equals(rule)) action=importedKeySetDefault;
+ tuple[9]=Integer.toString(action).getBytes();
+
+ // DELETE_RULE
+ rule=keyRelation.getString(3);
+ action=importedKeyNoAction;
+ if("cascade".equals(rule)) action=importedKeyCascade;
+ else if("setnull".equals(rule)) action=importedKeySetNull;
+ else if("setdefault".equals(rule)) action=importedKeySetDefault;
+ tuple[10]=Integer.toString(action).getBytes();
+
+ // DEFERRABILITY
+ int deferrability=importedKeyNotDeferrable;
+ boolean deferrable=keyRelation.getBoolean(4);
+ if(deferrable)
+ {
+ if(keyRelation.getBoolean(5))
+ deferrability=importedKeyInitiallyDeferred;
+ else
+ deferrability=importedKeyInitiallyImmediate;
+ }
+ tuple[13]=Integer.toString(deferrability).getBytes();
! return tuple;
}
/**
***************
*** 2409,2419 ****
*/
public java.sql.ResultSet getImportedKeys(String catalog, String schema,
String table) throws SQLException
{
- // Added by Ola Sundell <[EMAIL PROTECTED]>
- // FIXME: error checking galore!
- java.sql.ResultSet rsret;
Field f[] = new Field[14];
- byte tuple[][];
f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
--- 2393,2399 ----
***************
*** 2430,2448 ****
f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
! java.sql.ResultSet rs = connection.ExecSQL("select t.tgargs " +
! "from pg_class as c,
pg_trigger as t " +
! "where c.relname like
'" + table + "' and c.relfilenode=t.tgrelid");
Vector tuples = new Vector();
while (rs.next())
{
! tuples.addAll(importLoop(rs));
}
! rsret = new ResultSet(connection, f, tuples, "OK", 1);
!
! return rsret;
}
/**
--- 2410,2442 ----
f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
! java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs,"
! + "substring(a.proname from
9 for (char_length(a.proname)-12)),"
! + "substring(b.proname from
9 for (char_length(b.proname)-12)),"
! + "a.tgdeferrable,"
! + "a.tginitdeferred "
! + "FROM "
! + "(SELECT t.tgargs,
t.tgconstrname, p.proname, t.tgdeferrable,"
! + "t.tginitdeferred "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE
c.relfilenode=t.tgrelid AND t.tgfoid = p.oid "
! + "AND p.proname LIKE
'RI_FKey_%_upd') as a,"
! + "(SELECT t.tgconstrname,
p.proname "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE
c.relfilenode=t.tgrelid AND t.tgfoid = p.oid "
! + "AND p.proname LIKE
'RI_FKey_%_del') as b,"
! + "(SELECT t.tgconstrname
FROM pg_class as c, pg_trigger as t "
! + "WHERE c.relname like
'"+table+"' AND c.relfilenode=t.tgrelid) as c "
! + "WHERE
a.tgconstrname=b.tgconstrname AND a.tgconstrname=c.tgconstrname"
! );
Vector tuples = new Vector();
while (rs.next())
{
! tuples.add(parseConstraint(rs));
}
! return new ResultSet(connection, f, tuples, "OK", 1);
}
/**
***************
*** 2500,2506 ****
*/
public java.sql.ResultSet getExportedKeys(String catalog, String schema,
String table) throws SQLException
{
! throw org.postgresql.Driver.notImplemented();
}
/**
--- 2494,2540 ----
*/
public java.sql.ResultSet getExportedKeys(String catalog, String schema,
String table) throws SQLException
{
! Field f[] = new Field[14];
!
! f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
! f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
! f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32);
! f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32);
! f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32);
! f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32);
! f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32);
! f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32);
! f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2);
! f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2);
! f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2);
! f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32);
! f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
! f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
!
! java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs,"
! + "substring(a.proname from
9 for (char_length(a.proname)-12)),"
! + "substring(b.proname from
9 for (char_length(b.proname)-12)),"
! + "a.tgdeferrable,"
! + "a.tginitdeferred "
! + "FROM "
! + "(SELECT t.tgargs,
t.tgconstrname, p.proname,"
! + "t.tgdeferrable,
t.tginitdeferred "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE c.relname like
'"+table+"' AND c.relfilenode=t.tgrelid "
! + "AND t.tgfoid = p.oid AND
p.proname LIKE 'RI_FKey_%_upd') as a, "
! + "(SELECT t.tgconstrname,
p.proname "
! + "FROM pg_class as c,
pg_proc as p, pg_trigger as t "
! + "WHERE c.relname like
'"+table+"' AND c.relfilenode=t.tgrelid "
! + "AND t.tgfoid = p.oid AND
p.proname LIKE 'RI_FKey_%_del') as b "
! + "WHERE
a.tgconstrname=b.tgconstrname");
! Vector tuples = new Vector();
!
! while (rs.next())
! {
! tuples.add(parseConstraint(rs));
! }
!
! return new ResultSet(connection, f, tuples, "OK", 1);
}
/**
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])