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
73 changes: 59 additions & 14 deletions core/src/main/java/me/zort/sqllib/SQLDatabaseConnection.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package me.zort.sqllib;

import lombok.AllArgsConstructor;
import lombok.Getter;
import me.zort.sqllib.api.Query;
import me.zort.sqllib.api.SQLConnection;
Expand All @@ -8,7 +9,9 @@
import me.zort.sqllib.api.data.Row;
import me.zort.sqllib.api.mapping.StatementMappingOptions;
import me.zort.sqllib.internal.factory.SQLConnectionFactory;
import me.zort.sqllib.internal.impl.QueryResultImpl;
import me.zort.sqllib.internal.query.*;
import me.zort.sqllib.internal.query.part.SetStatement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -73,18 +76,6 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto
public abstract <T> T createGate(Class<T> mappingInterface, @NotNull StatementMappingOptions options);
public abstract boolean buildEntitySchema(String tableName, Class<?> entityClass);

/**
* Saves this mapping object into database using upsert query.
* <p>
* All mapping strategies are described in:
* {@link SQLDatabaseConnection#query(Query, Class)}.
*
* @param table Table to save into.
* @param obj The object to save.
* @return Result of the query.
*/
public abstract QueryResult save(String table, Object obj);

/**
* Performs new query and returns the result. This result is never null.
* See: {@link QueryRowsResult#isSuccessful()}
Expand Down Expand Up @@ -121,9 +112,59 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto
*/
public abstract QueryResult exec(Query query);
public abstract QueryResult exec(String query);
protected abstract DefsVals buildDefsVals(Object obj);
public abstract boolean isLogSqlErrors();
public abstract boolean isDebug();

/**
* Saves this mapping object into database using upsert query.
* <p>
* All mapping strategies are described in:
* {@link SQLDatabaseConnection#query(Query, Class)}.
*
* @param table Table to save into.
* @param obj The object to save.
* @return Result of the query.
*/
// by default, it creates and upsert request.
public QueryResult save(final @NotNull String table, final @NotNull Object obj) {
DefsVals defsVals = buildDefsVals(obj);

if(defsVals == null) return new QueryResultImpl(false);

return save(obj).table(table).execute();
}

public UpsertQuery save(final @NotNull Object obj) {
DefsVals defsVals = buildDefsVals(obj);
if(defsVals == null) return null;

String[] defs = defsVals.getDefs();
SQLDatabaseConnectionImpl.UnknownValueWrapper[] vals = defsVals.getVals();
UpsertQuery upsert = upsert().into(null, defs);
for(SQLDatabaseConnectionImpl.UnknownValueWrapper wrapper : vals) {
upsert.appendVal(wrapper.getObject());
}
SetStatement<InsertQuery> setStmt = upsert.onDuplicateKey();
for(int i = 0; i < defs.length; i++) {
setStmt.and(defs[i], vals[i].getObject());
}

return (UpsertQuery) setStmt.getAncestor();
}

public QueryResult insert(final @NotNull String table, final @NotNull Object obj) {
DefsVals defsVals = buildDefsVals(obj);
if (defsVals == null) return new QueryResultImpl(false);

InsertQuery query = insert().into(table, defsVals.getDefs());
for (SQLDatabaseConnectionImpl.UnknownValueWrapper valueWrapper : defsVals.getVals()) {
query.appendVal(valueWrapper.getObject());
}

return query.execute();
}

// --***-- Query builders --***--

