Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[CONJ-252] deletion of specific charset implementation when using Sta…
…tement.setCharacterStream(), permitting to avoiding npe possibility
  • Loading branch information
rusher committed Feb 19, 2016
1 parent 78f59b6 commit 012b8c3
Show file tree
Hide file tree
Showing 11 changed files with 68 additions and 497 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -6,7 +6,7 @@
<artifactId>mariadb-java-client</artifactId>
<packaging>jar</packaging>
<name>mariadb-java-client</name>
<version>1.3.5</version>
<version>1.3.6-SNAPSHOT</version>
<description>JDBC driver for MariaDB and MySQL</description>
<url>https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/</url>

Expand Down
Expand Up @@ -49,21 +49,15 @@ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWIS
OF SUCH DAMAGE.
*/

import org.mariadb.jdbc.internal.util.constant.MariaDbCharset;
import org.mariadb.jdbc.internal.stream.PacketOutputStream;

import java.io.IOException;


public abstract class LongDataParameterHolder extends ParameterHolder {
public MariaDbCharset mariaDbCharset;

public abstract void writeBinary(PacketOutputStream writeBuffer) throws IOException;

public void setMariaDbServerCharset(MariaDbCharset mariaDbCharset) {
this.mariaDbCharset = mariaDbCharset;
}

public boolean isLongData() {
return true;
}
Expand Down
Expand Up @@ -129,9 +129,9 @@ public long getApproximateTextProtocolLength() throws IOException {
*/
public void writeBinary(PacketOutputStream os) throws IOException {
if (length == Long.MAX_VALUE) {
os.sendStream(reader, mariaDbCharset);
os.sendStream(reader);
} else {
os.sendStream(reader, length, mariaDbCharset);
os.sendStream(reader, length);
}
}

Expand Down
Expand Up @@ -49,41 +49,24 @@ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWIS

package org.mariadb.jdbc.internal.packet.send;

import org.mariadb.jdbc.internal.util.constant.MariaDbCharset;
import org.mariadb.jdbc.internal.stream.PacketOutputStream;
import org.mariadb.jdbc.internal.packet.dao.parameters.LongDataParameterHolder;

import java.io.IOException;
import java.io.OutputStream;

public class SendPrepareParameterPacket implements InterfaceSendPacket {

private LongDataParameterHolder parameter;
private int statementId;
private int parameterIndex;
public class SendPrepareParameterPacket {

/**
* Initiate parameters.
* Send stream to database.
* @param parameterIndex parameter index
* @param parameter parameter
* @param statementId statement Id
* @param mariaDbCharset charset
*/
public SendPrepareParameterPacket(int parameterIndex, LongDataParameterHolder parameter, int statementId, MariaDbCharset mariaDbCharset) {
this.parameter = parameter;
this.statementId = statementId;
this.parameterIndex = parameterIndex;
this.parameter.setMariaDbServerCharset(mariaDbCharset);

}

/**
* Send stream to database.
* @param os database socket
* @return 0 if all went well
* @throws IOException if a connection error occur
*/
public int send(final OutputStream os) throws IOException {
public static void send(final int parameterIndex, final LongDataParameterHolder parameter, final int statementId, final OutputStream os)
throws IOException {
PacketOutputStream pos = (PacketOutputStream) os;
pos.startPacket(0);
pos.writeByte((byte) 0x18);
Expand All @@ -92,6 +75,5 @@ public int send(final OutputStream os) throws IOException {

parameter.writeBinary(((PacketOutputStream) os));
pos.finishPacket();
return 0;
}
}
Expand Up @@ -71,7 +71,6 @@ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWIS
import org.mariadb.jdbc.internal.queryresults.SelectQueryResult;
import org.mariadb.jdbc.internal.queryresults.StreamingSelectResult;
import org.mariadb.jdbc.internal.util.constant.HaMode;
import org.mariadb.jdbc.internal.util.constant.MariaDbCharset;
import org.mariadb.jdbc.internal.util.constant.ParameterConstant;
import org.mariadb.jdbc.internal.util.constant.ServerStatus;
import org.mariadb.jdbc.internal.util.dao.QueryException;
Expand Down Expand Up @@ -110,7 +109,6 @@ public abstract class AbstractConnectProtocol implements Protocol {
private int majorVersion;
private int minorVersion;
private int patchVersion;
private byte serverLanguage;
private Map<String, String> serverData;
private Calendar cal;

Expand All @@ -126,7 +124,6 @@ public abstract class AbstractConnectProtocol implements Protocol {
protected boolean explicitClosed = false;
protected String database;
protected long serverThreadId;
protected MariaDbCharset charset;
protected PrepareStatementCache prepareStatementCache;

public boolean moreResults = false;
Expand Down Expand Up @@ -401,8 +398,6 @@ private void handleConnectionPhases() throws QueryException {

final ReadInitialConnectPacket greetingPacket = new ReadInitialConnectPacket(packetFetcher);
this.serverThreadId = greetingPacket.getServerThreadId();
this.serverLanguage = greetingPacket.getServerLanguage();
this.charset = CharsetUtils.getServerCharset(serverLanguage);
this.version = greetingPacket.getServerVersion();
parseVersion();
int clientCapabilities = initializeClientCapabilities();
Expand Down Expand Up @@ -430,7 +425,7 @@ private void handleConnectionPhases() throws QueryException {
throw new QueryException("Trying to connect with ssl, but ssl not enabled in the server");
}

authentication(clientCapabilities, greetingPacket.getSeed(), packetSeq);
authentication(greetingPacket.getServerLanguage(), clientCapabilities, greetingPacket.getSeed(), packetSeq);

} catch (IOException e) {
if (reader != null) {
Expand All @@ -445,12 +440,12 @@ private void handleConnectionPhases() throws QueryException {
}
}

private void authentication(int clientCapabilities, byte[] seed, byte packetSeq) throws QueryException, IOException {
private void authentication(byte serverLanguage, int clientCapabilities, byte[] seed, byte packetSeq) throws QueryException, IOException {
final SendHandshakeResponsePacket cap = new SendHandshakeResponsePacket(this.username,
this.password,
database,
clientCapabilities,
decideLanguage(),
decideLanguage(serverLanguage),
seed,
packetSeq);
cap.send(writer);
Expand Down Expand Up @@ -594,8 +589,8 @@ private boolean isServerLanguageUtf8mb4(byte serverLanguage) {
return Arrays.asList(utf8mb4Languages).contains(serverLanguage);
}

private byte decideLanguage() {
byte result = (isServerLanguageUtf8mb4(this.serverLanguage) ? this.serverLanguage : 33);
private byte decideLanguage(byte serverLanguage) {
byte result = (isServerLanguageUtf8mb4(serverLanguage) ? serverLanguage : 33);
return result;
}

Expand Down
Expand Up @@ -569,9 +569,7 @@ public AbstractQueryResult executePreparedQuery(String sql, ParameterHolder[] pa
//send binary data in a separate stream
for (int i = 0; i < parameterCount; i++) {
if (parameters[i].isLongData()) {
SendPrepareParameterPacket sendPrepareParameterPacket = new SendPrepareParameterPacket(i, (LongDataParameterHolder) parameters[i],
prepareResult.statementId, charset);
sendPrepareParameterPacket.send(writer);
SendPrepareParameterPacket.send(i, (LongDataParameterHolder) parameters[i], prepareResult.statementId, writer);
}
}
//send execute query
Expand Down
@@ -1,7 +1,5 @@
package org.mariadb.jdbc.internal.stream;

import org.mariadb.jdbc.internal.util.constant.MariaDbCharset;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
Expand Down Expand Up @@ -151,14 +149,13 @@ public void sendStream(InputStream is, long readLength) throws IOException {
/**
* Send reader stream to server.
* @param reader reader to send
* @param charset charset converter
* @throws IOException if any error occur during data send to server
*/
public void sendStream(java.io.Reader reader, MariaDbCharset charset) throws IOException {
public void sendStream(java.io.Reader reader) throws IOException {
char[] buffer = new char[8192];
int len;
while ((len = reader.read(buffer)) > 0) {
byte[] bytes = new String(buffer, 0, len).getBytes(charset.javaIoCharsetName);
byte[] bytes = new String(buffer, 0, len).getBytes("UTF-8");
write(bytes, 0, bytes.length);
}
}
Expand All @@ -167,10 +164,9 @@ public void sendStream(java.io.Reader reader, MariaDbCharset charset) throws IOE
* Send reader stream to server.
* @param reader reader to send
* @param readLength max size to send
* @param charset charset converter
* @throws IOException if any error occur during data send to server
*/
public void sendStream(java.io.Reader reader, long readLength, MariaDbCharset charset) throws IOException {
public void sendStream(java.io.Reader reader, long readLength) throws IOException {
char[] buffer = new char[8192];
long remainingReadLength = readLength;
int read;
Expand All @@ -179,7 +175,7 @@ public void sendStream(java.io.Reader reader, long readLength, MariaDbCharset ch
if (read == -1) {
return;
}
byte[] bytes = new String(buffer, 0, read).getBytes(charset.javaIoCharsetName);
byte[] bytes = new String(buffer, 0, read).getBytes("UTF-8");
write(bytes, 0, bytes.length);
remainingReadLength -= read;
}
Expand Down

0 comments on commit 012b8c3

Please sign in to comment.