use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.
the class JdbiFactoryBean method createInstance.
@Override
protected Jdbi createInstance() throws Exception {
final Jdbi jdbi = Jdbi.create(new SpringConnectionFactory(dataSource));
if (autoInstallPlugins) {
jdbi.installPlugins();
}
plugins.forEach(jdbi::installPlugin);
globalDefines.forEach(jdbi::define);
return jdbi;
}
use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.
the class TestHashPrefixSqlParser method render.
private String render(String sql, Map<String, Object> attributes) {
StatementContext ctx = StatementContextAccess.createContext();
attributes.forEach(ctx::define);
return templateEngine.render(sql, ctx);
}
use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.
the class SqlStatement method bindMethodsList.
/**
* For each value given, create a tuple by invoking each given method in order, and bind the tuple into
* a {@code VALUES (...)} format insert clause.
* @param key attribute name
* @param values list of values that will be comma-spliced into the defined attribute value
* @param methodNames list of methods that will be invoked on the values
* @return this
* @throws IllegalArgumentException if the list of values or properties is empty.
* @throws UnableToCreateStatementException if the method cannot be found
*/
public final This bindMethodsList(String key, Iterable<?> values, List<String> methodNames) {
final Iterator<?> valueIter = values.iterator();
if (!valueIter.hasNext()) {
throw new IllegalArgumentException(getClass().getSimpleName() + ".bindMethodsList was called with no values.");
}
if (methodNames.isEmpty()) {
throw new IllegalArgumentException(getClass().getSimpleName() + ".bindMethodsList was called with no values.");
}
final StringBuilder names = new StringBuilder();
final StatementContext ctx = getContext();
for (int valueIndex = 0; valueIter.hasNext(); valueIndex++) {
if (valueIndex > 0) {
names.append(',');
}
final Object bean = valueIter.next();
final ObjectMethodArguments beanMethods = new ObjectMethodArguments(null, bean);
names.append('(');
for (int methodIndex = 0; methodIndex < methodNames.size(); methodIndex++) {
if (methodIndex > 0) {
names.append(',');
}
final String methodName = methodNames.get(methodIndex);
final String name = key + valueIndex + '.' + methodName;
names.append(':').append(name);
final Argument argument = beanMethods.find(methodName, ctx).orElseThrow(() -> new UnableToCreateStatementException("Unable to get " + methodName + " argument for " + bean, ctx));
bind(name, argument);
}
names.append(')');
}
return define(key, names.toString());
}
use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.
the class DefinedAttributeTemplateEngine method parse.
@Override
public Optional<Function<StatementContext, String>> parse(String template, ConfigRegistry config) {
StringBuilder buf = new StringBuilder();
List<BiConsumer<StatementContext, StringBuilder>> preparation = new ArrayList<>();
Runnable pushBuf = () -> {
// NOPMD
if (buf.length() > 0) {
String bit = buf.toString();
buf.setLength(0);
preparation.add((ctx, b) -> b.append(bit));
}
};
DefineStatementLexer lexer = new DefineStatementLexer(CharStreams.fromString(template));
lexer.addErrorListener(new ErrorListener());
Token t = lexer.nextToken();
while (t.getType() != EOF) {
switch(t.getType()) {
case COMMENT:
case LITERAL:
case QUOTED_TEXT:
case DOUBLE_QUOTED_TEXT:
buf.append(t.getText());
break;
case DEFINE:
pushBuf.run();
String text = t.getText();
String key = text.substring(1, text.length() - 1);
preparation.add((ctx, b) -> {
Object value = ctx.getAttribute(key);
if (value == null) {
throw new UnableToCreateStatementException("Undefined attribute for token '" + text + "'", ctx);
}
b.append(value);
});
break;
case ESCAPED_TEXT:
buf.append(t.getText().substring(1));
break;
default:
break;
}
t = lexer.nextToken();
}
pushBuf.run();
return Optional.of(ctx -> {
try {
StringBuilder result = new StringBuilder();
preparation.forEach(a -> a.accept(ctx, result));
return result.toString();
} catch (RuntimeException e) {
throw new UnableToCreateStatementException("Error rendering SQL template: '" + template + "'", e, ctx);
}
});
}
use of org.jdbi.v3.core.internal.lexer.DefineStatementLexer.DEFINE in project jdbi by jdbi.
the class TestStatementContext method testFoo.
@Test
public void testFoo() {
Handle h = h2Extension.openHandle();
final int inserted = h.createUpdate("insert into <table> (id, name) values (:id, :name)").bind("id", 7).bind("name", "Martin").define("table", "something").execute();
assertThat(inserted).isEqualTo(1);
}
Aggregations