Skip to content

Commit 35c4dfc

Browse files
committed
Transaction module restructure
1 parent 44c196c commit 35c4dfc

7 files changed

Lines changed: 72 additions & 88 deletions

File tree

asql-api/src/main/java/me/zort/sqllib/internal/annotation/LinkedOne.java

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

3+
import org.jetbrains.annotations.ApiStatus;
4+
35
import java.lang.annotation.ElementType;
46
import java.lang.annotation.Retention;
57
import java.lang.annotation.RetentionPolicy;
@@ -25,6 +27,7 @@
2527
*
2628
* @author ZorTik
2729
*/
30+
@ApiStatus.Experimental
2831
@Retention(RetentionPolicy.RUNTIME)
2932
@Target(ElementType.FIELD)
3033
public @interface LinkedOne {

asql-core/src/main/java/me/zort/sqllib/transaction/FlowResult.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

asql-core/src/main/java/me/zort/sqllib/transaction/FlowStep.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

asql-core/src/main/java/me/zort/sqllib/transaction/Transaction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public TransactionFlow.Builder flow() {
2929
return new TransactionFlow.Builder(this);
3030
}
3131

32-
public TransactionFlow flow(final FlowStep[] steps, final TransactionFlow.Options options) {
32+
public TransactionFlow flow(final TransactionFlow.Step[] steps, final TransactionFlow.Options options) {
3333
verify();
3434
return new TransactionFlow(this, steps, options);
3535
}

asql-core/src/main/java/me/zort/sqllib/transaction/TransactionFlow.java

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package me.zort.sqllib.transaction;
22

33
import lombok.*;
4+
import me.zort.sqllib.SQLDatabaseConnection;
5+
import me.zort.sqllib.api.Query;
46
import me.zort.sqllib.api.data.QueryResult;
7+
import me.zort.sqllib.api.data.QueryRowsResult;
58
import me.zort.sqllib.internal.query.QueryNode;
6-
import me.zort.sqllib.transaction.step.FlowStepImpl;
79
import me.zort.sqllib.util.Arrays;
810
import org.jetbrains.annotations.NotNull;
911

@@ -13,32 +15,32 @@
1315
public class TransactionFlow {
1416

1517
private final Transaction transaction;
16-
private final FlowStep[] steps;
18+
private final Step[] steps;
1719
private final Options options;
1820
private boolean executed = false;
1921
private int index = -1;
2022

21-
public FlowResult execute() {
23+
public Result execute() {
2224
return executeNext(steps.length);
2325
}
2426

2527
@SneakyThrows(SQLException.class)
26-
public FlowResult executeNext(int count) {
28+
public Result executeNext(int count) {
2729
if (executed) throw new IllegalStateException("TransactionFlow already fully executed!");
2830

2931
QueryResult[] results = new QueryResult[steps.length];
3032
int maxIndex = index + count;
3133
int lastIndex = index;
3234
for (int i = 0; i <= maxIndex; i++) {
33-
FlowStep.Status status = steps[i].execute(transaction.getDatabaseConnection());
34-
if (status.equals(FlowStep.Status.BREAK)) {
35+
Step.Status status = steps[i].execute(transaction.getDatabaseConnection());
36+
if (status.equals(Step.Status.BREAK)) {
3537
if (options.rollbackOnFailure) {
3638
transaction.rollback();
3739
index = -1;
3840
}
3941
break;
4042
}
41-
results[i] = status.equals(FlowStep.Status.SUCCESS) ? steps[i].getResult() : null;
43+
results[i] = status.equals(Step.Status.SUCCESS) ? steps[i].getResult() : null;
4244
lastIndex = i;
4345
}
4446
boolean success = true;
@@ -48,9 +50,9 @@ public FlowResult executeNext(int count) {
4850
results[++lastIndex] = null;
4951
}
5052

51-
FlowResult result = success
52-
? new FlowResult(true)
53-
: new FlowResult(false,
53+
Result result = success
54+
? new Result(true)
55+
: new Result(false,
5456
String.format("Transaction failed at step %d!", lastIndexFinal + 1));
5557

5658
result.addAll(java.util.Arrays.asList(results));
@@ -76,7 +78,7 @@ private void close() {
7678
public static final class Builder {
7779
private final Transaction transaction;
7880
private final Options options;
79-
private FlowStep[] steps = new FlowStep[0];
81+
private Step[] steps = new Step[0];
8082

8183
public Builder(Transaction transaction) {
8284
this.transaction = transaction;
@@ -88,10 +90,10 @@ public Builder(Transaction transaction) {
8890
}
8991

9092
public @NotNull Builder step(final @NotNull QueryNode<?> node, boolean optional) {
91-
return step(new FlowStepImpl(node, optional));
93+
return step(new StepImpl(node, optional));
9294
}
9395

94-
public @NotNull Builder step(final @NotNull FlowStep step) {
96+
public @NotNull Builder step(final @NotNull TransactionFlow.Step step) {
9597
steps = Arrays.add(steps, step);
9698
return this;
9799
}
@@ -124,4 +126,55 @@ public static final class Options {
124126
private boolean autoClose = true;
125127
}
126128

129+
public static final class Result extends QueryRowsResult<QueryResult> {
130+
@Setter(AccessLevel.PROTECTED)
131+
@Getter
132+
private int brokenIndex = -1;
133+
134+
public Result(final boolean successful) {
135+
super(successful);
136+
}
137+
138+
public Result(final boolean successful, String rejectMessage) {
139+
super(successful, rejectMessage);
140+
}
141+
142+
}
143+
144+
@RequiredArgsConstructor
145+
private static class StepImpl implements Step {
146+
private final Query query;
147+
@Getter
148+
private final boolean optional;
149+
@Getter
150+
private QueryResult result = null;
151+
152+
@Override
153+
public Status execute(SQLDatabaseConnection connection) {
154+
if (!(query instanceof QueryNode)) throw new IllegalStateException("FlowStepImpl accepts only QueryNode!");
155+
156+
QueryNode<?> node = (QueryNode<?>) query;
157+
node = node.getAncestor();
158+
QueryResult localResult = node.generatesResultSet()
159+
? connection.query(node)
160+
: connection.exec(node);
161+
162+
if (localResult.isSuccessful()) result = localResult;
163+
return localResult.isSuccessful() ? Status.SUCCESS : (optional ? Status.CONTINUE : Status.BREAK);
164+
}
165+
}
166+
167+
public interface Step {
168+
169+
Status execute(SQLDatabaseConnection connection);
170+
171+
QueryResult getResult(); // Result if the #execute returned SUCCESS, otherwise null
172+
173+
boolean isOptional();
174+
175+
enum Status {
176+
SUCCESS, BREAK, CONTINUE
177+
}
178+
179+
}
127180
}

asql-core/src/main/java/me/zort/sqllib/transaction/step/FlowStepImpl.java

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/test/java/me/zort/sqllib/test/TestCase1.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import me.zort.sqllib.api.data.Row;
1414
import me.zort.sqllib.api.provider.Select;
1515
import me.zort.sqllib.internal.impl.DefaultSQLEndpoint;
16-
import me.zort.sqllib.transaction.FlowResult;
16+
import me.zort.sqllib.transaction.TransactionFlow;
1717
import org.apache.logging.log4j.Level;
1818
import org.apache.logging.log4j.core.config.Configurator;
1919
import org.junit.jupiter.api.*;
@@ -181,7 +181,7 @@ public void test6_Pool() {
181181

182182
@Test
183183
public void test6_Transactions() {
184-
FlowResult result1 = connection.beginTransaction()
184+
TransactionFlow.Result result1 = connection.beginTransaction()
185185
.flow()
186186
.step(connection.save(table, user1))
187187
.step(connection.select()

0 commit comments

Comments
 (0)