public SelectQuery select(String... cols) {
Expand Down Expand Up @@ -161,7 +202,6 @@ public DeleteQuery delete() {
@Override
public final boolean connect() {
if(isConnected()) disconnect();

try {
connection = connectionFactory.connect();
lastError = null;
Expand All @@ -176,7 +216,6 @@ public final boolean connect() {
@Override
public final void disconnect() {
if (!isConnected()) return;

try {
connection.close();
lastError = null;
Expand All @@ -195,4 +234,10 @@ protected void logSqlError(Exception e) {
if(isLogSqlErrors()) e.printStackTrace();
}

@AllArgsConstructor
@Getter
protected static class DefsVals {
private final String[] defs;
private final SQLDatabaseConnectionImpl.UnknownValueWrapper[] vals;
}
}
75 changes: 4 additions & 71 deletions core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@
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.internal.query.InsertQuery;
import me.zort.sqllib.internal.query.UpsertQuery;
import me.zort.sqllib.internal.query.part.SetStatement;
import me.zort.sqllib.mapping.DefaultResultAdapter;
import me.zort.sqllib.mapping.DefaultStatementMappingFactory;
import me.zort.sqllib.pool.PooledSQLDatabaseConnection;
Expand Down Expand Up @@ -279,25 +276,20 @@ public QueryRowsResult<Row> query(final @NotNull String query) {
return query(() -> query);
}

private QueryRowsResult<Row> query(final @NotNull Query query, boolean isRetry) {
@NotNull
QueryRowsResult<Row> query(final @NotNull Query query, boolean isRetry) {
Objects.requireNonNull(query);

if(!handleAutoReconnect()) {
return new QueryRowsResult<>(false, "Cannot connect to database!");
}
if(!handleAutoReconnect()) return new QueryRowsResult<>(false, "Cannot connect to database!");

try(PreparedStatement stmt = buildStatement(query);
ResultSet resultSet = stmt.executeQuery()) {
QueryRowsResult<Row> result = new QueryRowsResult<>(true);

while(resultSet.next()) {
ResultSetMetaData meta = resultSet.getMetaData();
Row row = new Row();
for(int i = 1; i <= meta.getColumnCount(); i++) {
Object obj = resultSet.getObject(i);
if(obj instanceof String) {
obj = ((String) obj).replaceAll("''", "'");
}
if(obj instanceof String) obj = ((String) obj).replaceAll("''", "'");
row.put(meta.getColumnName(i), obj);
}
result.add(row);
Expand Down Expand Up @@ -353,58 +345,6 @@ private QueryResult exec(final @NotNull Query query, boolean isRetry) {
}
}

/**
* Saves this mapping object into database using upsert query.
* <p>
* All mapping strategies are described in:
* {@link SQLDatabaseConnection#query(Query, Class)}.
*
* @param table Table to save into.
* @param obj The object to save.
* @return Result of the query.
*/
// by default, it creates and upsert request.
@Override
public QueryResult save(final @NotNull String table, final @NotNull Object obj) {
DefsVals defsVals = buildDefsVals(obj);

if(defsVals == null) {
return new QueryResultImpl(false);
}

return save(obj).table(table).execute();
}

public UpsertQuery save(final @NotNull Object obj) {
DefsVals defsVals = buildDefsVals(obj);
if(defsVals == null) return null;

String[] defs = defsVals.getDefs();
UnknownValueWrapper[] vals = defsVals.getVals();
UpsertQuery upsert = upsert().into(null, defs);
for(UnknownValueWrapper wrapper : vals) {
upsert.appendVal(wrapper.getObject());
}
SetStatement<InsertQuery> setStmt = upsert.onDuplicateKey();
for(int i = 0; i < defs.length; i++) {
setStmt.and(defs[i], vals[i].getObject());
}

return (UpsertQuery) setStmt.getAncestor();
}

public QueryResult insert(final @NotNull String table, final @NotNull Object obj) {
DefsVals defsVals = buildDefsVals(obj);
if (defsVals == null) return new QueryResultImpl(false);

InsertQuery query = insert().into(table, defsVals.getDefs());
for (UnknownValueWrapper valueWrapper : defsVals.getVals()) {
query.appendVal(valueWrapper.getObject());
}

return query.execute();
}

@SuppressWarnings("unchecked")
@Nullable
protected DefsVals buildDefsVals(Object obj) {
Expand Down Expand Up @@ -529,13 +469,6 @@ public PreparedStatement prepare(Connection connection) throws SQLException {
}
}

@AllArgsConstructor
@Getter
protected static class DefsVals {
private final String[] defs;
private final UnknownValueWrapper[] vals;
}

@AllArgsConstructor
@Data
public static class UnknownValueWrapper {
Expand Down
7 changes: 7 additions & 0 deletions core/src/main/java/me/zort/sqllib/util/DefsVals.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package me.zort.sqllib.util;

public final class DefsVals {



}