Skip to content

Commit 4558302

Browse files
authored
Merge pull request #26 from ZorTik/development
Allow to use options in SQLConnectionPool.java
2 parents 3d3de25 + 3c3dac3 commit 4558302

13 files changed

Lines changed: 166 additions & 59 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package me.zort.sqllib.api;
2+
3+
public interface ISQLConnectionBuilder<C extends SQLConnection> {
4+
5+
C build(ISQLDatabaseOptions options);
6+
7+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package me.zort.sqllib.api;
2+
3+
import com.google.gson.Gson;
4+
import me.zort.sqllib.api.options.NamingStrategy;
5+
6+
public interface ISQLDatabaseOptions {
7+
8+
void setAutoReconnect(boolean autoReconnect);
9+
void setDebug(boolean debug);
10+
void setLogSqlErrors(boolean logSqlErrors);
11+
void setNamingStrategy(NamingStrategy namingStrategy);
12+
void setGson(Gson gson);
13+
14+
boolean isAutoReconnect();
15+
boolean isDebug();
16+
boolean isLogSqlErrors();
17+
NamingStrategy getNamingStrategy();
18+
Gson getGson();
19+
20+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package me.zort.sqllib.api.cache;
2+
3+
import me.zort.sqllib.api.Query;
4+
import me.zort.sqllib.api.data.QueryResult;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
7+
8+
public interface CacheManager {
9+
10+
void set(@NotNull Query query, @NotNull QueryResult result);
11+
@Nullable QueryResult get(@NotNull Query query, boolean isExec);
12+
13+
static CacheManager noCache() {
14+
return new CacheManager() {
15+
@Override
16+
public void set(@NotNull Query query, @NotNull QueryResult result) {
17+
}
18+
@Override
19+
public @Nullable QueryResult get(@NotNull Query query, boolean isExec) {
20+
return null;
21+
}
22+
};
23+
}
24+
25+
}

core/src/main/java/me/zort/sqllib/SQLConnectionBuilder.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package me.zort.sqllib;
22

33
import lombok.RequiredArgsConstructor;
4+
import me.zort.sqllib.api.ISQLConnectionBuilder;
5+
import me.zort.sqllib.api.ISQLDatabaseOptions;
46
import me.zort.sqllib.api.SQLEndpoint;
57
import me.zort.sqllib.internal.Constants;
68
import me.zort.sqllib.internal.exception.SQLDriverNotFoundException;
@@ -18,7 +20,7 @@
1820
import java.util.Objects;
1921

2022
@SuppressWarnings("unused")
21-
public final class SQLConnectionBuilder implements Cloneable {
23+
public final class SQLConnectionBuilder implements ISQLConnectionBuilder<SQLDatabaseConnection>, Cloneable {
2224

2325
public static @NotNull SQLConnectionBuilder of(String address, int port, String database, String username, String password) {
2426
return of(new DefaultSQLEndpoint(address + ":" + port, database, username, password));
@@ -74,11 +76,11 @@ public SQLConnectionBuilder(@Nullable SQLEndpoint endpoint) {
7476
return build(null);
7577
}
7678

77-
public @NotNull SQLDatabaseConnection build(@Nullable SQLDatabaseOptions options) {
79+
public @NotNull SQLDatabaseConnection build(@Nullable ISQLDatabaseOptions options) {
7880
return build(driver, options);
7981
}
8082

81-
public @NotNull SQLDatabaseConnection build(@Nullable String driver, @Nullable SQLDatabaseOptions options) {
83+
public @NotNull SQLDatabaseConnection build(@Nullable String driver, @Nullable ISQLDatabaseOptions options) {
8284
Objects.requireNonNull(endpoint, "Endpoint must be set!");
8385
Objects.requireNonNull(jdbc);
8486
if(driver == null) {

core/src/main/java/me/zort/sqllib/SQLDatabaseConnection.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import lombok.Getter;
66
import me.zort.sqllib.api.Query;
77
import me.zort.sqllib.api.SQLConnection;
8+
import me.zort.sqllib.api.cache.CacheManager;
89
import me.zort.sqllib.api.data.QueryResult;
910
import me.zort.sqllib.api.data.QueryRowsResult;
1011
import me.zort.sqllib.api.data.Row;
@@ -128,6 +129,13 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto
128129
@ApiStatus.Experimental
129130
@Nullable
130131
public abstract Transaction getTransaction();
132+
/**
133+
* Enabled caching for this connection.
134+
*
135+
* @param cacheManager Cache manager to use.
136+
*/
137+
@ApiStatus.Experimental
138+
public abstract void enableCaching(CacheManager cacheManager);
131139
public abstract boolean isTransactionActive();
132140
protected abstract DefsVals buildDefsVals(Object obj);
133141
public abstract boolean isLogSqlErrors();
@@ -141,19 +149,18 @@ public UpsertQuery save(final @NotNull String table, final @NotNull Object obj)
141149
public UpsertQuery save(final @NotNull Object obj) {
142150
DefsVals defsVals = buildDefsVals(obj);
143151
if(defsVals == null) return null;
144-
145152
String[] defs = defsVals.getDefs();
146153
SQLDatabaseConnectionImpl.UnknownValueWrapper[] vals = defsVals.getVals();
147-
UpsertQuery upsert = upsert().into(null, defs);
154+
UpsertQuery upsertQuery = upsert().into(null, defs);
148155
for(SQLDatabaseConnectionImpl.UnknownValueWrapper wrapper : vals) {
149-
upsert.appendVal(wrapper.getObject());
156+
upsertQuery.appendVal(wrapper.getObject());
150157
}
151-
SetStatement<InsertQuery> setStmt = upsert.onDuplicateKey();
158+
SetStatement<InsertQuery> setStatement = upsertQuery.onDuplicateKey();
152159
for(int i = 0; i < defs.length; i++) {
153-
setStmt.and(defs[i], vals[i].getObject());
160+
setStatement.and(defs[i], vals[i].getObject());
154161
}
155162

156-
return (UpsertQuery) setStmt.getAncestor();
163+
return (UpsertQuery) setStatement.getAncestor();
157164
}
158165

159166
public QueryResult insert(final @NotNull String table, final @NotNull Object obj) {

core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import com.google.gson.Gson;
44
import lombok.*;
5+
import me.zort.sqllib.api.ISQLDatabaseOptions;
56
import me.zort.sqllib.api.ObjectMapper;
67
import me.zort.sqllib.api.Query;
78
import me.zort.sqllib.api.StatementFactory;
9+
import me.zort.sqllib.api.cache.CacheManager;
810
import me.zort.sqllib.api.data.QueryResult;
911
import me.zort.sqllib.api.data.QueryRowsResult;
1012
import me.zort.sqllib.api.data.Row;
@@ -66,11 +68,12 @@ public class SQLDatabaseConnectionImpl extends PooledSQLDatabaseConnection {
6668
// --***-- Options & Utilities --***--
6769

6870
@Getter
69-
private final SQLDatabaseOptions options;
71+
private final ISQLDatabaseOptions options;
7072
private final transient StatementMappingFactory mappingFactory;
7173
private final transient StatementMappingResultAdapter mappingResultAdapter;
7274
private final transient List<ErrorStateObserver> errorStateHandlers;
7375
private transient ObjectMapper objectMapper;
76+
private transient CacheManager cacheManager;
7477
@Setter
7578
private transient Logger logger;
7679
@Getter(onMethod_ = {@Nullable, @ApiStatus.Experimental})
@@ -81,7 +84,7 @@ public class SQLDatabaseConnectionImpl extends PooledSQLDatabaseConnection {
8184
* Constructs new instance of this implementation with default
8285
* options.
8386
*
84-
* @see SQLDatabaseConnectionImpl#SQLDatabaseConnectionImpl(SQLConnectionFactory, SQLDatabaseOptions)
87+
* @see SQLDatabaseConnectionImpl#SQLDatabaseConnectionImpl(SQLConnectionFactory, ISQLDatabaseOptions)
8588
*/
8689
public SQLDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionFactory) {
8790
this(connectionFactory, null);
@@ -93,7 +96,7 @@ public SQLDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionF
9396
* @param connectionFactory Factory to use while opening connection.
9497
* @param options Client options to use.
9598
*/
96-
public SQLDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionFactory, @Nullable SQLDatabaseOptions options) {
99+
public SQLDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionFactory, @Nullable ISQLDatabaseOptions options) {
97100
super(connectionFactory);
98101
if (options == null) options = defaultOptions();
99102

@@ -105,6 +108,8 @@ public SQLDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionF
105108
this.transaction = null;
106109
this.logger = Logger.getGlobal();
107110

111+
enableCaching(CacheManager.noCache());
112+
108113
// Default backup value resolvers.
109114
registerBackupValueResolver(new LinkedOneFieldResolver());
110115
registerBackupValueResolver(new ConstructorParameterResolver());
@@ -143,6 +148,17 @@ public void addErrorHandler(final @NotNull ErrorStateObserver observer) {
143148
this.errorStateHandlers.add(observer);
144149
}
145150

151+
/**
152+
* Enabled caching for this connection.
153+
*
154+
* @param cacheManager Cache manager to use.
155+
*/
156+
@ApiStatus.Experimental
157+
@Override
158+
public void enableCaching(CacheManager cacheManager) {
159+
this.cacheManager = cacheManager;
160+
}
161+
146162
/**
147163
* Constructs a mapping proxy based on provided interface.
148164
* The interface should follow rules for creating mapping repositories
@@ -292,11 +308,16 @@ public QueryRowsResult<Row> query(final @NotNull String query) {
292308
return query(() -> query);
293309
}
294310

295-
@NotNull QueryRowsResult<Row> query(final @NotNull Query query, boolean isRetry) {
311+
@SuppressWarnings("unchecked")
312+
@NotNull
313+
QueryRowsResult<Row> query(final @NotNull Query query, boolean isRetry) {
296314
Objects.requireNonNull(query);
297315
if(!handleAutoReconnect())
298316
return new QueryRowsResult<>(false, "Cannot connect to database!");
299317

318+
QueryResult cachedResult = cacheManager.get(query, false);
319+
if (cachedResult instanceof QueryRowsResult) return (QueryRowsResult<Row>) cachedResult;
320+
300321
try(PreparedStatement stmt = buildStatement(query);
301322
ResultSet resultSet = stmt.executeQuery()) {
302323
QueryRowsResult<Row> result = new QueryRowsResult<>(true);
@@ -311,6 +332,8 @@ public QueryRowsResult<Row> query(final @NotNull String query) {
311332
result.add(row);
312333
}
313334

335+
cacheManager.set(query, result);
336+
314337
return result;
315338
} catch (SQLException e) {
316339
if (!isRetry && e.getMessage().contains("database connection closed")) {
@@ -347,9 +370,15 @@ public QueryResult exec(final @NotNull String query) {
347370
if(!handleAutoReconnect()) {
348371
return new QueryResultImpl(false, "Cannot connect to database!");
349372
}
373+
374+
QueryResult cachedResult = cacheManager.get(query, true);
375+
if (cachedResult != null) return cachedResult;
376+
350377
try(PreparedStatement stmt = buildStatement(query)) {
351378
stmt.execute();
352-
return new QueryResultImpl(true);
379+
QueryResultImpl result = new QueryResultImpl(true);
380+
cacheManager.set(query, result);
381+
return result;
353382
} catch (SQLException e) {
354383
if (!isRetry && e.getMessage().contains("database connection closed")) {
355384
reconnect();

core/src/main/java/me/zort/sqllib/SQLDatabaseOptions.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.AllArgsConstructor;
55
import lombok.Data;
66
import lombok.NoArgsConstructor;
7+
import me.zort.sqllib.api.ISQLDatabaseOptions;
78
import me.zort.sqllib.api.options.NamingStrategy;
89
import me.zort.sqllib.internal.Defaults;
910
import me.zort.sqllib.internal.impl.DefaultNamingStrategy;
@@ -12,7 +13,7 @@
1213
@AllArgsConstructor
1314
@NoArgsConstructor
1415
@Data
15-
public final class SQLDatabaseOptions {
16+
public final class SQLDatabaseOptions implements ISQLDatabaseOptions {
1617

1718
private boolean autoReconnect = true;
1819
private boolean debug = false;
@@ -27,12 +28,12 @@ public final class SQLDatabaseOptions {
2728
*/
2829
@SuppressWarnings("unused")
2930
public void load(final @NotNull SQLDatabaseConnectionImpl connection) {
30-
SQLDatabaseOptions options = connection.getOptions();
31-
this.autoReconnect = options.autoReconnect;
32-
this.debug = options.debug;
33-
this.logSqlErrors = options.logSqlErrors;
34-
this.namingStrategy = options.namingStrategy;
35-
this.gson = options.gson;
31+
ISQLDatabaseOptions options = connection.getOptions();
32+
this.autoReconnect = options.isAutoReconnect();
33+
this.debug = options.isDebug();
34+
this.logSqlErrors = options.isLogSqlErrors();
35+
this.namingStrategy = options.getNamingStrategy();
36+
this.gson = options.getGson();
3637
}
3738

3839
}

core/src/main/java/me/zort/sqllib/SQLiteDatabaseConnectionImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.zort.sqllib;
22

3+
import me.zort.sqllib.api.ISQLDatabaseOptions;
34
import me.zort.sqllib.api.Query;
45
import me.zort.sqllib.api.data.QueryResult;
56
import me.zort.sqllib.api.data.QueryRowsResult;
@@ -29,8 +30,7 @@ public SQLiteDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connecti
2930
super(connectionFactory);
3031
}
3132

32-
public SQLiteDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionFactory,
33-
@Nullable SQLDatabaseOptions options) {
33+
public SQLiteDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionFactory, @Nullable ISQLDatabaseOptions options) {
3434
super(connectionFactory, options);
3535
}
3636

core/src/main/java/me/zort/sqllib/TableSchemaBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.gson.internal.Primitives;
44
import lombok.RequiredArgsConstructor;
5+
import me.zort.sqllib.api.ISQLDatabaseOptions;
56
import me.zort.sqllib.internal.annotation.JsonField;
67
import me.zort.sqllib.internal.annotation.NullableField;
78
import me.zort.sqllib.internal.annotation.PrimaryKey;
@@ -38,7 +39,7 @@ public String[] buildDefsFromType() {
3839
}
3940
debug("Building defs from type class: " + typeClass.getName());
4041

41-
SQLDatabaseOptions options = ((SQLDatabaseConnectionImpl) connection).getOptions();
42+
ISQLDatabaseOptions options = ((SQLDatabaseConnectionImpl) connection).getOptions();
4243
String[] defs = new String[0];
4344

4445
for (Field field : typeClass.getDeclaredFields()) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package me.zort.sqllib.cache;
2+
3+
import me.zort.sqllib.api.Query;
4+
import me.zort.sqllib.api.cache.CacheManager;
5+
import me.zort.sqllib.api.data.QueryResult;
6+
import org.jetbrains.annotations.NotNull;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
public class ExpirableEntriesCacheManager implements CacheManager {
10+
@Override
11+
public void set(@NotNull Query query, @NotNull QueryResult result) {
12+
// TODO: Implement
13+
}
14+
15+
@Override
16+
public @Nullable QueryResult get(@NotNull Query query, boolean isExec) {
17+
// TODO: Implement
18+
return null;
19+
}
20+
}

0 commit comments

Comments
 (0)