Skip to content

Commit 96e5ce2

Browse files
committed
Fix nullability issue in GDSHelper, and reduce code duplication
1 parent 699318b commit 96e5ce2

6 files changed

Lines changed: 55 additions & 16 deletions

File tree

src/main/org/firebirdsql/gds/impl/GDSHelper.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.regex.Pattern;
1717

1818
import static java.util.Objects.requireNonNull;
19+
import static org.firebirdsql.gds.ISCConstants.isc_segstr_no_trans;
1920
import static org.firebirdsql.jaybird.props.PropertyConstants.SESSION_TIME_ZONE_SERVER;
2021

2122
/**
@@ -43,6 +44,11 @@ public GDSHelper(FbDatabase database) {
4344
}
4445
}
4546

47+
private FbTransaction requireActiveTransaction(@SuppressWarnings("SameParameterValue") int errorCode)
48+
throws SQLException {
49+
return TransactionHelper.requireActiveTransaction(getCurrentTransaction(), errorCode);
50+
}
51+
4652
public void clearCurrentTransaction() {
4753
setCurrentTransactionImpl(null);
4854
}
@@ -118,7 +124,7 @@ public void executeImmediate(String statement) throws SQLException {
118124
*/
119125
@SuppressWarnings("java:S2095")
120126
public FbBlob openBlob(long blobId, BlobConfig blobConfig) throws SQLException {
121-
FbBlob blob = database.createBlobForInput(getCurrentTransaction(), blobConfig, blobId);
127+
FbBlob blob = database.createBlobForInput(requireActiveTransaction(isc_segstr_no_trans), blobConfig, blobId);
122128
blob.open();
123129
return blob;
124130
}
@@ -133,7 +139,7 @@ public FbBlob openBlob(long blobId, BlobConfig blobConfig) throws SQLException {
133139
*/
134140
@SuppressWarnings("java:S2095")
135141
public FbBlob createBlob(BlobConfig blobConfig) throws SQLException {
136-
FbBlob blob = database.createBlobForOutput(getCurrentTransaction(), blobConfig);
142+
FbBlob blob = database.createBlobForOutput(requireActiveTransaction(isc_segstr_no_trans), blobConfig);
137143
blob.open();
138144
return blob;
139145
}

src/main/org/firebirdsql/gds/ng/AbstractFbBlob.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,7 @@ protected void checkBlobClosed() throws SQLException {
428428
* @since 7
429429
*/
430430
protected FbTransaction requireActiveTransaction() throws SQLException {
431-
FbTransaction transaction = getTransaction();
432-
TransactionHelper.checkTransactionActive(transaction, ISCConstants.isc_segstr_no_trans);
433-
return transaction;
431+
return TransactionHelper.requireActiveTransaction(getTransaction(), ISCConstants.isc_segstr_no_trans);
434432
}
435433

436434
protected final void clearTransaction() {

src/main/org/firebirdsql/gds/ng/AbstractFbStatement.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -761,9 +761,7 @@ protected final void checkStatementHasOpenCursor() throws SQLException {
761761
* @since 7
762762
*/
763763
protected FbTransaction requireActiveTransaction() throws SQLException {
764-
FbTransaction transaction = getTransaction();
765-
TransactionHelper.checkTransactionActive(transaction);
766-
return transaction;
764+
return TransactionHelper.requireActiveTransaction(getTransaction());
767765
}
768766

769767
/**

src/main/org/firebirdsql/gds/ng/TransactionHelper.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ private TransactionHelper() {
2626
* transaction to check
2727
* @throws SQLException
2828
* when {@code transaction} is {@code null}, or its state is not active
29+
* @see #requireActiveTransaction(FbTransaction)
2930
*/
3031
public static void checkTransactionActive(@Nullable FbTransaction transaction) throws SQLException {
3132
checkTransactionActive(transaction, JaybirdErrorCodes.jb_noActiveTransaction);
@@ -40,13 +41,47 @@ public static void checkTransactionActive(@Nullable FbTransaction transaction) t
4041
* Firebird error code to use for generating the exception message
4142
* @throws SQLException
4243
* when {@code transaction} is {@code null}, or its state is not active
44+
* @see #requireActiveTransaction(FbTransaction, int)
4345
*/
44-
public static void checkTransactionActive(@Nullable FbTransaction transaction, final int fbErrorCode) throws SQLException {
46+
public static void checkTransactionActive(@Nullable FbTransaction transaction, int fbErrorCode)
47+
throws SQLException {
4548
if (transaction == null || transaction.getState() != TransactionState.ACTIVE) {
4649
throw FbExceptionBuilder.toNonTransientException(fbErrorCode);
4750
}
4851
}
4952

53+
/**
54+
* Checks if the transaction is {@link TransactionState#ACTIVE} and returns it.
55+
*
56+
* @param transaction
57+
* transaction to check
58+
* @return {@code transaction} if it's active
59+
* @throws SQLException
60+
* when {@code transaction} is {@code null}, or its state is not active
61+
* @see #checkTransactionActive(FbTransaction)
62+
*/
63+
public static <T extends FbTransaction> T requireActiveTransaction(@Nullable T transaction) throws SQLException {
64+
return requireActiveTransaction(transaction, JaybirdErrorCodes.jb_noActiveTransaction);
65+
}
66+
67+
/**
68+
* Checks if the transaction is {@link TransactionState#ACTIVE} and returns it.
69+
*
70+
* @param transaction
71+
* transaction to check
72+
* @param fbErrorCode
73+
* Firebird error code to use for generating the exception message
74+
* @return {@code transaction} if it's active
75+
* @throws SQLException
76+
* when {@code transaction} is {@code null}, or its state is not active
77+
* @see #checkTransactionActive(FbTransaction, int)
78+
*/
79+
public static <T extends FbTransaction> T requireActiveTransaction(@Nullable T transaction, int fbErrorCode)
80+
throws SQLException {
81+
checkTransactionActive(transaction, fbErrorCode);
82+
return transaction;
83+
}
84+
5085
/**
5186
* Checks if the transaction is ending (meaning its state is {@link TransactionState#COMMITTING},
5287
* {@link TransactionState#ROLLING_BACK} or {@link TransactionState#PREPARING}).

src/main/org/firebirdsql/gds/ng/wire/version10/V10Database.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import static org.firebirdsql.gds.JaybirdErrorCodes.jb_executeImmediateRequiresNoTransactionDetached;
2424
import static org.firebirdsql.gds.JaybirdErrorCodes.jb_executeImmediateRequiresTransactionAttached;
25+
import static org.firebirdsql.gds.JaybirdErrorCodes.jb_invalidTransactionHandleType;
2526
import static org.firebirdsql.gds.impl.wire.WireProtocolConstants.*;
2627
import static org.firebirdsql.gds.ng.TransactionHelper.checkTransactionActive;
2728

@@ -415,6 +416,10 @@ public final void executeImmediate(String statementText, @Nullable FbTransaction
415416
if (isAttached()) {
416417
if (transaction == null) {
417418
throw FbExceptionBuilder.toException(jb_executeImmediateRequiresTransactionAttached);
419+
} else if (!(transaction instanceof FbWireTransaction)) {
420+
throw FbExceptionBuilder.forNonTransientException(jb_invalidTransactionHandleType)
421+
.messageParameter(transaction.getClass())
422+
.toSQLException();
418423
}
419424
checkTransactionActive(transaction);
420425
} else if (transaction != null) {

src/main/org/firebirdsql/gds/ng/wire/version16/V16Statement.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.firebirdsql.gds.ng.DeferredResponse;
1212
import org.firebirdsql.gds.ng.FbBatchConfig;
1313
import org.firebirdsql.gds.ng.FbExceptionBuilder;
14-
import org.firebirdsql.gds.ng.FbTransaction;
1514
import org.firebirdsql.gds.ng.LockCloseable;
1615
import org.firebirdsql.gds.ng.StatementState;
1716
import org.firebirdsql.gds.ng.fields.BlrCalculator;
@@ -21,6 +20,7 @@
2120
import org.firebirdsql.gds.ng.wire.BatchCompletionResponse;
2221
import org.firebirdsql.gds.ng.wire.DeferredAction;
2322
import org.firebirdsql.gds.ng.wire.FbWireDatabase;
23+
import org.firebirdsql.gds.ng.wire.FbWireTransaction;
2424
import org.firebirdsql.gds.ng.wire.Response;
2525
import org.firebirdsql.gds.ng.wire.version13.V13Statement;
2626
import org.firebirdsql.jaybird.util.CollectionUtils;
@@ -37,7 +37,6 @@
3737

3838
import static org.firebirdsql.gds.impl.wire.WireProtocolConstants.op_batch_cancel;
3939
import static org.firebirdsql.gds.impl.wire.WireProtocolConstants.op_batch_rls;
40-
import static org.firebirdsql.gds.ng.TransactionHelper.checkTransactionActive;
4140

4241
/**
4342
* @author Mark Rotteveel
@@ -271,17 +270,15 @@ private int[] blobPositions(RowDescriptor parameterDescriptor) {
271270
public BatchCompletion batchExecute() throws SQLException {
272271
try (LockCloseable ignored = withLock()) {
273272
checkStatementValid();
274-
FbTransaction transaction = getTransaction();
275-
checkTransactionActive(transaction);
276-
sendBatchExec(transaction);
273+
sendBatchExec(requireActiveTransaction());
277274
return receiveBatchExecResponse();
278275
} catch (SQLException e) {
279276
exceptionListenerDispatcher.errorOccurred(e);
280277
throw e;
281278
}
282279
}
283280

284-
private void sendBatchExec(FbTransaction transaction) throws SQLException {
281+
private void sendBatchExec(FbWireTransaction transaction) throws SQLException {
285282
try {
286283
withTransmitLock(xdrOut -> {
287284
sendBatchExecMsg(xdrOut, transaction);
@@ -307,7 +304,7 @@ private void sendBatchExec(FbTransaction transaction) throws SQLException {
307304
* for errors writing to the output stream
308305
* @since 7
309306
*/
310-
protected void sendBatchExecMsg(XdrOutputStream xdrOut, FbTransaction transaction) throws IOException {
307+
protected void sendBatchExecMsg(XdrOutputStream xdrOut, FbWireTransaction transaction) throws IOException {
311308
xdrOut.writeInt(WireProtocolConstants.op_batch_exec);
312309
xdrOut.writeInt(getHandle());
313310
xdrOut.writeInt(transaction.getHandle());

0 commit comments

Comments
 (0)