|
|
|
@ -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<String, Object> 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<String, Object> params) {
|
|
|
|
|
return getLimitedRows(statement, params, 0, options().fetchSize(), options().timeoutSeconds());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Table getLimitedRows(String statement, Map<String, Object> params,
|
|
|
|
|
int limit, int fetchSize, int timeoutSeconds) {
|
|
|
|
|
public Table getTable(String statement, Map<String, Object> 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<String, Object> params,
|
|
|
|
|
int limit,
|
|
|
|
|
int fetchSize,
|
|
|
|
|
int timeoutSeconds,
|
|
|
|
|
Consumer<List<Object>> consumer) {
|
|
|
|
|
SqlSelect sql = toSelect(statement).fetchSize(fetchSize).withTimeoutSeconds(timeoutSeconds);
|
|
|
|
|
selectParams(sql, params);
|
|
|
|
|
sql.query(rows -> {
|
|
|
|
|
ResultSetMetaData md = rows.getMetadata();
|
|
|
|
|
List<Object> columnLabels = new ArrayList<>();
|
|
|
|
|
List<Object> 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<String, Object> 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;
|
|
|
|
|