Skip to content

Commit 3d3de25

Browse files
authored
Merge pull request #25 from ZorTik/development
Transaction, transaction flow
2 parents 5fa30c3 + 73ee78b commit 3d3de25

21 files changed

Lines changed: 498 additions & 128 deletions

File tree

api/src/main/java/me/zort/sqllib/api/Query.java

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

3+
import java.sql.SQLException;
4+
35
/**
46
* This class represents a query.
57
* @author ZorTik
@@ -21,4 +23,6 @@ default boolean isAncestor() {
2123
return getAncestor() == this;
2224
}
2325

26+
default void errorSignal(SQLException e) {}
27+
2428
}

api/src/main/java/me/zort/sqllib/api/data/QueryRowsResult.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import lombok.Getter;
44

5-
import java.util.ArrayList;
5+
import java.util.LinkedList;
66

77
@Getter
8-
public class QueryRowsResult<T> extends ArrayList<T> implements QueryResult {
8+
public class QueryRowsResult<T> extends LinkedList<T> implements QueryResult {
99

1010
private final boolean successful;
1111
private String rejectMessage = null;

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

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import me.zort.sqllib.internal.factory.SQLConnectionFactory;
99
import me.zort.sqllib.internal.impl.DefaultSQLEndpoint;
1010
import me.zort.sqllib.internal.impl.SQLEndpointImpl;
11+
import me.zort.sqllib.pool.SQLConnectionPool;
1112
import org.jetbrains.annotations.NotNull;
1213
import org.jetbrains.annotations.Nullable;
1314

@@ -16,6 +17,7 @@
1617
import java.sql.SQLException;
1718
import java.util.Objects;
1819

20+
@SuppressWarnings("unused")
1921
public final class SQLConnectionBuilder implements Cloneable {
2022

2123
public static @NotNull SQLConnectionBuilder of(String address, int port, String database, String username, String password) {
@@ -27,15 +29,11 @@ public final class SQLConnectionBuilder implements Cloneable {
2729
}
2830

2931
public static @NotNull SQLConnectionBuilder ofSQLite(String path) {
30-
SQLConnectionBuilder builder = of(new SQLEndpointImpl("jdbc:sqlite:" + path, null, null));
31-
builder.withDriver("org.sqlite.JDBC");
32-
return builder;
32+
return of(new SQLEndpointImpl("jdbc:sqlite:" + path, null, null)).withDriver("org.sqlite.JDBC");
3333
}
3434

3535
public static SQLConnectionBuilder of(SQLEndpoint endpoint) {
36-
if(!endpoint.isValid()) {
37-
throw new SQLEndpointNotValidException(endpoint);
38-
}
36+
if(!endpoint.isValid()) throw new SQLEndpointNotValidException(endpoint);
3937
return new SQLConnectionBuilder(endpoint);
4038
}
4139

@@ -53,9 +51,7 @@ public SQLConnectionBuilder(@NotNull String address, int port, @NotNull String d
5351

5452
public SQLConnectionBuilder(@Nullable SQLEndpoint endpoint) {
5553
this.endpoint = endpoint;
56-
this.jdbc = endpoint != null
57-
? endpoint.buildJdbc()
58-
: null;
54+
this.jdbc = endpoint != null ? endpoint.buildJdbc() : null;
5955
}
6056

6157
public @NotNull SQLConnectionBuilder withEndpoint(final SQLEndpoint endpoint) {
@@ -65,10 +61,7 @@ public SQLConnectionBuilder(@Nullable SQLEndpoint endpoint) {
6561
}
6662

6763
public @NotNull SQLConnectionBuilder withParam(final @NotNull String key, final @NotNull String value) {
68-
if (endpoint != null) {
69-
jdbc += (jdbc.contains("?") ? "&" : "?");
70-
jdbc += key + "=" + value;
71-
}
64+
if (endpoint != null) jdbc += (jdbc.contains("?") ? "&" : "?") + (key + "=" + value);
7265
return this;
7366
}
7467

@@ -92,11 +85,13 @@ public SQLConnectionBuilder(@Nullable SQLEndpoint endpoint) {
9285
driver = Constants.DEFAULT_DRIVER;
9386
}
9487
SQLConnectionFactory connectionFactory = new BuilderSQLConnectionFactory(this, driver);
95-
if(jdbc.contains("jdbc:sqlite")) {
96-
return new SQLiteDatabaseConnectionImpl(connectionFactory, options);
97-
} else {
98-
return new SQLDatabaseConnectionImpl(connectionFactory, options);
99-
}
88+
return jdbc.contains("jdbc:sqlite")
89+
? new SQLiteDatabaseConnectionImpl(connectionFactory, options)
90+
: new SQLDatabaseConnectionImpl(connectionFactory, options);
91+
}
92+
93+
public @NotNull SQLConnectionPool createPool(final @NotNull SQLConnectionPool.Options options) {
94+
return new SQLConnectionPool(this, options);
10095
}
10196

10297
@Override

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

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

33
import lombok.AllArgsConstructor;
4+
import lombok.Data;
45
import lombok.Getter;
56
import me.zort.sqllib.api.Query;
67
import me.zort.sqllib.api.SQLConnection;
@@ -12,6 +13,8 @@
1213
import me.zort.sqllib.internal.impl.QueryResultImpl;
1314
import me.zort.sqllib.internal.query.*;
1415
import me.zort.sqllib.internal.query.part.SetStatement;
16+
import me.zort.sqllib.transaction.Transaction;
17+
import org.jetbrains.annotations.ApiStatus;
1518
import org.jetbrains.annotations.NotNull;
1619
import org.jetbrains.annotations.Nullable;
1720

@@ -41,6 +44,12 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto
4144
SQLConnectionRegistry.register(this);
4245
}
4346

47+
/**
48+
* @deprecated Use {@link SQLDatabaseConnection#createProxy(Class)} instead.
49+
*/
50+
@Deprecated
51+
public abstract <T> T createGate(Class<T> mappingInterface);
52+
4453
/**
4554
* Constructs a mapping repository based on provided interface.
4655
* The interface should follow rules for creating mapping repositories
@@ -72,8 +81,8 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto
7281
* @return Mapping repository.
7382
* @param <T> Type of mapping repository.
7483
*/
75-
public abstract <T> T createGate(Class<T> mappingInterface);
76-
public abstract <T> T createGate(Class<T> mappingInterface, @NotNull StatementMappingOptions options);
84+
public abstract <T> T createProxy(Class<T> mappingInterface);
85+
public abstract <T> T createProxy(Class<T> mappingInterface, @NotNull StatementMappingOptions options);
7786
public abstract boolean buildEntitySchema(String tableName, Class<?> entityClass);
7887

