diff --git a/gradle.properties b/gradle.properties index f0bf582..dce6d2d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group = org.xbib name = database -version = 1.3.0 +version = 1.4.0 org.gradle.warning.mode = ALL diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java index 728fc90..9cb1b27 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java @@ -215,9 +215,18 @@ public interface Database extends Supplier { Table getSingleRow(String statement, Map params); - Table getUnlimitedRows(String statement, Map params); + Table getTable(String statement, + Map params, + int limit, + int fetchSize, + int timeoutSeconds); - Table getLimitedRows(String statement, Map params, int limit, int fetchSize, int timeoutSeconds); + void consumeRows(String statement, + Map params, + int limit, + int fetchSize, + int timeoutSeconds, + Consumer> consumer); void insert(String statement, Map params); 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 767edd3..7b947c8 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 @@ -15,7 +15,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.function.Consumer; import java.util.logging.Level; @@ -298,7 +297,7 @@ public class DatabaseImpl implements Database { if (table.getOffset() != null && table.getSize() != null) { statement = statement + " offset :offset rows fetch next :limit rows only"; } - return getUnlimitedRows(statement, params); + return getTable(statement, params, 0, options().fetchSize(), options().timeoutSeconds()); } @Override @@ -322,17 +321,12 @@ public class DatabaseImpl implements Database { @Override public Table getSingleRow(String statement, Map params) { - return getLimitedRows(statement, params, 1, options().fetchSize(), options().timeoutSeconds()); + return getTable(statement, params, 1, options().fetchSize(), options().timeoutSeconds()); } @Override - public Table getUnlimitedRows(String statement, Map params) { - return getLimitedRows(statement, params, 0, options().fetchSize(), options().timeoutSeconds()); - } - - @Override - public Table getLimitedRows(String statement, Map params, - int limit, int fetchSize, int timeoutSeconds) { + public Table getTable(String statement, Map params, + int limit, int fetchSize, int timeoutSeconds) { SqlSelect sql = toSelect(statement).fetchSize(fetchSize).withTimeoutSeconds(timeoutSeconds); selectParams(sql, params); Table table = new Table(); @@ -356,6 +350,32 @@ public class DatabaseImpl implements Database { return table; } + public void consumeRows(String statement, + Map params, + int limit, + int fetchSize, + int timeoutSeconds, + Consumer> consumer) { + SqlSelect sql = toSelect(statement).fetchSize(fetchSize).withTimeoutSeconds(timeoutSeconds); + selectParams(sql, params); + sql.query(rows -> { + ResultSetMetaData md = rows.getMetadata(); + List columnLabels = new ArrayList<>(); + List classNames = new ArrayList<>(); + for (int i = 1; i <= md.getColumnCount(); i++) { + columnLabels.add(md.getColumnLabel(i)); + classNames.add(md.getColumnClassName(i)); + } + consumer.accept(columnLabels); + consumer.accept(classNames); + int i = 0; + while (rows.next() && (limit <= 0 || i++ < limit)) { + consumer.accept(getRow(rows, classNames)); + } + return true; + }); + } + @Override public void insert(String statement, Map params) { SqlInsert sql = toInsert(statement); @@ -494,34 +514,15 @@ public class DatabaseImpl implements Database { for (int i = 0; i < classNames.size(); i++) { String className = classNames.get(i).toString(); switch (className) { - case "java.lang.String": - row.add(rows.getStringOrEmpty(i + 1)); - break; - case "java.lang.Integer": - row.add(rows.getIntegerOrNull(i + 1)); - break; - case "java.lang.Long": - row.add(rows.getLongOrNull(i + 1)); - break; - case "java.lang.Boolean": - row.add(rows.getBooleanOrFalse(i + 1)); - break; - case "java.sql.Clob": - case "oracle.jdbc.OracleClob": - row.add(rows.getClobStringOrEmpty(i + 1)); - break; - case "java.sql.Date": - row.add(rows.getLocalDateOrNull(i + 1)); - break; - case "java.sql.Timestamp": - case "oracle.sql.TIMESTAMP": - row.add(rows.getLocalDateTimeOrNull(i + 1)); - break; - case "java.math.BigDecimal": - row.add(rows.getBigDecimalOrNull(i + 1)); - break; - default: - throw new DatabaseException("unexpected column class name: " + className); + case "java.lang.String" -> row.add(rows.getStringOrEmpty(i + 1)); + case "java.lang.Integer" -> row.add(rows.getIntegerOrNull(i + 1)); + case "java.lang.Long" -> row.add(rows.getLongOrNull(i + 1)); + case "java.lang.Boolean" -> row.add(rows.getBooleanOrFalse(i + 1)); + case "java.sql.Clob", "oracle.jdbc.OracleClob" -> row.add(rows.getClobStringOrEmpty(i + 1)); + case "java.sql.Date" -> row.add(rows.getLocalDateOrNull(i + 1)); + case "java.sql.Timestamp", "oracle.sql.TIMESTAMP" -> row.add(rows.getLocalDateTimeOrNull(i + 1)); + case "java.math.BigDecimal" -> row.add(rows.getBigDecimalOrNull(i + 1)); + default -> throw new DatabaseException("unexpected column class name: " + className); } } return row;