public ColumnPairElement getColumnPair(DBIdentifier name) { ColumnPairElement cpe = (ColumnPairElement) columnPairs.find(name); if (cpe == null) try { String fullName = name.getFullName(); if (fullName == null) { return null; } int pos = fullName.indexOf(";"); String firstHalf = fullName.substring(0, pos); String secondHalf = fullName.substring(pos + 1); ColumnElement lce = getColumn(DBIdentifier.create(firstHalf)); pos = secondHalf.lastIndexOf("."); TableElement te = ((TableElement) element) .getDeclaringSchema() .getTable(DBIdentifier.create(secondHalf.substring(0, pos))); if (te == null) return null; ColumnElement fce = te.getColumn(DBIdentifier.create(secondHalf)); if (lce == null || fce == null) return null; ColumnPairElementImpl cpei = new ColumnPairElementImpl( lce.getName().getFullName() + ";" + fce.getName().getFullName()); // NOI18N cpe = new ColumnPairElement(cpei, lce, fce, (TableElement) element); changeColumnPairs(new ColumnPairElement[] {cpe}, DBElement.Impl.ADD); } catch (DBException exc) { exc.printStackTrace(); return null; } return cpe; }
/** * @param expectRelatedTables specifies whether all related tables are expected to be provided. */ private void initFKs(ConnectionProvider cp, String shortTableName, boolean expectRelatedTables) throws SQLException, DBException { ResultSet rs; rs = cp.getDatabaseMetaData() .getImportedKeys(cp.getConnection().getCatalog(), cp.getSchema(), shortTableName); String name, fkColName, pkTableName, pkColName, c1, c2, s1, s2; if (rs != null) { HashMap rset = new HashMap(); while (rs.next()) { // test references between two schemas c1 = rs.getString("PKTABLE_CAT"); // NOI18N s1 = rs.getString("PKTABLE_SCHEM"); // NOI18N c2 = rs.getString("FKTABLE_CAT"); // NOI18N s2 = rs.getString("FKTABLE_SCHEM"); // NOI18N name = rs.getString("FK_NAME"); // NOI18N fkColName = rs.getString("FKCOLUMN_NAME").trim(); // NOI18N pkTableName = rs.getString("PKTABLE_NAME").trim(); // NOI18N pkColName = rs.getString("PKCOLUMN_NAME").trim(); // NOI18N if (comp(c1, c2)) { if (!comp(s1, s2)) continue; } else continue; ColumnPairElement cpe; if (name == null || name.trim().equals("")) name = "GENERATED_FK_" + pkTableName; else name = name.trim(); ColumnElement lce = getColumn(DBIdentifier.create(fkColName)); // NOI18N if (lce == null) // should be null only in same cases when FK is computed for view continue; SchemaElement se = ((TableElement) element).getDeclaringSchema(); TableElement fte = se.getTable(DBIdentifier.create(pkTableName)); // table could not be found since all related tables were not necessarily provided if (fte == null && !expectRelatedTables) { continue; } ColumnElement fce = fte.getColumn(DBIdentifier.create(pkColName)); ColumnPairElementImpl cpei = new ColumnPairElementImpl( lce.getName().getFullName() + ";" + fce.getName().getFullName()); // NOI18N cpe = new ColumnPairElement(cpei, lce, fce, (TableElement) element); changeColumnPairs(new ColumnPairElement[] {cpe}, DBElement.Impl.ADD); ForeignKeyElement fk = (ForeignKeyElement) keys.find(DBIdentifier.create(name)); if (fk != null) fk.addColumnPair(cpe); // add pair else { ForeignKeyElementImpl fkei = new ForeignKeyElementImpl(this, name); ForeignKeyElement fke = new ForeignKeyElement(fkei, (TableElement) element); fke.addColumnPair(cpe); changeKeys(new ForeignKeyElement[] {fke}, DBElement.Impl.ADD); } } rs.close(); } }
/** * Find a key by name. * * @param name the name for which to look * @return the key, or <code>null</code> if it does not exist */ public KeyElement getKey(DBIdentifier name) { return (KeyElement) keys.find(name); }
protected void initIndexes(ConnectionProvider cp, String tbl) { if (cp != null) try { boolean unique; DatabaseMetaData dmd = cp.getDatabaseMetaData(); String shortTableName; if (tbl == null) shortTableName = getName().getName(); else shortTableName = tbl; ResultSet rs; // rs = dmd.getIndexInfo(cp.getConnection().getCatalog(), // dmd.getUserName().trim(), shortTableName, false, true); rs = dmd.getIndexInfo( cp.getConnection().getCatalog(), cp.getSchema(), shortTableName, false, true); String name, columnName; boolean unq; LinkedList idxs = new LinkedList(); if (rs != null) { HashMap rset = new HashMap(); String uniqueStr; while (rs.next()) { name = rs.getString("INDEX_NAME"); // NOI18N columnName = rs.getString("COLUMN_NAME"); // NOI18N if (columnName != null) columnName = columnName.trim(); unq = rs.getBoolean("NON_UNIQUE"); // NOI18N // hack for PostgreSQL bug 3480: the driver returns quotes around quoted column names if (columnName != null && columnName.length() >= 2 && columnName.startsWith("\"") && columnName.endsWith("\"")) { // NOI18N columnName = columnName.substring(1, columnName.length() - 1); } if (name == null) continue; else name = name.trim(); if (unq) idxs.add(name + "." + columnName + ".false"); // NOI18N else idxs.add(name + "." + columnName + ".true"); // NOI18N } rs.close(); } String info; int start, end; for (int i = 0; i < idxs.size(); i++) { info = idxs.get(i).toString(); start = info.indexOf('.'); // NOI18N end = info.lastIndexOf('.'); // NOI18N name = info.substring(0, start); if ((info.substring(end + 1)).equals("true")) // NOI18N unique = true; else unique = false; if (indexes.find(DBIdentifier.create(name)) != null) continue; IndexElementImpl iei = new IndexElementImpl(this, name, unique); IndexElement[] ie = {new IndexElement(iei, (TableElement) element)}; iei.initColumns(idxs); changeIndexes(ie, DBElement.Impl.ADD); } } catch (Exception exc) { if (Boolean.getBoolean("netbeans.debug.exceptions")) // NOI18N exc.printStackTrace(); } }
/** * Find an index by name. * * @param name the name for which to look * @return the index, or <code>null</code> if it does not exist */ public IndexElement getIndex(DBIdentifier name) { return (IndexElement) indexes.find(name); }
/** * Find a column by name. * * @param name the name for which to look * @return the column, or <code>null</code> if it does not exist */ public ColumnElement getColumn(DBIdentifier name) { return (ColumnElement) columns.find(name); }