Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 0b1289e

Browse files
author
Dave Cramer
committed
proper select for Jason Davies patch to getImportedKeys
fixes for compiling Jason's getImportedKeys, getExportedKeys
1 parent 04550d3 commit 0b1289e

File tree

1 file changed

+150
-113
lines changed

1 file changed

+150
-113
lines changed

src/interfaces/jdbc/org/postgresql/jdbc1/DatabaseMetaData.java

+150-113
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
/**
1414
* This class provides information about the database as a whole.
1515
*
16-
* $Id: DatabaseMetaData.java,v 1.36 2001/10/30 05:05:25 barry Exp $
16+
* $Id: DatabaseMetaData.java,v 1.37 2001/11/02 23:50:08 davec Exp $
1717
*
1818
* <p>Many of the methods here return lists of information in ResultSets. You
1919
* can use the normal ResultSet methods such as getString and getInt to
@@ -2272,86 +2272,72 @@ public java.sql.ResultSet getPrimaryKeys(String catalog, String schema, String t
22722272
);
22732273
}
22742274

2275-
private void importLoop(Vector tuples, java.sql.ResultSet keyRelation) throws SQLException
2276-
{
2277-
String s, s2;
2278-
String origTable = null, primTable = new String(""), schema;
2279-
int i;
2280-
Vector v = new Vector();
2281-
2282-
s = keyRelation.getString(1);
2283-
s2 = s;
2284-
//System.out.println(s);
2285-
2286-
for (i = 0;;i++)
2287-
{
2288-
s = s.substring(s.indexOf("\\000") + 4);
2289-
if (s.compareTo("") == 0)
2290-
{
2291-
//System.out.println();
2292-
break;
2293-
}
2294-
s2 = s.substring(0, s.indexOf("\\000"));
2295-
switch (i)
2296-
{
2297-
case 0:
2298-
origTable = s2;
2299-
break;
2300-
case 1:
2301-
primTable = s2;
2302-
break;
2303-
case 2:
2304-
schema = s2;
2305-
break;
2306-
default:
2307-
v.addElement(s2);
2308-
}
2309-
}
2310-
2311-
java.sql.ResultSet rstmp = connection.ExecSQL("select * from " + origTable + " where 1=0");
2312-
java.sql.ResultSetMetaData origCols = rstmp.getMetaData();
2313-
2314-
String stmp;
2315-
// Vector tuples=new Vector();
2316-
byte tuple[][];
2317-
2318-
// the foreign keys are only on even positions in the Vector.
2319-
for (i = 0;i < v.size();i += 2)
2275+
private void parseConstraint(java.sql.ResultSet keyRelation, Vector tuples) throws SQLException
2276+
{
2277+
byte tuple[][]=new byte[14][0];
2278+
for (int k = 0;k < 14;k++)
2279+
tuple[k] = null;
2280+
String s=keyRelation.getString(1);
2281+
int pos=s.indexOf("\\000");
2282+
if(pos>-1)
2283+
{
2284+
tuple[11]=s.substring(0,pos).getBytes();; // FK_NAME
2285+
int pos2=s.indexOf("\\000", pos+1);
2286+
if(pos2>-1)
23202287
{
2321-
stmp = (String)v.elementAt(i);
2322-
2323-
for (int j = 1;j <= origCols.getColumnCount();j++)
2288+
tuple[2]=s.substring(pos+4, pos2).getBytes();; // PKTABLE_NAME
2289+
pos=s.indexOf("\\000", pos2+1);
2290+
if(pos>-1)
2291+
{
2292+
tuple[6]=s.substring(pos2+4, pos).getBytes();; // FKTABLE_NAME
2293+
pos=s.indexOf("\\000", pos+1); // Ignore MATCH type
2294+
if(pos>-1)
23242295
{
2325-
if (stmp.compareTo(origCols.getColumnName(j)) == 0)
2296+
pos2=s.indexOf("\\000",pos+1);
2297+
if(pos2>-1)
2298+
{
2299+
tuple[3]=s.substring(pos+4, pos2).getBytes();; // PKCOLUMN_NAME
2300+
pos=s.indexOf("\\000", pos2+1);
2301+
if(pos>-1)
23262302
{
2327-
tuple = new byte[14][0];
2328-
2329-
for (int k = 0;k < 14;k++)
2330-
tuple[k] = null;
2331-
2332-
//PKTABLE_NAME
2333-
tuple[2] = primTable.getBytes();
2334-
//PKTABLE_COLUMN
2335-
stmp = (String)v.elementAt(i + 1);
2336-
tuple[3] = stmp.getBytes();
2337-
//FKTABLE_NAME
2338-
tuple[6] = origTable.getBytes();
2339-
//FKCOLUMN_NAME
2340-
tuple[7] = origCols.getColumnName(j).getBytes();
2341-
//KEY_SEQ
2342-
tuple[8] = Integer.toString(j).getBytes();
2343-
2344-
tuples.addElement(tuple);
2345-
2346-
//System.out.println(origCols.getColumnName(j)+
2347-
//": "+j+" -> "+primTable+": "+
2348-
//(String)v.elementAt(i+1));
2349-
break;
2303+
tuple[7]=s.substring(pos2+4, pos).getBytes(); //FKCOLUMN_NAME
23502304
}
2305+
}
23512306
}
2307+
}
23522308
}
2353-
2354-
//return tuples;
2309+
}
2310+
2311+
// UPDATE_RULE
2312+
String rule=keyRelation.getString(2);
2313+
int action=importedKeyNoAction;
2314+
if("cascade".equals(rule)) action=importedKeyCascade;
2315+
else if("setnull".equals(rule)) action=importedKeySetNull;
2316+
else if("setdefault".equals(rule)) action=importedKeySetDefault;
2317+
tuple[9]=Integer.toString(action).getBytes();
2318+
2319+
// DELETE_RULE
2320+
rule=keyRelation.getString(3);
2321+
action=importedKeyNoAction;
2322+
if("cascade".equals(rule)) action=importedKeyCascade;
2323+
else if("setnull".equals(rule)) action=importedKeySetNull;
2324+
else if("setdefault".equals(rule)) action=importedKeySetDefault;
2325+
tuple[10]=Integer.toString(action).getBytes();
2326+
2327+
// DEFERRABILITY
2328+
int deferrability=importedKeyNotDeferrable;
2329+
boolean deferrable=keyRelation.getBoolean(4);
2330+
if(deferrable)
2331+
{
2332+
if(keyRelation.getBoolean(5))
2333+
deferrability=importedKeyInitiallyDeferred;
2334+
else
2335+
deferrability=importedKeyInitiallyImmediate;
2336+
}
2337+
tuple[13]=Integer.toString(deferrability).getBytes();
2338+
for (int i=0; i< 14; i++){
2339+
tuples.addElement(tuple[i]);
2340+
}
23552341
}
23562342

23572343
/**
@@ -2405,43 +2391,54 @@ private void importLoop(Vector tuples, java.sql.ResultSet keyRelation) throws SQ
24052391
* @return ResultSet each row is a primary key column description
24062392
* @see #getExportedKeys
24072393
*/
2408-
public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException
2409-
{
2410-
// Added by Ola Sundell <ola@miranda.org>
2411-
// FIXME: error checking galore!
2412-
java.sql.ResultSet rsret;
2413-
Field f[] = new Field[14];
2414-
byte tuple[][];
2415-
2416-
f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
2417-
f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
2418-
f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32);
2419-
f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32);
2420-
f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32);
2421-
f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32);
2422-
f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32);
2423-
f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32);
2424-
f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2);
2425-
f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2);
2426-
f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2);
2427-
f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32);
2428-
f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
2429-
f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
2430-
2431-
java.sql.ResultSet rs = connection.ExecSQL("select t.tgargs " +
2432-
"from pg_class as c, pg_trigger as t " +
2433-
"where c.relname like '" + table + "' and c.relfilenode=t.tgrelid");
2434-
Vector tuples = new Vector();
2435-
2436-
while (rs.next())
2437-
{
2438-
importLoop(tuples, rs);
2439-
}
2440-
2441-
rsret = new ResultSet(connection, f, tuples, "OK", 1);
2442-
2443-
return rsret;
2444-
}
2394+
public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException
2395+
{
2396+
Field f[]=new Field[14];
2397+
2398+
f[0]=new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
2399+
f[1]=new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
2400+
f[2]=new Field(connection, "PKTABLE_NAME", iVarcharOid, 32);
2401+
f[3]=new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32);
2402+
f[4]=new Field(connection, "FKTABLE_CAT", iVarcharOid, 32);
2403+
f[5]=new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32);
2404+
f[6]=new Field(connection, "FKTABLE_NAME", iVarcharOid, 32);
2405+
f[7]=new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32);
2406+
f[8]=new Field(connection, "KEY_SEQ", iInt2Oid, 2);
2407+
f[9]=new Field(connection, "UPDATE_RULE", iInt2Oid, 2);
2408+
f[10]=new Field(connection, "DELETE_RULE", iInt2Oid, 2);
2409+
f[11]=new Field(connection, "FK_NAME", iVarcharOid, 32);
2410+
f[12]=new Field(connection, "PK_NAME", iVarcharOid, 32);
2411+
f[13]=new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
2412+
2413+
java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs,"
2414+
+ "substring(a.proname from 9 for (char_length(a.proname)-12)),"
2415+
+ "substring(b.proname from 9 for (char_length(b.proname)-12)),"
2416+
+ "a.tgdeferrable,"
2417+
+ "a.tginitdeferred "
2418+
+ "FROM "
2419+
+ "(SELECT t.tgargs, t.tgconstrname, p.proname, t.tgdeferrable,"
2420+
+ "t.tginitdeferred "
2421+
+ "FROM pg_class as c, pg_proc as p, pg_trigger as t "
2422+
+ "WHERE c.relfilenode=t.tgrelid AND t.tgfoid = p.oid "
2423+
+ "AND p.proname LIKE 'RI_FKey_%_upd') as a,"
2424+
+ "(SELECT t.tgconstrname, p.proname "
2425+
+ "FROM pg_class as c, pg_proc as p, pg_trigger as t "
2426+
+ "WHERE c.relfilenode=t.tgrelid AND t.tgfoid = p.oid "
2427+
+ "AND p.proname LIKE 'RI_FKey_%_del') as b,"
2428+
+ "(SELECT t.tgconstrname FROM pg_class as c, pg_trigger as t "
2429+
+ "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid) as c "
2430+
+ "WHERE a.tgconstrname=b.tgconstrname AND a.tgconstrname=c.tgconstrname"
2431+
);
2432+
Vector tuples = new Vector();
2433+
2434+
while (rs.next())
2435+
{
2436+
2437+
parseConstraint(rs,tuples);
2438+
}
2439+
2440+
return new ResultSet(connection, f, tuples, "OK", 1);
2441+
}
24452442

