Skip to content

Commit

Permalink
refactor PreparedStatementRegistry => BinaryStatementRegistry
Browse files Browse the repository at this point in the history
  • Loading branch information
terrymanu committed Aug 2, 2018
1 parent 4e038e9 commit 216fcdd
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.math.BigDecimal;
import java.sql.Blob;
Expand Down Expand Up @@ -325,9 +324,7 @@ private void assertParameter(final PreparedStatement actual, final int index, fi
assertThat(((ShardingPreparedStatement) actual).getParameters().get(index - 1), is(parameter));
}

private static class SerializableStringReader extends StringReader implements Serializable {

private static final long serialVersionUID = 5054305161835171548L;
private static class SerializableStringReader extends StringReader {

SerializableStringReader() {
super("value");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,25 @@

package io.shardingsphere.proxy.transport.mysql.packet.command.query.binary;

import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.execute.PreparedStatementParameterHeader;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

import java.util.List;

/**
* SQL element.
* Binary prepared statement.
*
* @author zhangyonglun
*/
@RequiredArgsConstructor
@Getter
@Setter
public final class BinaryPreparedStatementUnit {
public final class BinaryStatement {

private final String sql;

private final int parametersCount;

private List<PreparedStatementParameterHeader> preparedStatementParameterHeaders;
private List<BinaryStatementParameterHeader> parameterHeaders;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,20 @@
* </p>
*/

package io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.execute;
package io.shardingsphere.proxy.transport.mysql.packet.command.query.binary;

import io.shardingsphere.proxy.transport.mysql.constant.ColumnType;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.io.Serializable;

/**
* Prepared statement parameter header.
* Binary prepared statement parameter header.
*
* @author zhangyonglun
*/
@AllArgsConstructor
@Getter
public class PreparedStatementParameterHeader implements Serializable {

private static final long serialVersionUID = -672589695838350689L;
public final class BinaryStatementParameterHeader {

private final ColumnType columnType;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,19 @@
import java.util.concurrent.atomic.AtomicInteger;

/**
* Prepared statement registry.
* Binary prepared statement registry.
*
* @author zhangliang
* @author zhangyonglun
*/
@NoArgsConstructor(access = AccessLevel.NONE)
public final class PreparedStatementRegistry {
public final class BinaryStatementRegistry {

private static final PreparedStatementRegistry INSTANCE = new PreparedStatementRegistry();
private static final BinaryStatementRegistry INSTANCE = new BinaryStatementRegistry();

private final ConcurrentMap<String, Integer> sqlToStatementIdMap = new ConcurrentHashMap<>(65535, 1);
private final ConcurrentMap<String, Integer> statementIdAssigner = new ConcurrentHashMap<>(65535, 1);

private final ConcurrentMap<Integer, BinaryPreparedStatementUnit> statementIdToBinaryPreparedStatementUnitMap = new ConcurrentHashMap<>(65535, 1);
private final ConcurrentMap<Integer, BinaryStatement> binaryStatements = new ConcurrentHashMap<>(65535, 1);

private final AtomicInteger sequence = new AtomicInteger();

Expand All @@ -46,7 +46,7 @@ public final class PreparedStatementRegistry {
*
* @return prepared statement registry instance
*/
public static PreparedStatementRegistry getInstance() {
public static BinaryStatementRegistry getInstance() {
return INSTANCE;
}

Expand All @@ -58,23 +58,23 @@ public static PreparedStatementRegistry getInstance() {
* @return statement ID
*/
public int register(final String sql, final int parametersCount) {
Integer result = sqlToStatementIdMap.get(sql);
Integer result = statementIdAssigner.get(sql);
if (null != result) {
return result;
}
int statementId = sequence.incrementAndGet();
statementIdToBinaryPreparedStatementUnitMap.putIfAbsent(statementId, new BinaryPreparedStatementUnit(sql, parametersCount));
sqlToStatementIdMap.putIfAbsent(sql, statementId);
return statementId;
result = sequence.incrementAndGet();
statementIdAssigner.putIfAbsent(sql, result);
binaryStatements.putIfAbsent(result, new BinaryStatement(sql, parametersCount));
return result;
}

/**
* Get binary prepared statement unit.
* Get binary prepared statement.
*
* @param statementId statement ID
* @return binary prepared statement unit
* @return binary prepared statement
*/
public BinaryPreparedStatementUnit getBinaryPreparedStatementUnit(final int statementId) {
return statementIdToBinaryPreparedStatementUnitMap.get(statementId);
public BinaryStatement getBinaryStatement(final int statementId) {
return binaryStatements.get(statementId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@
import io.shardingsphere.proxy.transport.mysql.packet.MySQLPacketPayload;
import io.shardingsphere.proxy.transport.mysql.packet.command.CommandResponsePackets;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.QueryCommandPacket;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.BinaryPreparedStatementUnit;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.PreparedStatementRegistry;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.BinaryStatement;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.BinaryStatementRegistry;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.BinaryStatementParameterHeader;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

Expand Down Expand Up @@ -73,17 +74,17 @@ public final class ComStmtExecutePacket implements QueryCommandPacket {

private final List<PreparedStatementParameter> preparedStatementParameters = new ArrayList<>(32);

private final BinaryPreparedStatementUnit binaryPreparedStatementUnit;
private final BinaryStatement binaryStatement;

private final JDBCBackendHandler jdbcBackendHandler;

public ComStmtExecutePacket(final int sequenceId, final MySQLPacketPayload payload, final BackendConnection backendConnection) {
this.sequenceId = sequenceId;
statementId = payload.readInt4();
binaryPreparedStatementUnit = PreparedStatementRegistry.getInstance().getBinaryPreparedStatementUnit(statementId);
binaryStatement = BinaryStatementRegistry.getInstance().getBinaryStatement(statementId);
flags = payload.readInt1();
Preconditions.checkArgument(ITERATION_COUNT == payload.readInt4());
int parametersCount = binaryPreparedStatementUnit.getParametersCount();
int parametersCount = binaryStatement.getParametersCount();
if (parametersCount > 0) {
nullBitmap = new NullBitmap(parametersCount, RESERVED_BIT_LENGTH);
for (int i = 0; i < nullBitmap.getNullBitmap().length; i++) {
Expand All @@ -95,7 +96,7 @@ public ComStmtExecutePacket(final int sequenceId, final MySQLPacketPayload paylo
nullBitmap = null;
newParametersBoundFlag = null;
}
jdbcBackendHandler = new JDBCBackendHandler(binaryPreparedStatementUnit.getSql(), JDBCExecuteEngineFactory.createBinaryProtocolInstance(preparedStatementParameters, backendConnection));
jdbcBackendHandler = new JDBCBackendHandler(binaryStatement.getSql(), JDBCExecuteEngineFactory.createBinaryProtocolInstance(preparedStatementParameters, backendConnection));
}

private void setParameterList(final MySQLPacketPayload payload, final int numParameters, final NewParametersBoundFlag newParametersBoundFlag) {
Expand All @@ -108,7 +109,7 @@ private void setParameterList(final MySQLPacketPayload payload, final int numPar
}

private void setParameterHeader(final MySQLPacketPayload payload, final int numParameters) {
List<PreparedStatementParameterHeader> parameterHeaders = new ArrayList<>(32);
List<BinaryStatementParameterHeader> parameterHeaders = new ArrayList<>(32);
for (int i = 0; i < numParameters; i++) {
if (nullBitmap.isParameterNull(i)) {
preparedStatementParameters.add(new PreparedStatementParameter(NULL_PARAMETER_DEFAULT_COLUMN_TYPE, NULL_PARAMETER_DEFAULT_UNSIGNED_FLAG, null));
Expand All @@ -117,19 +118,19 @@ private void setParameterHeader(final MySQLPacketPayload payload, final int numP
ColumnType columnType = ColumnType.valueOf(payload.readInt1());
int unsignedFlag = payload.readInt1();
preparedStatementParameters.add(new PreparedStatementParameter(columnType, unsignedFlag));
parameterHeaders.add(new PreparedStatementParameterHeader(columnType, unsignedFlag));
parameterHeaders.add(new BinaryStatementParameterHeader(columnType, unsignedFlag));
}
binaryPreparedStatementUnit.setPreparedStatementParameterHeaders(parameterHeaders);
binaryStatement.setParameterHeaders(parameterHeaders);
}

private void setParameterHeaderFromCache(final int numParameters) {
Iterator<PreparedStatementParameterHeader> parameterHeaders = binaryPreparedStatementUnit.getPreparedStatementParameterHeaders().iterator();
Iterator<BinaryStatementParameterHeader> parameterHeaders = binaryStatement.getParameterHeaders().iterator();
for (int i = 0; i < numParameters; i++) {
if (nullBitmap.isParameterNull(i)) {
preparedStatementParameters.add(new PreparedStatementParameter(NULL_PARAMETER_DEFAULT_COLUMN_TYPE, NULL_PARAMETER_DEFAULT_UNSIGNED_FLAG, null));
continue;
}
PreparedStatementParameterHeader preparedStatementParameterHeader = parameterHeaders.next();
BinaryStatementParameterHeader preparedStatementParameterHeader = parameterHeaders.next();
preparedStatementParameters.add(new PreparedStatementParameter(preparedStatementParameterHeader.getColumnType(), preparedStatementParameterHeader.getUnsignedFlag()));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.execute;

import io.shardingsphere.proxy.transport.mysql.constant.ColumnType;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.BinaryStatementParameterHeader;
import lombok.Getter;
import lombok.Setter;

Expand All @@ -30,16 +31,16 @@
@Setter
public final class PreparedStatementParameter {

private final PreparedStatementParameterHeader preparedStatementParameterHeader;
private final BinaryStatementParameterHeader preparedStatementParameterHeader;

private Object value;

public PreparedStatementParameter(final ColumnType columnType, final int unsignedFlag) {
preparedStatementParameterHeader = new PreparedStatementParameterHeader(columnType, unsignedFlag);
preparedStatementParameterHeader = new BinaryStatementParameterHeader(columnType, unsignedFlag);
}

public PreparedStatementParameter(final ColumnType columnType, final int unsignedFlag, final String value) {
preparedStatementParameterHeader = new PreparedStatementParameterHeader(columnType, unsignedFlag);
preparedStatementParameterHeader = new BinaryStatementParameterHeader(columnType, unsignedFlag);
this.value = value;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import io.shardingsphere.proxy.transport.mysql.packet.command.CommandPacket;
import io.shardingsphere.proxy.transport.mysql.packet.command.CommandResponsePackets;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.ColumnDefinition41Packet;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.PreparedStatementRegistry;
import io.shardingsphere.proxy.transport.mysql.packet.command.query.binary.BinaryStatementRegistry;
import io.shardingsphere.proxy.transport.mysql.packet.generic.EofPacket;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -47,7 +47,7 @@ public final class ComStmtPreparePacket implements CommandPacket {

private static final RuleRegistry RULE_REGISTRY = RuleRegistry.getInstance();

private static final PreparedStatementRegistry PREPARED_STATEMENT_REGISTRY = PreparedStatementRegistry.getInstance();
private static final BinaryStatementRegistry PREPARED_STATEMENT_REGISTRY = BinaryStatementRegistry.getInstance();

@Getter
private final int sequenceId;
Expand Down

0 comments on commit 216fcdd

Please sign in to comment.