Skip to content

Commit 048b200

Browse files
committed
Add isc_dpb/spb_utf8_filename to DPB/SPB for native
1 parent 4aada2c commit 048b200

File tree

7 files changed

+81
-30
lines changed

7 files changed

+81
-30
lines changed

jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaConnection.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.nio.ByteOrder;
1414
import java.sql.SQLException;
1515
import java.sql.SQLWarning;
16+
import java.util.Set;
1617

1718
import static java.lang.System.Logger.Level.WARNING;
1819
import static java.util.Objects.requireNonNull;
@@ -29,7 +30,7 @@
2930
* @since 3.0
3031
*/
3132
public abstract class JnaConnection<T extends IAttachProperties<T>, C extends JnaAttachment>
32-
extends AbstractConnection<T, C> {
33+
extends AbstractConnection<T, C> implements FbClientFeatureAccess {
3334

3435
private static final boolean BIG_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
3536

@@ -53,6 +54,18 @@ protected JnaConnection(FbClientLibrary clientLibrary, T attachProperties, IEnco
5354
this.attachUrl = createAttachUrl(toDbAttachInfo(attachProperties), attachProperties);
5455
}
5556

57+
@Override
58+
public final boolean hasFeature(FbClientFeature clientFeature) {
59+
return getFeatures().contains(clientFeature);
60+
}
61+
62+
@Override
63+
public final Set<FbClientFeature> getFeatures() {
64+
return clientLibrary instanceof FbClientFeatureAccess clientFeatureAccess
65+
? clientFeatureAccess.getFeatures()
66+
: Set.of();
67+
}
68+
5669
private DbAttachInfo toDbAttachInfo(T attachProperties) throws SQLException {
5770
DbAttachInfo initialDbAttachInfo = DbAttachInfo.of(attachProperties);
5871

jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaDatabase.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55

66
import com.sun.jna.Platform;
77
import com.sun.jna.ptr.IntByReference;
8+
import org.firebirdsql.encodings.Encoding;
89
import org.firebirdsql.gds.*;
910
import org.firebirdsql.gds.ng.*;
1011
import org.firebirdsql.gds.ng.listeners.TransactionListener;
12+
import org.firebirdsql.jaybird.fb.constants.DpbItems;
1113
import org.firebirdsql.jaybird.util.Cleaners;
1214
import org.firebirdsql.jdbc.FBDriverNotCapableException;
1315
import org.firebirdsql.jna.fbclient.FbClientLibrary;
@@ -20,7 +22,6 @@
2022
import java.sql.SQLException;
2123
import java.util.Set;
2224

23-
import static java.util.Collections.emptySet;
2425
import static org.firebirdsql.gds.ISCConstants.fb_cancel_abort;
2526
import static org.firebirdsql.gds.JaybirdErrorCodes.jb_executeImmediateRequiresNoTransactionDetached;
2627
import static org.firebirdsql.gds.JaybirdErrorCodes.jb_executeImmediateRequiresTransactionAttached;
@@ -41,17 +42,13 @@ public class JnaDatabase extends AbstractFbDatabase<JnaDatabaseConnection>
4142
public static final int MAX_STATEMENT_LENGTH = 64 * 1024;
4243

4344
private final FbClientLibrary clientLibrary;
44-
private final Set<FbClientFeature> clientFeatures;
4545
protected final IntByReference handle = new IntByReference(0);
4646
protected final ISC_STATUS[] statusVector = new ISC_STATUS[STATUS_VECTOR_SIZE];
4747
private Cleaner.Cleanable cleanable = Cleaners.getNoOp();
4848

4949
public JnaDatabase(JnaDatabaseConnection connection) {
5050
super(connection, connection.createDatatypeCoder());
5151
clientLibrary = connection.getClientLibrary();
52-
clientFeatures = clientLibrary instanceof FbClientFeatureAccess featureAccess
53-
? featureAccess.getFeatures()
54-
: emptySet();
5552
}
5653

5754
/**
@@ -114,7 +111,11 @@ public void attach() throws SQLException {
114111

115112
protected void attachOrCreate(final DatabaseParameterBuffer dpb, final boolean create) throws SQLException {
116113
requireNotAttached();
117-
final byte[] dbName = getEncoding().encodeToCharset(connection.getAttachUrl());
114+
Encoding dbNameEncoding = dpb.hasArgument(DpbItems.isc_dpb_utf8_filename)
115+
? getEncodingFactory().getEncodingForFirebirdName("UTF8")
116+
: getEncoding();
117+
118+
final byte[] dbName = dbNameEncoding.encodeToCharset(connection.getAttachUrl());
118119
final byte[] dpbArray = dpb.toBytesWithType();
119120

120121
try (LockCloseable ignored = withLock()) {
@@ -484,13 +485,13 @@ public void processStatusVector(ISC_STATUS[] statusVector, @Nullable WarningMess
484485
}
485486

486487
@Override
487-
public boolean hasFeature(FbClientFeature clientFeature) {
488-
return clientFeatures.contains(clientFeature);
488+
public final boolean hasFeature(FbClientFeature clientFeature) {
489+
return connection.hasFeature(clientFeature);
489490
}
490491

491492
@Override
492-
public Set<FbClientFeature> getFeatures() {
493-
return clientFeatures;
493+
public final Set<FbClientFeature> getFeatures() {
494+
return connection.getFeatures();
494495
}
495496

496497
private record CleanupAction(IntByReference handle, FbClientLibrary library) implements Runnable {

jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaParameterConverter.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,21 @@
22
// SPDX-License-Identifier: LGPL-2.1-or-later
33
package org.firebirdsql.gds.ng.jna;
44

5+
import org.firebirdsql.encodings.Encoding;
56
import org.firebirdsql.gds.ConnectionParameterBuffer;
7+
import org.firebirdsql.gds.DatabaseParameterBuffer;
68
import org.firebirdsql.gds.ParameterTagMapping;
9+
import org.firebirdsql.gds.ServiceParameterBuffer;
10+
import org.firebirdsql.gds.impl.DatabaseParameterBufferImp;
11+
import org.firebirdsql.gds.impl.DatabaseParameterBufferImp.DpbMetaData;
12+
import org.firebirdsql.gds.impl.ServiceParameterBufferImp;
13+
import org.firebirdsql.gds.impl.ServiceParameterBufferImp.SpbMetaData;
714
import org.firebirdsql.gds.ng.AbstractConnection;
815
import org.firebirdsql.gds.ng.AbstractParameterConverter;
916
import org.firebirdsql.gds.ng.IAttachProperties;
1017
import org.firebirdsql.gds.ng.WireCrypt;
18+
import org.firebirdsql.jaybird.fb.constants.DpbItems;
19+
import org.firebirdsql.jaybird.fb.constants.SpbItems;
1120

1221
import java.sql.SQLException;
1322
import java.util.HashMap;
@@ -23,6 +32,28 @@
2332
*/
2433
public class JnaParameterConverter extends AbstractParameterConverter<JnaDatabaseConnection, JnaServiceConnection> {
2534

35+
@Override
36+
protected DatabaseParameterBuffer createDatabaseParameterBuffer(JnaDatabaseConnection connection) {
37+
if (supportsUtf8ParameterBuffer(connection)) {
38+
Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
39+
var dpb = new DatabaseParameterBufferImp(DpbMetaData.DPB_VERSION_1, stringEncoding);
40+
dpb.addArgument(DpbItems.isc_dpb_utf8_filename);
41+
return dpb;
42+
}
43+
return super.createDatabaseParameterBuffer(connection);
44+
}
45+
46+
@Override
47+
protected ServiceParameterBuffer createServiceParameterBuffer(JnaServiceConnection connection) {
48+
if (supportsUtf8ParameterBuffer(connection)) {
49+
Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
50+
var spb = new ServiceParameterBufferImp(SpbMetaData.SPB_VERSION_2_ATTACH, stringEncoding);
51+
spb.addArgument(SpbItems.isc_spb_utf8_filename);
52+
return spb;
53+
}
54+
return super.createServiceParameterBuffer(connection);
55+
}
56+
2657
@Override
2758
protected void populateAuthenticationProperties(final AbstractConnection<?, ?> connection,
2859
final ConnectionParameterBuffer pb) throws SQLException {
@@ -62,4 +93,10 @@ private String buildConfigString(Map<String, String> configMap) {
6293
}
6394
return builder.toString();
6495
}
96+
97+
private static boolean supportsUtf8ParameterBuffer(JnaConnection<?, ?> connection) {
98+
// Indicates this is a Firebird 3.0 or higher client library
99+
return connection.hasFeature(FbClientFeature.FB_PING);
100+
}
101+
65102
}

src/docs/asciidoc/release_notes.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@ Methods to obtain the ciphers are only available in the `Success` subclass, the
883883
884884
The following changes might cause issues, though we think this is unlikely:
885885
886-
// TODO Document unlikely breaking changes, or comment out this section
886+
* Native connections now use `isc_dpb_utf8_filename` or `isc_spb_utf8_filename` and UTF-8 for the database and service parameter buffer during attach _if_ the client is Firebird 3.0 or higher.
887887
888888
[#breaking-changes-for-jaybird-8]
889889
=== Breaking changes for Jaybird 8

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
// SPDX-FileCopyrightText: Copyright 2014-2024 Mark Rotteveel
1+
// SPDX-FileCopyrightText: Copyright 2014-2026 Mark Rotteveel
22
// SPDX-FileCopyrightText: Copyright 2015 Hajime Nakagami
33
// SPDX-License-Identifier: LGPL-2.1-or-later
44
package org.firebirdsql.gds.ng;
55

66
import org.firebirdsql.gds.*;
77
import org.firebirdsql.gds.impl.DatabaseParameterBufferImp;
8+
import org.firebirdsql.gds.impl.DatabaseParameterBufferImp.DpbMetaData;
89
import org.firebirdsql.gds.impl.ServiceParameterBufferImp;
10+
import org.firebirdsql.gds.impl.ServiceParameterBufferImp.SpbMetaData;
911
import org.firebirdsql.jaybird.props.def.ConnectionProperty;
1012
import org.firebirdsql.jaybird.props.def.ConnectionPropertyType;
1113

@@ -30,13 +32,11 @@ public abstract class AbstractParameterConverter<D extends AbstractConnection<IC
3032
implements ParameterConverter<D, S> {
3133

3234
protected DatabaseParameterBuffer createDatabaseParameterBuffer(final D connection) {
33-
return new DatabaseParameterBufferImp(DatabaseParameterBufferImp.DpbMetaData.DPB_VERSION_1,
34-
connection.getEncoding());
35+
return new DatabaseParameterBufferImp(DpbMetaData.DPB_VERSION_1, connection.getEncoding());
3536
}
3637

3738
protected ServiceParameterBuffer createServiceParameterBuffer(final S connection) {
38-
return new ServiceParameterBufferImp(ServiceParameterBufferImp.SpbMetaData.SPB_VERSION_2_ATTACH,
39-
connection.getEncoding());
39+
return new ServiceParameterBufferImp(SpbMetaData.SPB_VERSION_2_ATTACH, connection.getEncoding());
4040
}
4141

4242
@Override

src/main/org/firebirdsql/gds/ng/wire/version12/V12ParameterConverter.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
// SPDX-FileCopyrightText: Copyright 2014-2024 Mark Rotteveel
1+
// SPDX-FileCopyrightText: Copyright 2014-2026 Mark Rotteveel
22
// SPDX-License-Identifier: LGPL-2.1-or-later
33
package org.firebirdsql.gds.ng.wire.version12;
44

55
import org.firebirdsql.encodings.Encoding;
66
import org.firebirdsql.gds.DatabaseParameterBuffer;
7+
import org.firebirdsql.gds.impl.DatabaseParameterBufferImp.DpbMetaData;
8+
import org.firebirdsql.gds.impl.ServiceParameterBufferImp.SpbMetaData;
79
import org.firebirdsql.jaybird.fb.constants.DpbItems;
810
import org.firebirdsql.gds.ServiceParameterBuffer;
911
import org.firebirdsql.jaybird.fb.constants.SpbItems;
@@ -26,18 +28,16 @@ public class V12ParameterConverter extends V11ParameterConverter {
2628

2729
@Override
2830
protected DatabaseParameterBuffer createDatabaseParameterBuffer(WireDatabaseConnection connection) {
29-
final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
30-
DatabaseParameterBuffer dpb =
31-
new DatabaseParameterBufferImp(DatabaseParameterBufferImp.DpbMetaData.DPB_VERSION_1, stringEncoding);
31+
Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
32+
var dpb = new DatabaseParameterBufferImp(DpbMetaData.DPB_VERSION_1, stringEncoding);
3233
dpb.addArgument(DpbItems.isc_dpb_utf8_filename);
3334
return dpb;
3435
}
3536

3637
@Override
3738
protected ServiceParameterBuffer createServiceParameterBuffer(WireServiceConnection connection) {
38-
final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
39-
ServiceParameterBuffer spb = new ServiceParameterBufferImp(
40-
ServiceParameterBufferImp.SpbMetaData.SPB_VERSION_2_ATTACH, stringEncoding);
39+
Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
40+
var spb = new ServiceParameterBufferImp(SpbMetaData.SPB_VERSION_2_ATTACH, stringEncoding);
4141
spb.addArgument(SpbItems.isc_spb_utf8_filename);
4242
return spb;
4343
}

src/main/org/firebirdsql/gds/ng/wire/version13/V13ParameterConverter.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import org.firebirdsql.encodings.Encoding;
77
import org.firebirdsql.gds.*;
88
import org.firebirdsql.gds.impl.DatabaseParameterBufferImp;
9+
import org.firebirdsql.gds.impl.DatabaseParameterBufferImp.DpbMetaData;
910
import org.firebirdsql.gds.impl.ServiceParameterBufferImp;
11+
import org.firebirdsql.gds.impl.ServiceParameterBufferImp.SpbMetaData;
1012
import org.firebirdsql.gds.ng.AbstractConnection;
1113
import org.firebirdsql.gds.ng.IAttachProperties;
1214
import org.firebirdsql.gds.ng.wire.WireConnection;
@@ -33,18 +35,16 @@ public class V13ParameterConverter extends V12ParameterConverter {
3335

3436
@Override
3537
protected DatabaseParameterBuffer createDatabaseParameterBuffer(WireDatabaseConnection connection) {
36-
final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
37-
DatabaseParameterBuffer dpb =
38-
new DatabaseParameterBufferImp(DatabaseParameterBufferImp.DpbMetaData.DPB_VERSION_2, stringEncoding);
38+
Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
39+
var dpb = new DatabaseParameterBufferImp(DpbMetaData.DPB_VERSION_2, stringEncoding);
3940
dpb.addArgument(DpbItems.isc_dpb_utf8_filename);
4041
return dpb;
4142
}
4243

4344
@Override
4445
protected ServiceParameterBuffer createServiceParameterBuffer(WireServiceConnection connection) {
45-
final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
46-
ServiceParameterBuffer spb = new ServiceParameterBufferImp(
47-
ServiceParameterBufferImp.SpbMetaData.SPB_VERSION_3_ATTACH, stringEncoding);
46+
Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
47+
var spb = new ServiceParameterBufferImp(SpbMetaData.SPB_VERSION_3_ATTACH, stringEncoding);
4848
spb.addArgument(SpbItems.isc_spb_utf8_filename);
4949
return spb;
5050
}

0 commit comments

Comments
 (0)