24462443
/**
24472444
* Get a description of a foreign key columns that reference a
@@ -2498,7 +2495,47 @@ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String
24982495
*/
24992496
public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException
25002497
{
2501-
throw org.postgresql.Driver.notImplemented();
2498+
Field f[] = new Field[14];
2499+
2500+
f[0] = new Field(connection, "PKTABLE_CAT", iVarcharOid, 32);
2501+
f[1] = new Field(connection, "PKTABLE_SCHEM", iVarcharOid, 32);
2502+
f[2] = new Field(connection, "PKTABLE_NAME", iVarcharOid, 32);
2503+
f[3] = new Field(connection, "PKCOLUMN_NAME", iVarcharOid, 32);
2504+
f[4] = new Field(connection, "FKTABLE_CAT", iVarcharOid, 32);
2505+
f[5] = new Field(connection, "FKTABLE_SCHEM", iVarcharOid, 32);
2506+
f[6] = new Field(connection, "FKTABLE_NAME", iVarcharOid, 32);
2507+
f[7] = new Field(connection, "FKCOLUMN_NAME", iVarcharOid, 32);
2508+
f[8] = new Field(connection, "KEY_SEQ", iInt2Oid, 2);
2509+
f[9] = new Field(connection, "UPDATE_RULE", iInt2Oid, 2);
2510+
f[10] = new Field(connection, "DELETE_RULE", iInt2Oid, 2);
2511+
f[11] = new Field(connection, "FK_NAME", iVarcharOid, 32);
2512+
f[12] = new Field(connection, "PK_NAME", iVarcharOid, 32);
2513+
f[13] = new Field(connection, "DEFERRABILITY", iInt2Oid, 2);
2514+
2515+
java.sql.ResultSet rs = connection.ExecSQL("SELECT a.tgargs,"
2516+
+ "substring(a.proname from 9 for (char_length(a.proname)-12)),"
2517+
+ "substring(b.proname from 9 for (char_length(b.proname)-12)),"
2518+
+ "a.tgdeferrable,"
2519+
+ "a.tginitdeferred "
2520+
+ "FROM "
2521+
+ "(SELECT t.tgargs, t.tgconstrname, p.proname,"
2522+
+ "t.tgdeferrable, t.tginitdeferred "
2523+
+ "FROM pg_class as c, pg_proc as p, pg_trigger as t "
2524+
+ "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid "
2525+
+ "AND t.tgfoid = p.oid AND p.proname LIKE 'RI_FKey_%_upd') as a, "
2526+
+ "(SELECT t.tgconstrname, p.proname "
2527+
+ "FROM pg_class as c, pg_proc as p, pg_trigger as t "
2528+
+ "WHERE c.relname like '"+table+"' AND c.relfilenode=t.tgrelid "
2529+
+ "AND t.tgfoid = p.oid AND p.proname LIKE 'RI_FKey_%_del') as b "
2530+
+ "WHERE a.tgconstrname=b.tgconstrname");
2531+
Vector tuples = new Vector();
2532+
2533+
while (rs.next())
2534+
{
2535+
parseConstraint(rs,tuples);
2536+
}
2537+
2538+
return new ResultSet(connection, f, tuples, "OK", 1);
25022539
}
25032540

25042541
/**

0 commit comments

Comments
 (0)