Skip to content

Commit

Permalink
[CONJ-932] Login packet now use recommended length encoded value for …
Browse files Browse the repository at this point in the history
…connection attributes
  • Loading branch information
rusher committed Mar 3, 2022
1 parent abc89b6 commit a053e14
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 45 deletions.
6 changes: 6 additions & 0 deletions src/main/java/org/mariadb/jdbc/client/socket/Writer.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ public interface Writer {
*/
int pos();

/**
* Current buffer
* @return current buffer
*/
byte[] buf();

/**
* Set current buffer position
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,15 @@ public void writeString(String str) throws IOException {
}
}

/**
* Current buffer
*
* @return current buffer
*/
public byte[] buf() {
return buf;
}

/**
* Write string to socket.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.mariadb.jdbc.Configuration;
import org.mariadb.jdbc.client.Context;
import org.mariadb.jdbc.client.socket.Writer;
import org.mariadb.jdbc.client.socket.impl.PacketWriter;
import org.mariadb.jdbc.message.ClientMessage;
import org.mariadb.jdbc.plugin.Credential;
import org.mariadb.jdbc.plugin.authentication.standard.NativePasswordPlugin;
Expand Down Expand Up @@ -85,56 +86,46 @@ private static void writeStringLength(Writer encoder, String value) throws IOExc
private static void writeConnectAttributes(
Writer writer, String connectionAttributes, String host) throws IOException {

writer.mark();
writer.writeInt(0);
PacketWriter tmpWriter = new PacketWriter(null, 0,0, null, null);
tmpWriter.pos(0);
writeStringLengthAscii(tmpWriter, _CLIENT_NAME);
writeStringLength(tmpWriter, "MariaDB Connector/J");

writeStringLengthAscii(writer, _CLIENT_NAME);
writeStringLength(writer, "MariaDB Connector/J");
writeStringLengthAscii(tmpWriter, _CLIENT_VERSION);
writeStringLength(tmpWriter, VersionFactory.getInstance().getVersion());

writeStringLengthAscii(writer, _CLIENT_VERSION);
writeStringLength(writer, VersionFactory.getInstance().getVersion());
writeStringLengthAscii(tmpWriter, _SERVER_HOST);
writeStringLength(tmpWriter, (host != null) ? host : "");

writeStringLengthAscii(writer, _SERVER_HOST);
writeStringLength(writer, (host != null) ? host : "");
writeStringLengthAscii(tmpWriter, _OS);
writeStringLength(tmpWriter, System.getProperty("os.name"));

writeStringLengthAscii(writer, _OS);
writeStringLength(writer, System.getProperty("os.name"));
writeStringLengthAscii(tmpWriter, _THREAD);
writeStringLength(tmpWriter, Long.toString(Thread.currentThread().getId()));

writeStringLengthAscii(writer, _THREAD);
writeStringLength(writer, Long.toString(Thread.currentThread().getId()));
writeStringLengthAscii(tmpWriter, _JAVA_VENDOR);
writeStringLength(tmpWriter, System.getProperty("java.vendor"));

writeStringLengthAscii(writer, _JAVA_VENDOR);
writeStringLength(writer, System.getProperty("java.vendor"));

writeStringLengthAscii(writer, _JAVA_VERSION);
writeStringLength(writer, System.getProperty("java.version"));
writeStringLengthAscii(tmpWriter, _JAVA_VERSION);
writeStringLength(tmpWriter, System.getProperty("java.version"));

if (connectionAttributes != null) {
StringTokenizer tokenizer = new StringTokenizer(connectionAttributes, ",");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
int separator = token.indexOf(":");
if (separator != -1) {
writeStringLength(writer, token.substring(0, separator));
writeStringLength(writer, token.substring(separator + 1));
writeStringLength(tmpWriter, token.substring(0, separator));
writeStringLength(tmpWriter, token.substring(separator + 1));
} else {
writeStringLength(writer, token);
writeStringLength(writer, "");
writeStringLength(tmpWriter, token);
writeStringLength(tmpWriter, "");
}
}
}

// write real length
int ending = writer.pos();
writer.resetMark();
int length = ending - (writer.pos() + 4);
byte[] arr = new byte[4];
arr[0] = (byte) 0xfd;
arr[1] = (byte) length;
arr[2] = (byte) (length >>> 8);
arr[3] = (byte) (length >>> 16);
writer.writeBytes(arr);
writer.pos(ending);
writer.writeLength(tmpWriter.pos());
writer.writeBytes(tmpWriter.buf(), 0, tmpWriter.pos());
}

@Override
Expand Down
26 changes: 13 additions & 13 deletions src/test/java/org/mariadb/jdbc/integration/ConfigurationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,19 +72,19 @@ public void connectionAttributes() throws SQLException {
Statement stmt = conn.createStatement();
ResultSet rs1 = stmt.executeQuery("SELECT @@performance_schema");
rs1.next();
if ("1".equals(rs1.getString(1))) {
ResultSet rs =
stmt.executeQuery(
"SELECT * from performance_schema.session_connect_attrs where processlist_id="
+ conn.getThreadId()
+ " AND ATTR_NAME like 'test%'");
assertTrue(rs.next());
assertEquals("test1", rs.getString("ATTR_VALUE"));
assertTrue(rs.next());
assertEquals("test2Val", rs.getString("ATTR_VALUE"));
assertTrue(rs.next());
assertNull(rs.getString("ATTR_VALUE"));
}
Assumptions.assumeTrue("1".equals(rs1.getString(1)));

ResultSet rs =
stmt.executeQuery(
"SELECT * from performance_schema.session_connect_attrs where processlist_id="
+ conn.getThreadId()
+ " AND ATTR_NAME like 'test%'");
assertTrue(rs.next());
assertEquals("test1", rs.getString("ATTR_VALUE"));
assertTrue(rs.next());
assertEquals("test2Val", rs.getString("ATTR_VALUE"));
assertTrue(rs.next());
assertNull(rs.getString("ATTR_VALUE"));
}
}

Expand Down

0 comments on commit a053e14

Please sign in to comment.