7988
/**
@@ -112,27 +121,21 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto
112121
*/
113122
public abstract QueryResult exec(Query query);
114123
public abstract QueryResult exec(String query);
124+
@ApiStatus.Experimental
125+
public abstract Transaction beginTransaction();
126+
@ApiStatus.Experimental
127+
public abstract void closeTransaction();
128+
@ApiStatus.Experimental
129+
@Nullable
130+
public abstract Transaction getTransaction();
131+
public abstract boolean isTransactionActive();
115132
protected abstract DefsVals buildDefsVals(Object obj);
116133
public abstract boolean isLogSqlErrors();
117134
public abstract boolean isDebug();
118135

119-
/**
120-
* Saves this mapping object into database using upsert query.
121-
* <p>
122-
* All mapping strategies are described in:
123-
* {@link SQLDatabaseConnection#query(Query, Class)}.
124-
*
125-
* @param table Table to save into.
126-
* @param obj The object to save.
127-
* @return Result of the query.
128-
*/
129-
// by default, it creates and upsert request.
130-
public QueryResult save(final @NotNull String table, final @NotNull Object obj) {
131-
DefsVals defsVals = buildDefsVals(obj);
132-
133-
if(defsVals == null) return new QueryResultImpl(false);
134-
135-
return save(obj).table(table).execute();
136+
public UpsertQuery save(final @NotNull String table, final @NotNull Object obj) {
137+
if(buildDefsVals(obj) == null) throw new IllegalArgumentException("Cannot create save query! (defsVals == null)");
138+
return save(obj).table(table);
136139
}
137140

138141
public UpsertQuery save(final @NotNull Object obj) {
@@ -240,4 +243,10 @@ protected static class DefsVals {
240243
private final String[] defs;
241244
private final SQLDatabaseConnectionImpl.UnknownValueWrapper[] vals;
242245
}
246+
247+
@AllArgsConstructor
248+
@Data
249+
public static class UnknownValueWrapper {
250+
private Object object;
251+
}
243252
}

0 commit comments

Comments
 (0)