package org.jdbi.v3.core.statement;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Objects;
import org.jdbi.v3.core.argument.Argument;
import org.jdbi.v3.core.config.JdbiCache;
import org.jdbi.v3.core.config.JdbiCaches;
class DescribedArgument implements Argument {
private static final JdbiCache<Class<?>, Boolean> ARG_CLASS_HAS_TOSTRING =
JdbiCaches.declare(type -> {
try {
return type.getMethod("toString")
.getDeclaringClass() != Object.class;
} catch (ReflectiveOperationException ignored) {}
return false;
});
private final Argument arg;
private final String description;
DescribedArgument(Argument arg, Object value) {
this.arg = arg;
this.description = Objects.toString(ArgumentBinder.unwrap(value));
}
@Override
public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
arg.apply(position, statement, ctx);
}
@Override
public String toString() {
return description;
}
public static Argument wrap(StatementContext ctx, Argument arg, Object value) {
if (Boolean.TRUE.equals(ARG_CLASS_HAS_TOSTRING.get(arg.getClass(), ctx))) {
return arg;
}
return new DescribedArgument(arg, value);
}
}