Skip to content

Commit 5e2c3af

Browse files
committed
[misc] OkPacket fast path
1 parent f181df2 commit 5e2c3af

File tree

4 files changed

+107
-9
lines changed

4 files changed

+107
-9
lines changed

src/main/java/org/mariadb/jdbc/client/impl/StandardClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ public void authenticationHandler(Credential credential, HostAddress hostAddress
311311
// OK_Packet -> Authenticated !
312312
// see https://mariadb.com/kb/en/library/ok_packet/
313313
// *************************************************************************************
314-
OkPacket okPacket = new OkPacket(buf, context);
314+
OkPacket okPacket = OkPacket.parseWithInfo(buf, context);
315315

316316
// ssl certificates validation using client password
317317
if (certFingerprint != null) {

src/main/java/org/mariadb/jdbc/message/ClientMessage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ default Completion readPacket(
169169
// * OK response
170170
// *********************************************************************************************************
171171
case (byte) 0x00:
172-
OkPacket ok = new OkPacket(buf, context);
172+
OkPacket ok = OkPacket.parse(buf, context);
173173
if (context.getRedirectUrl() != null
174174
&& (context.getServerStatus() & ServerStatus.IN_TRANSACTION) == 0
175175
&& (context.getServerStatus() & ServerStatus.MORE_RESULTS_EXISTS) == 0) {

src/main/java/org/mariadb/jdbc/message/server/OkPacket.java

Lines changed: 105 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,125 @@
1313

1414
/** Ok packet parser see https://mariadb.com/kb/en/ok_packet/ */
1515
public class OkPacket implements Completion {
16+
private static final OkPacket BASIC_OK = new OkPacket(0, 0, null);
1617
private static final Logger logger = Loggers.getLogger(OkPacket.class);
1718

1819
private final long affectedRows;
1920
private final long lastInsertId;
2021
private final byte[] info;
2122

23+
private OkPacket(long affectedRows, long lastInsertId, byte[] info) {
24+
this.affectedRows = affectedRows;
25+
this.lastInsertId = lastInsertId;
26+
this.info = info;
27+
}
28+
2229
/**
2330
* Parser
2431
*
2532
* @param buf packet buffer
2633
* @param context connection context
2734
*/
28-
public OkPacket(ReadableByteBuf buf, Context context) {
35+
public static OkPacket parse(ReadableByteBuf buf, Context context) {
2936
buf.skip(); // ok header
30-
this.affectedRows = buf.readLongLengthEncodedNotNull();
31-
this.lastInsertId = buf.readLongLengthEncodedNotNull();
37+
long affectedRows = buf.readLongLengthEncodedNotNull();
38+
long lastInsertId = buf.readLongLengthEncodedNotNull();
3239
context.setServerStatus(buf.readUnsignedShort());
3340
context.setWarning(buf.readUnsignedShort());
3441

42+
if (buf.readableBytes() > 0) {
43+
buf.skip(buf.readIntLengthEncodedNotNull()); // skip info
44+
if (context.hasClientCapability(Capabilities.CLIENT_SESSION_TRACK)) {
45+
while (buf.readableBytes() > 0) {
46+
ReadableByteBuf sessionStateBuf = buf.readLengthBuffer();
47+
while (sessionStateBuf.readableBytes() > 0) {
48+
switch (sessionStateBuf.readByte()) {
49+
case StateChange.SESSION_TRACK_SYSTEM_VARIABLES:
50+
ReadableByteBuf tmpBufsv;
51+
do {
52+
tmpBufsv = sessionStateBuf.readLengthBuffer();
53+
String variableSv = tmpBufsv.readString(tmpBufsv.readIntLengthEncodedNotNull());
54+
Integer lenSv = tmpBufsv.readLength();
55+
String valueSv = lenSv == null ? null : tmpBufsv.readString(lenSv);
56+
logger.debug("System variable change: {} = {}", variableSv, valueSv);
57+
switch (variableSv) {
58+
case "character_set_client":
59+
context.setCharset(valueSv);
60+
break;
61+
case "connection_id":
62+
context.setThreadId(Long.parseLong(valueSv));
63+
break;
64+
case "threads_Connected":
65+
context.setTreadsConnected(Long.parseLong(valueSv));
66+
break;
67+
case "auto_increment_increment":
68+
context.setAutoIncrement(Long.parseLong(valueSv));
69+
break;
70+
case "redirect_url":
71+
if (!"".equals(valueSv)) context.setRedirectUrl(valueSv);
72+
break;
73+
case "tx_isolation":
74+
case "transaction_isolation":
75+
switch (valueSv) {
76+
case "REPEATABLE-READ":
77+
context.setTransactionIsolationLevel(
78+
java.sql.Connection.TRANSACTION_REPEATABLE_READ);
79+
break;
80+
case "READ-UNCOMMITTED":
81+
context.setTransactionIsolationLevel(
82+
java.sql.Connection.TRANSACTION_READ_UNCOMMITTED);
83+
break;
84+
case "READ-COMMITTED":
85+
context.setTransactionIsolationLevel(
86+
java.sql.Connection.TRANSACTION_READ_COMMITTED);
87+
break;
88+
case "SERIALIZABLE":
89+
context.setTransactionIsolationLevel(
90+
java.sql.Connection.TRANSACTION_SERIALIZABLE);
91+
break;
92+
default:
93+
context.setTransactionIsolationLevel(null);
94+
break;
95+
}
96+
break;
97+
}
98+
} while (tmpBufsv.readableBytes() > 0);
99+
break;
100+
101+
case StateChange.SESSION_TRACK_SCHEMA:
102+
sessionStateBuf.readIntLengthEncodedNotNull();
103+
Integer dbLen = sessionStateBuf.readLength();
104+
String database =
105+
dbLen == null || dbLen == 0 ? null : sessionStateBuf.readString(dbLen);
106+
context.setDatabase(database);
107+
logger.debug("Database change: is '{}'", database);
108+
break;
109+
110+
default:
111+
buf.skip(buf.readIntLengthEncodedNotNull());
112+
break;
113+
}
114+
}
115+
}
116+
}
117+
}
118+
if (affectedRows == 0 && lastInsertId == 0) return BASIC_OK;
119+
return new OkPacket(affectedRows, lastInsertId, null);
120+
}
121+
122+
/**
123+
* Parser
124+
*
125+
* @param buf packet buffer
126+
* @param context connection context
127+
*/
128+
public static OkPacket parseWithInfo(ReadableByteBuf buf, Context context) {
129+
buf.skip(); // ok header
130+
long affectedRows = buf.readLongLengthEncodedNotNull();
131+
long lastInsertId = buf.readLongLengthEncodedNotNull();
132+
context.setServerStatus(buf.readUnsignedShort());
133+
context.setWarning(buf.readUnsignedShort());
134+
byte[] info;
35135
if (buf.readableBytes() > 0) {
36136
info = new byte[buf.readIntLengthEncodedNotNull()];
37137
buf.readBytes(info);
@@ -108,9 +208,8 @@ public OkPacket(ReadableByteBuf buf, Context context) {
108208
}
109209
}
110210
}
111-
} else {
112-
info = null;
113-
}
211+
} else info = new byte[0];
212+
return new OkPacket(affectedRows, lastInsertId, info);
114213
}
115214

116215
/**

src/test/java/org/mariadb/jdbc/integration/StatementTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,6 @@ public void maxRows() throws SQLException {
643643
assertEquals(i, rs.getInt(1));
644644
}
645645
assertEquals(10, i);
646-
647646
}
648647
}
649648

0 commit comments

Comments
 (0)