PATCH to org/postgresql/jdbc2/DatabaseMetaData.java - Mailing list pgsql-jdbc
From | Ola Sundell |
---|---|
Subject | PATCH to org/postgresql/jdbc2/DatabaseMetaData.java |
Date | |
Msg-id | Pine.LNX.4.21.0102251656530.4590-100000@miranda.org Whole thread Raw |
Responses |
Re: PATCH to org/postgresql/jdbc2/DatabaseMetaData.java
Re: PATCH to org/postgresql/jdbc2/DatabaseMetaData.java Re: PATCH to org/postgresql/jdbc2/DatabaseMetaData.java Re: PATCH to org/postgresql/jdbc2/DatabaseMetaData.java |
List | pgsql-jdbc |
--- postgresql-7.1beta4/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java Mon Jan 29 03:53:56 2001 +++ postgresql-7.1beta4-new/src/interfaces/jdbc/org/postgresql/jdbc2/DatabaseMetaData.java Sat Feb 17 10:22:38 2001 @@ -1048,7 +1048,7 @@ /** * Can statements remain open across commits? They may, but * this driver cannot guarentee that. In further reflection. - * we are talking a Statement object jere, so the answer is + * we are talking a Statement object here, so the answer is * yes, since the Statement is only a vehicle to ExecSQL() * * @return true if they always remain open; false otherwise @@ -2185,6 +2185,81 @@ ); } + 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; + } + /** * Get a description of the primary key columns that are * referenced by a table's foreign key columns (the primary keys @@ -2238,8 +2313,39 @@ */ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { - // XXX-Not Implemented - return null; + // Added by Ola Sundell <ola@miranda.org> + // 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); + 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 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; } /**
pgsql-jdbc by date: