58 private final Optional<SQLiteConfig> config;
79 this(
new JdbcDatabaseClient(dataSource), Optional.of(Objects.requireNonNull(config,
"config")));
83 this.delegate = Objects.requireNonNull(delegate,
"delegate");
84 this.config = Objects.requireNonNull(
config,
"config");
93 public static Builder
builder(
final DataSource dataSource) {
94 return new Builder(dataSource);
100 public static final class Builder {
101 private final DataSource dataSource;
104 private Builder(
final DataSource dataSource) {
105 this.dataSource = Objects.requireNonNull(dataSource,
"dataSource");
114 public Builder withWalEnabled() {
115 this.config = SQLiteConfig.
builder()
116 .journalMode(dev.rafex.ether.database.sqlite.config.JournalMode.WAL)
117 .synchronousMode(
config.synchronousMode())
118 .foreignKeys(
config.foreignKeys())
119 .busyTimeout(
config.busyTimeout())
120 .caseSensitiveLike(
config.caseSensitiveLike())
121 .recursiveTriggers(
config.recursiveTriggers())
122 .autoVacuum(
config.autoVacuum())
133 public Builder withSynchronousMode(
final dev.rafex.ether.database.sqlite.config.SynchronousMode mode) {
134 this.config = SQLiteConfig.builder()
135 .journalMode(
config.journalMode())
136 .synchronousMode(mode)
137 .foreignKeys(
config.foreignKeys())
138 .busyTimeout(
config.busyTimeout())
139 .caseSensitiveLike(
config.caseSensitiveLike())
140 .recursiveTriggers(
config.recursiveTriggers())
141 .autoVacuum(
config.autoVacuum())
152 public Builder withJournalMode(
final dev.rafex.ether.database.sqlite.config.JournalMode mode) {
153 this.config = SQLiteConfig.builder()
155 .synchronousMode(
config.synchronousMode())
156 .foreignKeys(
config.foreignKeys())
157 .busyTimeout(
config.busyTimeout())
158 .caseSensitiveLike(
config.caseSensitiveLike())
159 .recursiveTriggers(
config.recursiveTriggers())
160 .autoVacuum(
config.autoVacuum())
171 public Builder withForeignKeys(
final boolean enabled) {
172 this.config = SQLiteConfig.builder()
173 .journalMode(config.journalMode())
174 .synchronousMode(config.synchronousMode())
175 .foreignKeys(enabled)
176 .busyTimeout(config.busyTimeout())
177 .caseSensitiveLike(config.caseSensitiveLike())
178 .recursiveTriggers(config.recursiveTriggers())
179 .autoVacuum(config.autoVacuum())
190 public Builder withBusyTimeout(
final int timeout) {
191 this.config = SQLiteConfig.builder()
192 .journalMode(config.journalMode())
193 .synchronousMode(config.synchronousMode())
194 .foreignKeys(config.foreignKeys())
195 .busyTimeout(timeout)
196 .caseSensitiveLike(config.caseSensitiveLike())
197 .recursiveTriggers(config.recursiveTriggers())
198 .autoVacuum(config.autoVacuum())
209 public Builder withConfig(
final SQLiteConfig config) {
210 this.config = Objects.requireNonNull(config,
"config");
240 private RuntimeException wrapException(
final String message,
final SQLException cause) {
253 private <T> T executeWithErrorHandling(
final DatabaseOperation<T> operation) {
255 return operation.execute();
256 }
catch (DatabaseAccessException e) {
258 Throwable cause = e.getCause();
259 if (cause instanceof SQLException) {
260 throw wrapException(e.getMessage(), (SQLException) cause);
267 public <T> T query(
final SqlQuery query,
final ResultSetExtractor<T> extractor) {
268 return executeWithErrorHandling(() -> delegate.query(query, extractor));
272 public <T> List<T> queryList(
final SqlQuery query,
final RowMapper<T> mapper) {
273 return executeWithErrorHandling(() -> delegate.queryList(query, mapper));
277 public <T> Optional<T> queryOne(
final SqlQuery query,
final RowMapper<T> mapper) {
278 return executeWithErrorHandling(() -> delegate.queryOne(query, mapper));
283 return executeWithErrorHandling(() -> delegate.execute(query));
287 public long[]
batch(
final String
sql,
final List<StatementBinder> binders) {
288 return executeWithErrorHandling(() -> delegate.batch(
sql, binders));
293 return executeWithErrorHandling(() -> {
297 throw new UnsupportedOperationException(
298 "Transaction support not implemented in SQLiteDatabaseClient. " +
299 "Use JdbcDatabaseClient directly for transaction support."