From 0dd813823759bdda5095ee869a6df51709beb4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Mon, 29 Apr 2024 15:17:22 +0200 Subject: [PATCH] test table creation in lowercase on Oracle --- .../org/xbib/jdbc/oracle/test/OracleTest.java | 15 +++ .../org/xbib/jdbc/query/DatabaseImpl.java | 91 +++++++++---------- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/jdbc-oracle/src/test/java/org/xbib/jdbc/oracle/test/OracleTest.java b/jdbc-oracle/src/test/java/org/xbib/jdbc/oracle/test/OracleTest.java index cca2a9a..b085cdd 100644 --- a/jdbc-oracle/src/test/java/org/xbib/jdbc/oracle/test/OracleTest.java +++ b/jdbc-oracle/src/test/java/org/xbib/jdbc/oracle/test/OracleTest.java @@ -14,6 +14,9 @@ import org.xbib.jdbc.query.OptionsOverride; import org.xbib.jdbc.query.Schema; import org.xbib.jdbc.test.CommonTest; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * Exercise Database functionality with a real Oracle database. */ @@ -78,4 +81,16 @@ public class OracleTest extends CommonTest { return null; }); } + + @Test + public void testTableExists() { + db.dropTableQuietly("dbtest"); + new Schema().addTable("dbtest").addColumn("pk").primaryKey().schema().execute(db); + assertTrue(db.tableExists("dbtest")); + db.dropTableQuietly("dbtest"); + assertFalse(db.tableExists("dbtest")); + db.ddl("create table \"dbtest\" (pk varchar(1))").execute(); + assertTrue(db.tableExists("dbtest")); + db.dropTableQuietly("dbtest"); + } } diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java index 7b0f4ba..56cde2b 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java @@ -200,12 +200,22 @@ public class DatabaseImpl implements Database { public boolean tableExists(String tableName, String schemaName) throws DatabaseException { if (tableName != null && connection != null) { try { + // schema based check DatabaseMetaData metadata = connection.getMetaData(); String normalizedTable = flavor().normalizeTableName(tableName); - ResultSet resultSet = metadata.getTables(connection.getCatalog(), schemaName, normalizedTable, new String[]{"TABLE", "VIEW"}); - while (resultSet.next()) { - if (normalizedTable.equals(resultSet.getString("TABLE_NAME"))) { - return true; + try (ResultSet resultSet = metadata.getTables(connection.getCatalog(), schemaName, normalizedTable, new String[]{"TABLE", "VIEW"})) { + while (resultSet.next()) { + if (normalizedTable.equals(resultSet.getString("TABLE_NAME"))) { + return true; + } + } + } + // otherwise, do a simple check + try (ResultSet resultSet = metadata.getTables(null, null, tableName, null) ) { + while (resultSet.next()) { + if (tableName.equals(resultSet.getString("TABLE_NAME"))) { + return true; + } } } } catch (SQLException exc) { @@ -455,20 +465,15 @@ public class DatabaseImpl implements Database { return; } params.forEach((k, v) -> { - if (v instanceof String) { - sql.argString(k, (String) v); - } else if (v instanceof Integer) { - sql.argInteger(k, (Integer) v); - } else if (v instanceof Long) { - sql.argLong(k, (Long) v); - } else if (v instanceof Boolean) { - sql.argBoolean(k, (Boolean) v); - } else if (v instanceof LocalDate) { - sql.argLocalDate(k, (LocalDate) v); - } else if (v instanceof LocalDateTime) { - sql.argLocalDateTime(k, (LocalDateTime) v); - } else { - throw new DatabaseException("unknown type for param: " + (v != null ? v.getClass() : "null")); + switch (v) { + case String s -> sql.argString(k, s); + case Integer i -> sql.argInteger(k, i); + case Long l -> sql.argLong(k, l); + case Boolean b -> sql.argBoolean(k, b); + case LocalDate localDate -> sql.argLocalDate(k, localDate); + case LocalDateTime localDateTime -> sql.argLocalDateTime(k, localDateTime); + case null, default -> + throw new DatabaseException("unknown type for param: " + (v != null ? v.getClass() : "null")); } }); } @@ -478,22 +483,15 @@ public class DatabaseImpl implements Database { return; } params.forEach((k, v) -> { - if (v instanceof String) { - sql.argString(k, (String) v); - } else if (v instanceof Integer) { - sql.argInteger(k, (Integer) v); - } else if (v instanceof Long) { - sql.argLong(k, (Long) v); - } else if (v instanceof Boolean) { - sql.argBoolean(k, (Boolean) v); - } else if (v instanceof LocalDate) { - sql.argLocalDate(k, (LocalDate) v); - } else if (v instanceof LocalDateTime) { - sql.argLocalDateTime(k, (LocalDateTime) v); - } else if (v == null) { - sql.argNull(k); - } else { - throw new DatabaseException("unknown type for param: " + v.getClass()); + switch (v) { + case String s -> sql.argString(k, s); + case Integer i -> sql.argInteger(k, i); + case Long l -> sql.argLong(k, l); + case Boolean b -> sql.argBoolean(k, b); + case LocalDate localDate -> sql.argLocalDate(k, localDate); + case LocalDateTime localDateTime -> sql.argLocalDateTime(k, localDateTime); + case null -> sql.argNull(k); + default -> throw new DatabaseException("unknown type for param: " + v.getClass()); } }); } @@ -503,22 +501,15 @@ public class DatabaseImpl implements Database { return; } params.forEach((k, v) -> { - if (v instanceof String) { - sql.argString(k, (String) v); - } else if (v instanceof Integer) { - sql.argInteger(k, (Integer) v); - } else if (v instanceof Long) { - sql.argLong(k, (Long) v); - } else if (v instanceof Boolean) { - sql.argBoolean(k, (Boolean) v); - } else if (v instanceof LocalDate) { - sql.argLocalDate(k, (LocalDate) v); - } else if (v instanceof LocalDateTime) { - sql.argLocalDateTime(k, (LocalDateTime) v); - } else if (v == null) { - sql.argNull(k); - } else { - throw new DatabaseException("unknown type for param: " + v.getClass()); + switch (v) { + case String s -> sql.argString(k, s); + case Integer i -> sql.argInteger(k, i); + case Long l -> sql.argLong(k, l); + case Boolean b -> sql.argBoolean(k, b); + case LocalDate localDate -> sql.argLocalDate(k, localDate); + case LocalDateTime localDateTime -> sql.argLocalDateTime(k, localDateTime); + case null -> sql.argNull(k); + default -> throw new DatabaseException("unknown type for param: " + v.getClass()); } }); }