package pl.touk.chat.bot.janusz.store;
import org.jooq.DSLContext;
import org.jooq.Field;
import org.jooq.Record;
import org.jooq.SQLDialect;
import org.jooq.Table;
import org.jooq.impl.DSL;
import javax.sql.DataSource;
import static org.jooq.impl.DSL.field;
import static org.jooq.impl.DSL.table;
public class JdbcStore implements Store {
private final DSLContext create;
private final Table<Record> STORE = table("STORE");
private final Field<Object> USER = field("USER");
private final Field<Object> KEY = field("KEY");
private final Field<Object> VALUE = field("VALUE");
public JdbcStore(DataSource dataSource) {
this.create = DSL.using(dataSource, SQLDialect.H2);
}
@Override
public <T> void put(String user, String key, T value) {
if (exists(user, key)) {
create.update(STORE)
.set(VALUE, value)
.where(USER.equal(user)
.and(KEY.equal(key)))
.execute();
} else {
create.insertInto(STORE)
.set(USER, user)
.set(KEY, key)
.set(VALUE, value).execute();
}
}
@Override
public <T> T get(String user, String key, Class<T> clazz) {
return create.select()
.from(STORE)
.where(USER.equal(user)
.and(KEY.equal(key)))
.fetchOne(VALUE, clazz);
}
private boolean exists(String user, String key) {
return get(user, key, String.class) != null;
}
}