}
public boolean isLinkedTable(Table table) throws IOException {
-
+
if((table == null) || (this == table.getDatabase())) {
// if the table is null or this db owns the table, not linked
return false;
}
+ // common case, local table name == remote table name
TableInfo tableInfo = lookupTable(table.getName());
-
- return((tableInfo != null) &&
- tableInfo.isLinked() &&
- (_linkedDbs != null) &&
- (_linkedDbs.get(((LinkedTableInfo)tableInfo).linkedDbName) ==
- table.getDatabase()));
+ if((tableInfo != null) && tableInfo.isLinked() &&
+ matchesLinkedTable(table, ((LinkedTableInfo)tableInfo).linkedTableName,
+ ((LinkedTableInfo)tableInfo).linkedDbName)) {
+ return true;
+ }
+
+ // but, the local table name may not match the remote table name, so we
+ // need to do a search if the common case fails
+ return _tableFinder.isLinkedTable(table);
}
+
+ boolean matchesLinkedTable(Table table, String linkedTableName,
+ String linkedDbName) {
+ return (table.getName().equalsIgnoreCase(linkedTableName) &&
+ (_linkedDbs != null) &&
+ (_linkedDbs.get(linkedDbName) == table.getDatabase()));
+ }
public TimeZone getTimeZone() {
return _timeZone;
throw new NoSuchElementException();
}
try {
- return getTable(_tableNameIter.next());
+ return getTable(_tableNameIter.next(), true);
} catch(IOException e) {
throw new RuntimeIOException(e);
}
}
}
+ public boolean isLinkedTable(Table table) throws IOException
+ {
+ for(Row row : getTableNamesCursor().newIterable().setColumnNames(
+ SYSTEM_CATALOG_COLUMNS)) {
+ Short type = row.getShort(CAT_COL_TYPE);
+ String linkedDbName = row.getString(CAT_COL_DATABASE);
+ String linkedTableName = row.getString(CAT_COL_FOREIGN_NAME);
+
+ if(TYPE_LINKED_TABLE.equals(type) &&
+ matchesLinkedTable(table, linkedTableName, linkedDbName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
protected abstract Cursor findRow(Integer parentId, String name)
throws IOException;
assertTable(expectedRows, t3);
+ Table t1 = db.getTable("Table1");
+
assertFalse(db.isLinkedTable(null));
- assertFalse(db.isLinkedTable(t2));
+ assertTrue(db.isLinkedTable(t2));
assertTrue(db.isLinkedTable(t3));
+ assertFalse(db.isLinkedTable(t1));
+
+ List<Table> tables = getTables(db.newIterable());
+ assertEquals(3, tables.size());
+ assertTrue(tables.contains(t1));
+ assertTrue(tables.contains(t2));
+ assertTrue(tables.contains(t3));
+ assertFalse(tables.contains(((DatabaseImpl)db).getSystemCatalog()));
+
+ tables = getTables(db.newIterable().setIncludeNormalTables(false));
+ assertEquals(2, tables.size());
+ assertFalse(tables.contains(t1));
+ assertTrue(tables.contains(t2));
+ assertTrue(tables.contains(t3));
+ assertFalse(tables.contains(((DatabaseImpl)db).getSystemCatalog()));
+
+ tables = getTables(db.newIterable().setIncludeLinkedTables(false));
+ assertEquals(1, tables.size());
+ assertTrue(tables.contains(t1));
+ assertFalse(tables.contains(t2));
+ assertFalse(tables.contains(t3));
+ assertFalse(tables.contains(((DatabaseImpl)db).getSystemCatalog()));
+
+ tables = getTables(db.newIterable().setIncludeLinkedTables(false)
+ .setIncludeNormalTables(false)
+ .setIncludeSystemTables(true));
+ assertTrue(tables.size() > 5);
+ assertFalse(tables.contains(t1));
+ assertFalse(tables.contains(t2));
+ assertFalse(tables.contains(t3));
+ assertTrue(tables.contains(((DatabaseImpl)db).getSystemCatalog()));
db.close();
}
}
+ private static List<Table> getTables(Iterable<Table> tableIter)
+ {
+ List<Table> tableList = new ArrayList<Table>();
+ for(Table t : tableIter) {
+ tableList.add(t);
+ }
+ return tableList;
+ }
+
public void testTimeZone() throws Exception
{
TimeZone tz = TimeZone.getTimeZone("America/New_York");