diff options
author | James Ahlborn <jtahlborn@yahoo.com> | 2015-02-23 04:08:54 +0000 |
---|---|---|
committer | James Ahlborn <jtahlborn@yahoo.com> | 2015-02-23 04:08:54 +0000 |
commit | 4ffcf30a2a07d0ff79e68e40210f850110694eee (patch) | |
tree | 7719742a859c21ad8332fca7e2d6778855924912 /src | |
parent | 54713bcd6c5f1def3e926a93caf1afba5a91f1f9 (diff) | |
download | jackcess-4ffcf30a2a07d0ff79e68e40210f850110694eee.tar.gz jackcess-4ffcf30a2a07d0ff79e68e40210f850110694eee.zip |
fix linked table test; add unit tests for new table iteration methods
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@917 f203690c-595d-4dc9-a70b-905162fa7fd2
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java | 43 | ||||
-rw-r--r-- | src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java | 44 |
2 files changed, 78 insertions, 9 deletions
diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java b/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java index 969f93d..414b43b 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java @@ -601,20 +601,31 @@ public class DatabaseImpl implements Database } 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; @@ -1873,7 +1884,7 @@ public class DatabaseImpl implements Database throw new NoSuchElementException(); } try { - return getTable(_tableNameIter.next()); + return getTable(_tableNameIter.next(), true); } catch(IOException e) { throw new RuntimeIOException(e); } @@ -1944,6 +1955,22 @@ public class DatabaseImpl implements Database } } + 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; diff --git a/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java b/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java index 254901a..e2751cb 100644 --- a/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java +++ b/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java @@ -1442,14 +1442,56 @@ public class DatabaseTest extends TestCase 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"); |