├── .gitignore
├── .travis.yml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── codecov.yml
├── intellij-style.xml
├── licenseheader.txt
├── pom.xml
└── src
├── benchmark
├── README.md
├── java
│ └── org
│ │ └── mariadb
│ │ └── r2dbc
│ │ ├── Common.java
│ │ ├── Do_1.java
│ │ ├── Do_1000_param.java
│ │ ├── Insert_batch.java
│ │ ├── Select_1.java
│ │ ├── Select_1000_Rows.java
│ │ └── Select_100_cols.java
└── resources
│ └── logback-test.xml
├── main
├── java
│ └── org
│ │ └── mariadb
│ │ └── r2dbc
│ │ ├── ExceptionFactory.java
│ │ ├── HaMode.java
│ │ ├── MariadbBatch.java
│ │ ├── MariadbClientParameterizedQueryStatement.java
│ │ ├── MariadbCommonStatement.java
│ │ ├── MariadbConnection.java
│ │ ├── MariadbConnectionConfiguration.java
│ │ ├── MariadbConnectionFactory.java
│ │ ├── MariadbConnectionFactoryMetadata.java
│ │ ├── MariadbConnectionFactoryProvider.java
│ │ ├── MariadbConnectionMetadata.java
│ │ ├── MariadbServerParameterizedQueryStatement.java
│ │ ├── MariadbTransactionDefinition.java
│ │ ├── MariadbUpdateCount.java
│ │ ├── SslMode.java
│ │ ├── api
│ │ ├── MariadbBatch.java
│ │ ├── MariadbConnection.java
│ │ ├── MariadbConnectionMetadata.java
│ │ ├── MariadbOutParameters.java
│ │ ├── MariadbOutSegment.java
│ │ ├── MariadbResult.java
│ │ ├── MariadbRow.java
│ │ └── MariadbStatement.java
│ │ ├── authentication
│ │ ├── AuthenticationFlowPluginLoader.java
│ │ ├── AuthenticationPlugin.java
│ │ ├── addon
│ │ │ └── ClearPasswordPluginFlow.java
│ │ └── standard
│ │ │ ├── CachingSha2PasswordFlow.java
│ │ │ ├── Ed25519PasswordPluginFlow.java
│ │ │ ├── NativePasswordPluginFlow.java
│ │ │ ├── PamPluginFlow.java
│ │ │ ├── ParsecPasswordPlugin.java
│ │ │ ├── Sha256PasswordPluginFlow.java
│ │ │ └── ed25519
│ │ │ ├── README
│ │ │ ├── Utils.java
│ │ │ ├── math
│ │ │ ├── Constants.java
│ │ │ ├── Curve.java
│ │ │ ├── Encoding.java
│ │ │ ├── Field.java
│ │ │ ├── FieldElement.java
│ │ │ ├── GroupElement.java
│ │ │ └── ed25519
│ │ │ │ ├── Ed25519FieldElement.java
│ │ │ │ ├── Ed25519LittleEndianEncoding.java
│ │ │ │ └── ScalarOps.java
│ │ │ └── spec
│ │ │ ├── EdDSANamedCurveSpec.java
│ │ │ ├── EdDSANamedCurveTable.java
│ │ │ └── EdDSAParameterSpec.java
│ │ ├── client
│ │ ├── Client.java
│ │ ├── DecoderState.java
│ │ ├── DecoderStateInterface.java
│ │ ├── Exchange.java
│ │ ├── FailoverClient.java
│ │ ├── MariadbFrameDecoder.java
│ │ ├── MariadbOutParameters.java
│ │ ├── MariadbOutParametersMetadata.java
│ │ ├── MariadbPacketEncoder.java
│ │ ├── MariadbResult.java
│ │ ├── MariadbRow.java
│ │ ├── MariadbRowBinary.java
│ │ ├── MariadbRowMetadata.java
│ │ ├── MariadbRowText.java
│ │ ├── MariadbSegmentResult.java
│ │ ├── RedoContext.java
│ │ ├── ServerVersion.java
│ │ ├── SimpleClient.java
│ │ ├── SimpleContext.java
│ │ └── TransactionSaver.java
│ │ ├── codec
│ │ ├── Codec.java
│ │ ├── Codecs.java
│ │ ├── DataType.java
│ │ └── list
│ │ │ ├── BigDecimalCodec.java
│ │ │ ├── BigIntegerCodec.java
│ │ │ ├── BitSetCodec.java
│ │ │ ├── BlobCodec.java
│ │ │ ├── BooleanCodec.java
│ │ │ ├── ByteArrayCodec.java
│ │ │ ├── ByteBufferCodec.java
│ │ │ ├── ByteCodec.java
│ │ │ ├── ClobCodec.java
│ │ │ ├── DoubleCodec.java
│ │ │ ├── DurationCodec.java
│ │ │ ├── FloatCodec.java
│ │ │ ├── IntCodec.java
│ │ │ ├── LocalDateCodec.java
│ │ │ ├── LocalDateTimeCodec.java
│ │ │ ├── LocalTimeCodec.java
│ │ │ ├── LongCodec.java
│ │ │ ├── ShortCodec.java
│ │ │ ├── StreamCodec.java
│ │ │ ├── StringCodec.java
│ │ │ └── UuidCodec.java
│ │ ├── message
│ │ ├── AuthMoreData.java
│ │ ├── AuthSwitch.java
│ │ ├── ClientMessage.java
│ │ ├── Context.java
│ │ ├── MessageSequence.java
│ │ ├── Protocol.java
│ │ ├── ServerMessage.java
│ │ ├── client
│ │ │ ├── AuthMoreRawPacket.java
│ │ │ ├── ChangeSchemaPacket.java
│ │ │ ├── ClearPasswordPacket.java
│ │ │ ├── ClosePreparePacket.java
│ │ │ ├── Ed25519PasswordPacket.java
│ │ │ ├── ExecutePacket.java
│ │ │ ├── HandshakeResponse.java
│ │ │ ├── NativePasswordPacket.java
│ │ │ ├── ParsecAuthPacket.java
│ │ │ ├── PingPacket.java
│ │ │ ├── PreparePacket.java
│ │ │ ├── QueryPacket.java
│ │ │ ├── QueryWithParametersPacket.java
│ │ │ ├── QuitPacket.java
│ │ │ ├── RequestExtSaltPacket.java
│ │ │ ├── RsaPublicKeyRequestPacket.java
│ │ │ ├── Sha256PasswordPacket.java
│ │ │ ├── Sha2PublicKeyRequestPacket.java
│ │ │ └── SslRequestPacket.java
│ │ ├── flow
│ │ │ └── AuthenticationFlow.java
│ │ └── server
│ │ │ ├── AuthMoreDataPacket.java
│ │ │ ├── AuthSwitchPacket.java
│ │ │ ├── ColumnCountPacket.java
│ │ │ ├── ColumnDefinitionPacket.java
│ │ │ ├── CompletePrepareResult.java
│ │ │ ├── EofPacket.java
│ │ │ ├── ErrorPacket.java
│ │ │ ├── InitialHandshakePacket.java
│ │ │ ├── OkPacket.java
│ │ │ ├── PrepareResultPacket.java
│ │ │ ├── RowPacket.java
│ │ │ ├── Sequencer.java
│ │ │ └── SkipPacket.java
│ │ └── util
│ │ ├── Assert.java
│ │ ├── BindValue.java
│ │ ├── Binding.java
│ │ ├── BufferUtils.java
│ │ ├── CharsetEncodingLength.java
│ │ ├── ClientParser.java
│ │ ├── HostAddress.java
│ │ ├── LoggerHelper.java
│ │ ├── MariadbType.java
│ │ ├── PrepareCache.java
│ │ ├── PrepareResult.java
│ │ ├── Security.java
│ │ ├── ServerNamedParamParser.java
│ │ ├── ServerPrepareResult.java
│ │ ├── SslConfig.java
│ │ ├── VersionFactory.java
│ │ └── constants
│ │ ├── Capabilities.java
│ │ ├── ColumnFlags.java
│ │ ├── ServerStatus.java
│ │ └── StateChange.java
├── java9
│ └── module-info.java
└── resources
│ ├── META-INF
│ └── services
│ │ ├── io.r2dbc.spi.ConnectionFactoryProvider
│ │ └── org.mariadb.r2dbc.authentication.AuthenticationPlugin
│ └── mariadb.properties
└── test
├── java
└── org
│ └── mariadb
│ └── r2dbc
│ ├── BaseConnectionTest.java
│ ├── TestConfiguration.java
│ ├── integration
│ ├── BatchTest.java
│ ├── BigResultSetTest.java
│ ├── ConfigurationTest.java
│ ├── ConnectionMetadataTest.java
│ ├── ConnectionTest.java
│ ├── ErrorTest.java
│ ├── FailoverConnectionTest.java
│ ├── LoggingTest.java
│ ├── MariadbBinaryTestKit.java
│ ├── MariadbTextTestKit.java
│ ├── MultiQueriesTest.java
│ ├── NoPipelineTest.java
│ ├── PrepareResultSetTest.java
│ ├── ProcedureResultsetTest.java
│ ├── RedirectionTest.java
│ ├── ResultsetTest.java
│ ├── RowMetadataTest.java
│ ├── StatementBatchingTest.java
│ ├── StatementTest.java
│ ├── TlsTest.java
│ ├── TransactionTest.java
│ ├── authentication
│ │ ├── Ed25519PluginTest.java
│ │ ├── PamPluginTest.java
│ │ ├── ParsecPluginTest.java
│ │ └── Sha256PluginTest.java
│ ├── codec
│ │ ├── BigIntegerParseTest.java
│ │ ├── BitParseTest.java
│ │ ├── BlobParseTest.java
│ │ ├── DateParseTest.java
│ │ ├── DateTimeParseTest.java
│ │ ├── DecimalParseTest.java
│ │ ├── DoubleParseTest.java
│ │ ├── FloatParseTest.java
│ │ ├── IntParseTest.java
│ │ ├── JsonParseTest.java
│ │ ├── MediumIntParseTest.java
│ │ ├── ShortParseTest.java
│ │ ├── StringParseTest.java
│ │ ├── TimeParseTest.java
│ │ ├── TimestampParseTest.java
│ │ ├── TinyIntParseTest.java
│ │ ├── UuidParseTest.java
│ │ └── YearParseTest.java
│ └── parameter
│ │ ├── BigIntegerParameterTest.java
│ │ ├── BitParameterTest.java
│ │ ├── BlobParameterTest.java
│ │ ├── DateParameterTest.java
│ │ ├── DateTimeParameterTest.java
│ │ ├── DecimalParameterTest.java
│ │ ├── FloatParameterTest.java
│ │ ├── IntParameterTest.java
│ │ ├── MediumIntParameterTest.java
│ │ ├── ShortParameterTest.java
│ │ ├── StringParameterTest.java
│ │ ├── TimeParameterTest.java
│ │ ├── TimeStampParameterTest.java
│ │ └── TinyIntParameterTest.java
│ ├── tools
│ ├── TcpProxy.java
│ └── TcpProxySocket.java
│ └── unit
│ ├── InitFinalClass.java
│ ├── MariadbConnectionConfigurationTest.java
│ ├── SslModeTest.java
│ ├── client
│ └── ServerVersionTest.java
│ └── util
│ ├── BufferUtilsTest.java
│ ├── ClientPrepareResultTest.java
│ ├── HostAddressTest.java
│ ├── MariadbTypeTest.java
│ └── ServerPrepareResultTest.java
└── resources
├── conf.properties
└── logback-test.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | .classpath
2 | .project
3 | .settings
4 |
5 | # Keep empty directories:
6 | # Keep empty directories: >> .gitignore/.git*
7 | /target/
8 | .idea
9 | /r2dbc-mariadb.iml
10 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | os: linux
2 | language: java
3 | jdk: openjdk17
4 | version: ~> 1.0
5 |
6 | before_install:
7 | - |-
8 | case $TRAVIS_OS_NAME in
9 | windows)
10 | choco install openjdk11 maven
11 | export PATH=$(cmd.exe //c "refreshenv > nul & C:\Progra~1\Git\bin\bash -c 'echo \$PATH' ")
12 | ;;
13 | esac
14 |
15 | env:
16 | global: packet=40 local=0 clear_text_plugin=0 RUN_LONG_TEST=true PROFILE=default DB=testr2
17 |
18 | import: mariadb-corporation/connector-test-machine:common-build.yml@master
19 |
20 | jobs:
21 | include:
22 | - stage: Language
23 | env: srv=mariadb v=10.6 PROFILE=java8
24 | jdk: openjdk8
25 | name: "CS 10.6 - openjdk 8"
26 | - stage: Language
27 | env: srv=mariadb v=10.6 NO_BACKSLASH_ESCAPES=1
28 | jdk: openjdk11
29 | name: "CS 10.6 - openjdk 11 - NO_BACKSLASH_ESCAPES"
30 | - stage: Language
31 | env: srv=mariadb v=10.6 packet=8
32 | jdk: openjdk17
33 | name: "CS 10.6 - openjdk 17 - packet 8M"
34 |
35 | script:
36 | - mvn clean -Dmaven.test.skip > /dev/null
37 | - if [ -n "$BENCH" ] ; then mvn package -P bench -Dmaven.test.skip; fi
38 | - if [ -n "$BENCH" ] ; then java -Duser.country=US -Duser.language=en -DTEST_PORT=$TEST_DB_PORT -DTEST_HOST=$TEST_DB_HOST -DTEST_USERNAME=$TEST_DB_USER -DTEST_PASSWORD=$TEST_DB_PASSWORD -jar target/benchmarks.jar; fi
39 | - if [ -z "$BENCH" ] ; then MAVEN_SKIP_RC=true MAVEN_OPTS="-Xmx2g" mvn test -P ${PROFILE} -DjobId=${TRAVIS_JOB_ID}; fi
40 |
41 | after_script:
42 | - bash <(curl -s https://codecov.io/bash)
43 |
--------------------------------------------------------------------------------
/codecov.yml:
--------------------------------------------------------------------------------
1 | comment: off
2 | codecov:
3 | token: 4e71e90c-99a8-40b8-b69c-181457ec4861
4 | ignore:
5 | - "src/main/java/org/mariadb/r2dbc/authentication/ed25519/**/*"
6 |
--------------------------------------------------------------------------------
/licenseheader.txt:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2024 MariaDB Corporation Ab
3 |
4 |
--------------------------------------------------------------------------------
/src/benchmark/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | # Benchmark
8 |
9 | How to run :
10 |
11 | ```script
12 | mvn clean package -P bench -Dmaven.test.skip
13 |
14 | # run all benchmarks
15 | java -Duser.country=US -Duser.language=en -jar target/benchmarks.jar
16 |
17 | # run a specific benchmark
18 | java -Duser.country=US -Duser.language=en -jar target/benchmarks.jar "Select_1_user"
19 | ```
20 |
21 | Configuration by system properties :
22 |
23 | * TEST_HOST: localhost
24 | * TEST_PORT: 3306
25 | * TEST_USERNAME: root
26 | * TEST_PASSWORD: ""
27 | * TEST_DATABASE: "testr2"
28 |
29 | example:
30 |
31 | ```script
32 | mvn clean package -P bench -Dmaven.test.skip
33 | java -DTEST_PORT=3307 -Duser.country=US -Duser.language=en -jar target/benchmarks.jar "Select_1_user"
34 | ```
35 |
--------------------------------------------------------------------------------
/src/benchmark/java/org/mariadb/r2dbc/Do_1.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2022 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import org.openjdk.jmh.annotations.Benchmark;
7 |
8 | public class Do_1 extends Common {
9 |
10 | @Benchmark
11 | public Long testR2dbc(MyState state) throws Throwable {
12 | return consume(state.r2dbc);
13 | }
14 |
15 | @Benchmark
16 | public Long testR2dbcPrepare(MyState state) throws Throwable {
17 | return consume(state.r2dbcPrepare);
18 | }
19 |
20 | private Long consume(MariadbConnection connection) {
21 | return connection.createStatement("DO 1").execute()
22 | .flatMap(it -> it.getRowsUpdated())
23 | .blockLast();
24 | }
25 |
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/src/benchmark/java/org/mariadb/r2dbc/Do_1000_param.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2022 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import org.mariadb.r2dbc.api.MariadbStatement;
7 | import org.openjdk.jmh.annotations.Benchmark;
8 |
9 | public class Do_1000_param extends Common {
10 | private static final String sql;
11 |
12 | static {
13 | StringBuilder sb = new StringBuilder("do ?");
14 | for (int i = 1; i < 1000; i++) {
15 | sb.append(",?");
16 | }
17 | sql = sb.toString();
18 | }
19 |
20 | @Benchmark
21 | public Long testR2dbc(MyState state) throws Throwable {
22 | return consume(state.r2dbc);
23 | }
24 |
25 | @Benchmark
26 | public Long testR2dbcPrepare(MyState state) throws Throwable {
27 | return consume(state.r2dbcPrepare);
28 | }
29 |
30 | private Long consume(MariadbConnection connection) {
31 | MariadbStatement statement = connection.createStatement(sql);
32 | for (int i = 0; i < 1000; i++)
33 | statement.bind(i, i);
34 | return statement.execute()
35 | .flatMap(it -> it.getRowsUpdated())
36 | .blockLast();
37 | }
38 |
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/src/benchmark/java/org/mariadb/r2dbc/Insert_batch.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2022 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import org.mariadb.r2dbc.api.MariadbStatement;
7 | import org.openjdk.jmh.annotations.Benchmark;
8 | import org.openjdk.jmh.infra.Blackhole;
9 |
10 | import java.util.ArrayList;
11 | import java.util.Arrays;
12 | import java.util.List;
13 |
14 | public class Insert_batch extends Common {
15 |
16 | static final List chars = new ArrayList<>();
17 |
18 | static {
19 | chars.addAll(Arrays.asList("123456789abcdefghijklmnop\\Z".split("")));
20 | chars.add("😎");
21 | chars.add("🌶");
22 | chars.add("🎤");
23 | chars.add("🥂");
24 | }
25 |
26 | static public String randomString(int length) {
27 | StringBuilder result = new StringBuilder();
28 | for (int i = length; i > 0; --i) result.append(chars.get(Math.round((int) Math.random() * (chars.size() - 1))));
29 | return result.toString();
30 | }
31 |
32 | @Benchmark
33 | public Long testR2dbc(MyState state, Blackhole blackhole) throws Throwable {
34 | return consume(state.r2dbc, blackhole);
35 | }
36 |
37 | @Benchmark
38 | public Long testR2dbcPrepare(MyState state, Blackhole blackhole) throws Throwable {
39 | return consume(state.r2dbcPrepare, blackhole);
40 | }
41 |
42 | private Long consume(MariadbConnection connection, Blackhole blackhole) {
43 | String s = randomString(100);
44 |
45 | MariadbStatement statement = connection.createStatement("INSERT INTO perfTestTextBatch(t0) VALUES (?)");
46 | for (int i = 0; i < 100; i++) {
47 | if (i != 0) statement.add();
48 | statement.bind(0, s);
49 | }
50 |
51 | return
52 | statement.execute()
53 | .flatMap(it -> it.getRowsUpdated())
54 | .blockLast();
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/benchmark/java/org/mariadb/r2dbc/Select_1.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2022 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import org.mariadb.r2dbc.api.MariadbStatement;
7 | import org.openjdk.jmh.annotations.Benchmark;
8 |
9 | public class Select_1 extends Common {
10 |
11 | @Benchmark
12 | public Integer testR2dbc(MyState state) throws Throwable {
13 | return consume(state.r2dbc);
14 | }
15 |
16 | @Benchmark
17 | public Integer testR2dbcPrepare(MyState state) throws Throwable {
18 | return consume(state.r2dbcPrepare);
19 | }
20 |
21 | private Integer consume(MariadbConnection connection) {
22 | int rnd = (int) (Math.random() * 1000);
23 | MariadbStatement statement = connection.createStatement("select " + rnd);
24 | return
25 | statement.execute()
26 | .flatMap(it -> it.map((row, rowMetadata) -> row.get(0, Integer.class)))
27 | .blockLast();
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/src/benchmark/java/org/mariadb/r2dbc/Select_1000_Rows.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2022 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import org.openjdk.jmh.annotations.Benchmark;
7 | import org.openjdk.jmh.infra.Blackhole;
8 |
9 | public class Select_1000_Rows extends Common {
10 | private static final String sql =
11 | "select seq, 'abcdefghijabcdefghijabcdefghijaa' from seq_1_to_1000";
12 |
13 | @Benchmark
14 | public Integer testR2dbc(MyState state, Blackhole blackhole) throws Throwable {
15 | return consume(state.r2dbc, blackhole);
16 | }
17 |
18 | @Benchmark
19 | public Integer testR2dbcPrepare(MyState state, Blackhole blackhole) throws Throwable {
20 | return consumePrepare(state.r2dbcPrepare, blackhole);
21 | }
22 |
23 | private Integer consume(MariadbConnection connection, Blackhole blackhole) {
24 | return connection.createStatement(sql).execute()
25 | .flatMap(it -> it.map((row, rowMetadata) -> {
26 | Integer i = row.get(0, Integer.class);
27 | row.get(1, String.class);
28 | return i;
29 | })).blockLast();
30 | }
31 |
32 | private Integer consumePrepare(MariadbConnection connection, Blackhole blackhole) {
33 | return connection.createStatement(sql + " WHERE 1 = ?").bind(0, 1).execute()
34 | .flatMap(it -> it.map((row, rowMetadata) -> {
35 | Integer i = row.get(0, Integer.class);
36 | row.get(1, String.class);
37 | return i;
38 | })).blockLast();
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/src/benchmark/java/org/mariadb/r2dbc/Select_100_cols.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2022 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import org.mariadb.r2dbc.api.MariadbStatement;
7 | import org.openjdk.jmh.annotations.Benchmark;
8 |
9 | public class Select_100_cols extends Common {
10 |
11 | @Benchmark
12 | public int[] testR2dbc(MyState state) throws Throwable {
13 | return consume(state.r2dbc);
14 | }
15 |
16 | @Benchmark
17 | public int[] testR2dbcPrepare(MyState state) throws Throwable {
18 | return consumePrepare(state.r2dbcPrepare);
19 | }
20 |
21 | private int[] consume(MariadbConnection connection) {
22 |
23 | MariadbStatement statement =
24 | connection.createStatement("select * FROM test100");
25 | return
26 | statement.execute()
27 | .flatMap(
28 | it ->
29 | it.map(
30 | (row, rowMetadata) -> {
31 | int[] objs = new int[100];
32 | for (int i = 0; i < 100; i++) {
33 | objs[i] = row.get(i, Integer.class);
34 | }
35 | return objs;
36 | }))
37 | .blockLast();
38 | }
39 |
40 | private int[] consumePrepare(MariadbConnection connection) {
41 |
42 | MariadbStatement statement =
43 | connection.createStatement("select * FROM test100 WHERE 1 = ?").bind(0, 1);
44 | return
45 | statement.execute()
46 | .flatMap(
47 | it ->
48 | it.map(
49 | (row, rowMetadata) -> {
50 | int[] objs = new int[100];
51 | for (int i = 0; i < 100; i++) {
52 | objs[i] = row.get(i, Integer.class);
53 | }
54 | return objs;
55 | }))
56 | .blockLast();
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/src/benchmark/resources/logback-test.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 | %d{yyyy-MM-dd} | %d{HH:mm:ss.SSS} | %-20.20thread | %5p | %logger{25} | %m%n
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/main/java/org/mariadb/r2dbc/ExceptionFactory.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2024 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import io.r2dbc.spi.*;
7 | import org.mariadb.r2dbc.message.ServerMessage;
8 | import org.mariadb.r2dbc.message.server.ErrorPacket;
9 | import reactor.core.publisher.SynchronousSink;
10 |
11 | public final class ExceptionFactory {
12 |
13 | public static final ExceptionFactory INSTANCE = new ExceptionFactory("");
14 | private final String sql;
15 |
16 | private ExceptionFactory(String sql) {
17 | this.sql = sql;
18 | }
19 |
20 | public static ExceptionFactory withSql(String sql) {
21 | return new ExceptionFactory(sql);
22 | }
23 |
24 | public static R2dbcException createException(ErrorPacket error, String sql) {
25 | return createException(error.message(), error.sqlState(), error.errorCode(), sql);
26 | }
27 |
28 | public static R2dbcException createException(
29 | String message, String sqlState, int errorCode, String sql) {
30 |
31 | if ("70100".equals(sqlState) || errorCode == 3024) { // ER_QUERY_INTERRUPTED
32 | return new R2dbcTimeoutException(message, sqlState, errorCode, sql);
33 | }
34 |
35 | String sqlClass = sqlState.substring(0, 2);
36 | switch (sqlClass) {
37 | case "0A":
38 | case "22":
39 | case "26":
40 | case "2F":
41 | case "20":
42 | case "42":
43 | case "XA":
44 | return new R2dbcBadGrammarException(message, sqlState, errorCode, sql);
45 | case "25":
46 | case "28":
47 | return new R2dbcPermissionDeniedException(message, sqlState, errorCode, sql);
48 | case "21":
49 | case "23":
50 | return new R2dbcDataIntegrityViolationException(message, sqlState, errorCode, sql);
51 | case "H1":
52 | case "08":
53 | return new R2dbcNonTransientResourceException(message, sqlState, errorCode, sql);
54 | case "40":
55 | return new R2dbcRollbackException(message, sqlState, errorCode, sql);
56 | }
57 |
58 | return new R2dbcTransientResourceException(message, sqlState, errorCode, sql);
59 | }
60 |
61 | public R2dbcException createParsingException(String message) {
62 | return new R2dbcNonTransientResourceException(message, "H1000", 9000, this.sql);
63 | }
64 |
65 | public R2dbcException createParsingException(String message, Throwable cause) {
66 | return new R2dbcNonTransientResourceException(message, "H1000", 9000, this.sql, cause);
67 | }
68 |
69 | public R2dbcException createConnectionErrorException(String message) {
70 | return new R2dbcNonTransientResourceException(message, "08000", 9000, this.sql);
71 | }
72 |
73 | public R2dbcException createConnectionErrorException(String message, Throwable cause) {
74 | return new R2dbcNonTransientResourceException(
75 | message + " : " + cause.getMessage(), "08000", 9000, this.sql, cause);
76 | }
77 |
78 | public R2dbcException createException(String message, String sqlState, int errorCode) {
79 | return ExceptionFactory.createException(message, sqlState, errorCode, this.sql);
80 | }
81 |
82 | public R2dbcException from(ErrorPacket err) {
83 | return createException(err, this.sql);
84 | }
85 |
86 | public void handleErrorResponse(ServerMessage message, SynchronousSink sink) {
87 | if (message instanceof ErrorPacket) {
88 | sink.error(createException((ErrorPacket) message, this.sql));
89 | } else {
90 | sink.next(message);
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryMetadata.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2024 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import io.r2dbc.spi.ConnectionFactoryMetadata;
7 |
8 | final class MariadbConnectionFactoryMetadata implements ConnectionFactoryMetadata {
9 |
10 | public static final String NAME = "MariaDB";
11 |
12 | static final MariadbConnectionFactoryMetadata INSTANCE = new MariadbConnectionFactoryMetadata();
13 |
14 | private MariadbConnectionFactoryMetadata() {}
15 |
16 | @Override
17 | public String getName() {
18 | return NAME;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/org/mariadb/r2dbc/MariadbConnectionMetadata.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2024 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import org.mariadb.r2dbc.client.ServerVersion;
7 |
8 | public final class MariadbConnectionMetadata
9 | implements org.mariadb.r2dbc.api.MariadbConnectionMetadata {
10 |
11 | private final ServerVersion version;
12 |
13 | MariadbConnectionMetadata(ServerVersion version) {
14 | this.version = version;
15 | }
16 |
17 | @Override
18 | public String getDatabaseProductName() {
19 | return this.version.isMariaDBServer() ? "MariaDB" : "MySQL";
20 | }
21 |
22 | public boolean isMariaDBServer() {
23 | return this.version.isMariaDBServer();
24 | }
25 |
26 | public boolean minVersion(int major, int minor, int patch) {
27 | return this.version.versionGreaterOrEqual(major, minor, patch);
28 | }
29 |
30 | public int getMajorVersion() {
31 | return version.getMajorVersion();
32 | }
33 |
34 | public int getMinorVersion() {
35 | return version.getMinorVersion();
36 | }
37 |
38 | public int getPatchVersion() {
39 | return version.getPatchVersion();
40 | }
41 |
42 | @Override
43 | public String getDatabaseVersion() {
44 | return this.version.getServerVersion();
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/main/java/org/mariadb/r2dbc/MariadbTransactionDefinition.java:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: Apache-2.0
2 | // Copyright (c) 2020-2024 MariaDB Corporation Ab
3 |
4 | package org.mariadb.r2dbc;
5 |
6 | import io.r2dbc.spi.IsolationLevel;
7 | import io.r2dbc.spi.Option;
8 | import io.r2dbc.spi.TransactionDefinition;
9 | import java.util.Collections;
10 | import java.util.HashMap;
11 | import java.util.Map;
12 | import org.mariadb.r2dbc.util.Assert;
13 |
14 | public final class MariadbTransactionDefinition implements TransactionDefinition {
15 |
16 | public static final MariadbTransactionDefinition EMPTY =
17 | new MariadbTransactionDefinition(Collections.emptyMap());
18 |
19 | public static final Option WITH_CONSISTENT_SNAPSHOT =
20 | Option.valueOf("WITH CONSISTENT SNAPSHOT");
21 | public static MariadbTransactionDefinition WITH_CONSISTENT_SNAPSHOT_READ_WRITE =
22 | EMPTY.consistent().readWrite();
23 | public static MariadbTransactionDefinition WITH_CONSISTENT_SNAPSHOT_READ_ONLY =
24 | EMPTY.consistent().readOnly();
25 | public static MariadbTransactionDefinition READ_WRITE = EMPTY.readWrite();
26 | public static MariadbTransactionDefinition READ_ONLY = EMPTY.readOnly();
27 | private final Map