Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions api/src/main/java/me/zort/sqllib/api/cache/CacheManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,43 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* A cache manager that caches query results. This is used
* primarly in {@link me.zort.sqllib.api.SQLConnection} instances
* that hold a cache manager.
*
* @author ZorTik
*/
public interface CacheManager {

/**
* Sets a query result to the cache.
* If the query is already cached, it should be overwritten.
*
* @param query Query that was executed
* @param result Result
*/
void set(@NotNull Query query, @NotNull QueryResult result);

/**
* Returns a query result from the cache, or null if
* the query is not cached.
*
* @param query Query that was executed
* @param isExec Whether the query is an exec (no ResultSet) query
* @return The nullable query result
*/
@Nullable QueryResult get(@NotNull Query query, boolean isExec);

/**
* Returns a cache manager that does not cache anything.
*
* @return The cache manager
*/
static CacheManager noCache() {
return new CacheManager() {
@Override
public void set(@NotNull Query query, @NotNull QueryResult result) {
}
public void set(@NotNull Query query, @NotNull QueryResult result) {}
@Override
public @Nullable QueryResult get(@NotNull Query query, boolean isExec) {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package me.zort.sqllib.api.options;

/**
* A naming strategy that converts field names to column names.
*
* @author ZorTik
*/
public interface NamingStrategy {

String fieldNameToColumn(String str);
Expand Down
1 change: 1 addition & 0 deletions core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ dependencies {
implementation project(":shared")
implementation group: 'org.jetbrains', name: 'annotations', version: '20.1.0'
implementation 'com.google.code.gson:gson:2.9.0'
implementation 'com.google.guava:guava:31.0-jre'
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
}
36 changes: 22 additions & 14 deletions core/src/main/java/me/zort/sqllib/SQLConnectionBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import me.zort.sqllib.api.ISQLConnectionBuilder;
import me.zort.sqllib.api.ISQLDatabaseOptions;
import me.zort.sqllib.api.SQLEndpoint;
import me.zort.sqllib.internal.Constants;
import me.zort.sqllib.api.cache.CacheManager;
import me.zort.sqllib.internal.exception.SQLDriverNotFoundException;
import me.zort.sqllib.internal.exception.SQLEndpointNotValidException;
import me.zort.sqllib.internal.factory.SQLConnectionFactory;
Expand Down Expand Up @@ -34,14 +34,15 @@ public final class SQLConnectionBuilder implements ISQLConnectionBuilder<SQLData
return of(new SQLEndpointImpl("jdbc:sqlite:" + path, null, null)).withDriver("org.sqlite.JDBC");
}

public static SQLConnectionBuilder of(SQLEndpoint endpoint) {
public static @NotNull SQLConnectionBuilder of(SQLEndpoint endpoint) {
if(!endpoint.isValid()) throw new SQLEndpointNotValidException(endpoint);
return new SQLConnectionBuilder(endpoint);
}

private SQLEndpoint endpoint;
private String jdbc;
private String driver = null;
private CacheManager cacheManager = null;

public SQLConnectionBuilder() {
this(null);
Expand Down Expand Up @@ -72,6 +73,11 @@ public SQLConnectionBuilder(@Nullable SQLEndpoint endpoint) {
return this;
}

public @NotNull SQLConnectionBuilder withCacheManager(final @Nullable CacheManager cacheManager) {
this.cacheManager = cacheManager;
return this;
}

public @NotNull SQLDatabaseConnection build() {
return build(null);
}
Expand All @@ -81,12 +87,16 @@ public SQLConnectionBuilder(@Nullable SQLEndpoint endpoint) {
}

public @NotNull SQLDatabaseConnection build(@Nullable String driver, @Nullable ISQLDatabaseOptions options) {
SQLDatabaseConnection connection = buildConnection(driver, options);
if(cacheManager != null) connection.enableCaching(cacheManager);
return connection;
}

private @NotNull SQLDatabaseConnection buildConnection(@Nullable String driver, @Nullable ISQLDatabaseOptions options) {
Objects.requireNonNull(endpoint, "Endpoint must be set!");
Objects.requireNonNull(jdbc);
if(driver == null) {
driver = Constants.DEFAULT_DRIVER;
}
SQLConnectionFactory connectionFactory = new BuilderSQLConnectionFactory(this, driver);
if (driver == null) driver = SQLDatabaseConnectionImpl.DEFAULT_DRIVER;
SQLConnectionFactory connectionFactory = new LocalConnectionFactory(driver);
return jdbc.contains("jdbc:sqlite")
? new SQLiteDatabaseConnectionImpl(connectionFactory, options)
: new SQLDatabaseConnectionImpl(connectionFactory, options);
Expand All @@ -102,22 +112,20 @@ protected SQLConnectionBuilder clone() throws CloneNotSupportedException {
}

@RequiredArgsConstructor
public static class BuilderSQLConnectionFactory implements SQLConnectionFactory {
class LocalConnectionFactory implements SQLConnectionFactory {

private final SQLConnectionBuilder builder;
private final String driver;
private final String localDriver;

@Nullable
@Override
public Connection connect() throws SQLException {
try {
Class.forName(driver);
Class.forName(localDriver);
} catch (ClassNotFoundException e) {
throw new SQLDriverNotFoundException(driver, e);
throw new SQLDriverNotFoundException(localDriver, e);
}
String jdbc = builder.jdbc;
String usr = builder.endpoint.getUsername();
String pwd = builder.endpoint.getPassword();
String usr = endpoint.getUsername();
String pwd = endpoint.getPassword();
return DriverManager.getConnection(jdbc, usr, pwd);
}

Expand Down
20 changes: 10 additions & 10 deletions core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package me.zort.sqllib;

import com.google.gson.Gson;
import lombok.*;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.SneakyThrows;
import me.zort.sqllib.api.ISQLDatabaseOptions;
import me.zort.sqllib.api.ObjectMapper;
import me.zort.sqllib.api.Query;
Expand All @@ -20,10 +23,8 @@
import me.zort.sqllib.internal.factory.SQLConnectionFactory;
import me.zort.sqllib.internal.fieldResolver.ConstructorParameterResolver;
import me.zort.sqllib.internal.fieldResolver.LinkedOneFieldResolver;
import me.zort.sqllib.internal.impl.DefaultNamingStrategy;
import me.zort.sqllib.internal.impl.DefaultObjectMapper;
import me.zort.sqllib.internal.impl.QueryResultImpl;
import me.zort.sqllib.mapping.DefaultResultAdapter;
import me.zort.sqllib.mapping.DefaultStatementMappingFactory;
import me.zort.sqllib.pool.PooledSQLDatabaseConnection;
import me.zort.sqllib.transaction.Transaction;
Expand Down Expand Up @@ -59,10 +60,11 @@ public class SQLDatabaseConnectionImpl extends PooledSQLDatabaseConnection {

// --***-- Default Constants --***--

public static final boolean DEFAULT_AUTO_RECONNECT = true;
public static final boolean DEFAULT_DEBUG = false;
public static final boolean DEFAULT_LOG_SQL_ERRORS = true;
public static final NamingStrategy DEFAULT_NAMING_STRATEGY = new DefaultNamingStrategy();
public static final String DEFAULT_DRIVER = Defaults.DEFAULT_DRIVER;
public static final boolean DEFAULT_AUTO_RECONNECT = Defaults.DEFAULT_AUTO_RECONNECT;
public static final boolean DEFAULT_DEBUG = Defaults.DEFAULT_DEBUG;
public static final boolean DEFAULT_LOG_SQL_ERRORS = Defaults.DEFAULT_LOG_SQL_ERRORS;
public static final NamingStrategy DEFAULT_NAMING_STRATEGY = Defaults.DEFAULT_NAMING_STRATEGY;
public static final Gson DEFAULT_GSON = Defaults.DEFAULT_GSON;

// --***-- Options & Utilities --***--
Expand Down Expand Up @@ -97,9 +99,7 @@ public SQLDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionF
*/
public SQLDatabaseConnectionImpl(final @NotNull SQLConnectionFactory connectionFactory, @Nullable ISQLDatabaseOptions options) {
super(connectionFactory);
if (options == null) options = defaultOptions();

this.options = options;
this.options = options == null ? defaultOptions() : options;
this.objectMapper = new DefaultObjectMapper(this);
this.mappingFactory = new DefaultStatementMappingFactory();
this.errorStateHandlers = new CopyOnWriteArrayList<>();
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/me/zort/sqllib/SQLDatabaseOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import me.zort.sqllib.api.ISQLDatabaseOptions;
import me.zort.sqllib.api.options.NamingStrategy;
import me.zort.sqllib.internal.Defaults;
import me.zort.sqllib.internal.impl.DefaultNamingStrategy;
import me.zort.sqllib.naming.SymbolSeparatedNamingStrategy;
import org.jetbrains.annotations.NotNull;

@AllArgsConstructor
Expand All @@ -18,7 +18,7 @@ public final class SQLDatabaseOptions implements ISQLDatabaseOptions {
private boolean autoReconnect = true;
private boolean debug = false;
private boolean logSqlErrors = true;
private transient NamingStrategy namingStrategy = new DefaultNamingStrategy();
private transient NamingStrategy namingStrategy = SQLDatabaseConnectionImpl.DEFAULT_NAMING_STRATEGY;
private transient Gson gson = Defaults.DEFAULT_GSON;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,38 @@
package me.zort.sqllib.cache;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import me.zort.sqllib.api.Query;
import me.zort.sqllib.api.cache.CacheManager;
import me.zort.sqllib.api.data.QueryResult;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.concurrent.TimeUnit;

public class ExpirableEntriesCacheManager implements CacheManager {

private final Cache<Query, QueryResult> cache;

/**
* Creates a new cache manager with provided expiration duration
* in milliseconds.
*
* @param expirationDuration The expiration duration
*/
public ExpirableEntriesCacheManager(long expirationDuration) {
cache = CacheBuilder.newBuilder()
.expireAfterWrite(expirationDuration, TimeUnit.MILLISECONDS)
.build();
}

@Override
public void set(@NotNull Query query, @NotNull QueryResult result) {
// TODO: Implement
cache.put(query, result);
}

@Override
public @Nullable QueryResult get(@NotNull Query query, boolean isExec) {
// TODO: Implement
return null;
return cache.getIfPresent(query);
}
}
7 changes: 0 additions & 7 deletions core/src/main/java/me/zort/sqllib/internal/Constants.java

This file was deleted.

8 changes: 8 additions & 0 deletions core/src/main/java/me/zort/sqllib/internal/Defaults.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,17 @@

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import me.zort.sqllib.api.options.NamingStrategy;
import me.zort.sqllib.naming.SymbolSeparatedNamingStrategy;

public final class Defaults {

public static final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver";
public static final boolean DEFAULT_AUTO_RECONNECT = true;
public static final boolean DEFAULT_DEBUG = false;
public static final boolean DEFAULT_LOG_SQL_ERRORS = true;
public static final NamingStrategy DEFAULT_NAMING_STRATEGY = new SymbolSeparatedNamingStrategy('_');

public static final Gson DEFAULT_GSON = new GsonBuilder()
.enableComplexMapKeySerialization()
.create();
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package me.zort.sqllib.internal.query;

import com.google.gson.Gson;
import lombok.*;
import me.zort.sqllib.SQLConnectionRegistry;
import me.zort.sqllib.util.Pair;
Expand Down Expand Up @@ -129,6 +130,10 @@ public int length() {
return queryStr.length();
}

public String toString() {
return "QueryDetails{str=" + queryStr + ", values=" + new Gson().toJson(values) + "}";
}

@RequiredArgsConstructor
public static class Builder {

Expand Down
15 changes: 15 additions & 0 deletions core/src/main/java/me/zort/sqllib/internal/query/QueryNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -194,4 +194,19 @@ private void debug(String message) {
}
}

public String toString() {
return "QueryNode{details=" + buildQueryDetails().toString() + "}";
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof QueryNode)) return false;
QueryNode<?> other = (QueryNode<?>) obj;
return toString().equals(other.toString());
}

@Override
public int hashCode() {
return toString().hashCode();
}
}
Loading