public class NativeProtocol extends AbstractProtocol<NativePacketPayload> implements Protocol<NativePacketPayload>, RuntimeProperty.RuntimePropertyListener
Protocol.ProtocolEventHandler, Protocol.ProtocolEventListener| Modifier and Type | Field and Description |
|---|---|
protected static int |
COMP_HEADER_LENGTH |
protected CompressedPacketSender |
compressedPacketSender
Track this to manually shut down.
|
protected boolean |
hadWarnings |
protected static int |
INITIAL_PACKET_SIZE |
protected static int |
MAX_QUERY_SIZE_TO_EXPLAIN |
protected MessageReader<NativePacketHeader,NativePacketPayload> |
packetReader |
protected MessageSender<NativePacketPayload> |
packetSender |
protected byte |
packetSequence |
protected java.util.Map<java.lang.Class<? extends ProtocolEntity>,ProtocolEntityReader<? extends ProtocolEntity,? extends Message>> |
PROTOCOL_ENTITY_CLASS_TO_BINARY_READER |
protected java.util.Map<java.lang.Class<? extends ProtocolEntity>,ProtocolEntityReader<? extends ProtocolEntity,? extends Message>> |
PROTOCOL_ENTITY_CLASS_TO_TEXT_READER |
protected NativePacketPayload |
reusablePacket
Use this when reading in rows to avoid thousands of new() calls, because the byte arrays just get copied out of the packet anyway
|
protected NativeServerSession |
serverSession |
protected NativePacketPayload |
sharedSendPacket |
protected static int |
SSL_REQUEST_LENGTH |
protected boolean |
useCompression |
authProvider, exceptionInterceptor, log, messageBuilder, packetDebugRingBuffer, propertySet, queryTimingUnits, session, socketConnection, transactionManager, useNanosForElapsedTime| Constructor and Description |
|---|
NativeProtocol(Log logger) |
| Modifier and Type | Method and Description |
|---|---|
void |
afterHandshake() |
void |
applyPacketDecorators(MessageSender<NativePacketPayload> sender,
MessageReader<NativePacketHeader,NativePacketPayload> messageReader)
Apply optional decorators to configured PacketSender and PacketReader.
|
void |
beforeHandshake() |
void |
changeDatabase(java.lang.String database) |
void |
changeUser(java.lang.String user,
java.lang.String password,
java.lang.String database)
Re-authenticates as the given user and password
|
NativePacketPayload |
checkErrorMessage()
Read one message from the MySQL server, checks for errors in it, and if none,
returns the message, ready for reading
|
void |
checkErrorMessage(NativePacketPayload resultPacket) |
void |
checkForOutstandingStreamingData() |
void |
checkTransactionState() |
void |
clearInputStream() |
void |
close() |
void |
configureTimeZone()
Configures the client's timezone if required.
|
void |
connect(java.lang.String user,
java.lang.String password,
java.lang.String database)
Create a new session.
|
java.sql.SQLWarning |
convertShowWarningsToSQLWarnings(boolean forTruncationOnly)
Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
|
void |
dumpPacketRingBuffer() |
void |
explainSlowQuery(java.lang.String query,
java.lang.String truncatedQuery)
Runs an 'EXPLAIN' on the given query and dumps the results to the log
|
static MysqlType |
findMysqlType(PropertySet propertySet,
int mysqlTypeId,
short colFlag,
long length,
LazyString tableName,
LazyString originalTableName,
int collationIndex,
java.lang.String encoding) |
java.lang.StringBuilder |
generateQueryCommentBlock(java.lang.StringBuilder buf) |
int |
getCommandCount() |
long |
getCurrentTimeNanosOrMillis() |
static NativeProtocol |
getInstance(Session session,
SocketConnection socketConnection,
PropertySet propertySet,
Log log,
TransactionEventHandler transactionManager) |
java.io.InputStream |
getLocalInfileInputStream()
Returns the InputStream instance that will be used to send
data in response to a "LOAD DATA LOCAL INFILE" statement.
|
MessageBuilder<NativePacketPayload> |
getMessageBuilder() |
BaseMetricsHolder |
getMetricsHolder() |
MessageReader<NativePacketHeader,NativePacketPayload> |
getPacketReader() |
MessageSender<NativePacketPayload> |
getPacketSender() |
java.lang.String |
getQueryComment()
Returns the comment that will be prepended to all statements
sent to the server.
|
java.util.List<QueryInterceptor> |
getQueryInterceptors() |
NativePacketPayload |
getReusablePacket() |
NativeServerSession |
getServerSession() |
NativePacketPayload |
getSharedSendPacket()
Returns the packet used for sending data (used by PreparedStatement) with position set to 0.
|
long |
getSlowQueryThreshold() |
ResultsetRows |
getStreamingData() |
java.util.function.Supplier<ValueEncoder> |
getValueEncoderSupplier(java.lang.Object obj) |
int |
getWarningCount() |
boolean |
hadWarnings() |
void |
handlePropertyChange(RuntimeProperty<?> prop) |
void |
init(Session sess,
SocketConnection phConnection,
PropertySet propSet,
TransactionEventHandler trManager)
Init method takes the place of constructor.
|
void |
initServerSession() |
<M extends Message> |
invokeQueryInterceptorsPost(M queryPacket,
M originalResponsePacket,
boolean forceExecute) |
<T extends Resultset> |
invokeQueryInterceptorsPost(java.util.function.Supplier<java.lang.String> sql,
Query interceptedQuery,
T originalResultSet,
boolean forceExecute) |
<M extends Message> |
invokeQueryInterceptorsPre(M queryPacket,
boolean forceExecute) |
<T extends Resultset> |
invokeQueryInterceptorsPre(java.util.function.Supplier<java.lang.String> sql,
Query interceptedQuery,
boolean forceExecute) |
protected boolean |
isDataAvailable() |
void |
negotiateSSLConnection()
Negotiates the SSL communications channel used when connecting
to a MySQL server that understands SSL.
|
NativePacketPayload |
probeMessage(NativePacketPayload reuse) |
void |
quit()
Log-off of the MySQL server and close the socket.
|
<T extends ProtocolEntity> |
read(java.lang.Class<Resultset> requiredClass,
int maxRows,
boolean streamResults,
NativePacketPayload resultPacket,
boolean isBinaryEncoded,
ColumnDefinition metadata,
ProtocolEntityFactory<T,NativePacketPayload> protocolEntityFactory)
Read protocol entity.
|
<T extends ProtocolEntity> |
read(java.lang.Class<T> requiredClass,
ProtocolEntityFactory<T,NativePacketPayload> protocolEntityFactory) |
<T extends Resultset> |
readAllResults(int maxRows,
boolean streamResults,
NativePacketPayload resultPacket,
boolean isBinaryEncoded,
ColumnDefinition metadata,
ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory) |
NativePacketPayload |
readMessage(NativePacketPayload reuse)
Read one message from the MySQL server into the reusable buffer if provided or into the new one.
|
ColumnDefinition |
readMetadata() |
<T extends ProtocolEntity> |
readNextResultset(T currentProtocolEntity,
int maxRows,
boolean streamResults,
boolean isBinaryEncoded,
ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory)
Read next result set from multi-result chain.
|
<T extends QueryResult> |
readQueryResult(ResultBuilder<T> resultBuilder)
Read messages from server and deliver them to resultBuilder.
|
NativeCapabilities |
readServerCapabilities()
Retrieve ServerCapabilities from server.
|
<T> T |
readServerStatusForResultSets(NativePacketPayload rowPacket,
boolean saveOldStatus) |
void |
reclaimLargeReusablePacket()
Don't hold on to overly-large packets
|
void |
rejectProtocol(NativePacketPayload msg) |
void |
releaseResources() |
void |
scanForAndThrowDataTruncation() |
void |
send(Message packet,
int packetLen) |
NativePacketPayload |
sendCommand(Message queryPacket,
boolean skipCheck,
int timeoutMillis)
Send a command to the MySQL server.
|
NativePacketPayload |
sendFileToServer(java.lang.String fileName)
Reads and sends a file to the server for LOAD DATA LOCAL INFILE
|
<T extends Resultset> |
sendQueryPacket(Query callingQuery,
NativePacketPayload queryPacket,
int maxRows,
boolean streamResults,
ColumnDefinition cachedMetadata,
ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory)
Send a query stored in a packet to the server.
|
<T extends Resultset> |
sendQueryString(Query callingQuery,
java.lang.String query,
java.lang.String characterEncoding,
int maxRows,
boolean streamResults,
ColumnDefinition cachedMetadata,
ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory)
Build a query packet from the given string and send it to the server.
|
void |
setHadWarnings(boolean hadWarnings) |
void |
setLocalInfileInputStream(java.io.InputStream stream)
Sets an InputStream instance that will be used to send data
to the MySQL server for a "LOAD DATA LOCAL INFILE" statement
rather than a FileInputStream or URLInputStream that represents
the path given as an argument to the statement.
|
void |
setQueryComment(java.lang.String comment)
Sets the comment that will be prepended to all statements
sent to the server.
|
void |
setQueryInterceptors(java.util.List<QueryInterceptor> queryInterceptors) |
void |
setSocketTimeout(int milliseconds) |
void |
setStreamingData(ResultsetRows streamingData) |
void |
setWarningCount(int warningCount) |
void |
skipPacket()
Reads and discards a single MySQL packet from the input stream.
|
void |
unsetStreamingData(ResultsetRows streamer) |
protected boolean |
useNanosForElapsedTime() |
boolean |
versionMeetsMinimum(int major,
int minor,
int subminor) |
addListener, getAuthenticationProvider, getExceptionInterceptor, getPacketReceivedTimeHolder, getPacketSentTimeHolder, getPropertySet, getQueryTimingUnits, getSocketConnection, invokeListeners, removeListener, reset, setPacketReceivedTimeHolder, setPacketSentTimeHolder, setPropertySetclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitgetAuthenticationProvider, getExceptionInterceptor, getPacketReceivedTimeHolder, getPacketSentTimeHolder, getPropertySet, getQueryTimingUnits, getSocketConnection, reset, setPacketReceivedTimeHolder, setPacketSentTimeHolder, setPropertySetprotected static final int INITIAL_PACKET_SIZE
protected static final int COMP_HEADER_LENGTH
protected static final int MAX_QUERY_SIZE_TO_EXPLAIN
protected static final int SSL_REQUEST_LENGTH
protected MessageSender<NativePacketPayload> packetSender
protected MessageReader<NativePacketHeader,NativePacketPayload> packetReader
protected NativeServerSession serverSession
protected CompressedPacketSender compressedPacketSender
protected NativePacketPayload sharedSendPacket
protected NativePacketPayload reusablePacket
protected byte packetSequence
protected boolean useCompression
protected boolean hadWarnings
protected java.util.Map<java.lang.Class<? extends ProtocolEntity>,ProtocolEntityReader<? extends ProtocolEntity,? extends Message>> PROTOCOL_ENTITY_CLASS_TO_TEXT_READER
protected java.util.Map<java.lang.Class<? extends ProtocolEntity>,ProtocolEntityReader<? extends ProtocolEntity,? extends Message>> PROTOCOL_ENTITY_CLASS_TO_BINARY_READER
public NativeProtocol(Log logger)
public static NativeProtocol getInstance(Session session, SocketConnection socketConnection, PropertySet propertySet, Log log, TransactionEventHandler transactionManager)
public void init(Session sess, SocketConnection phConnection, PropertySet propSet, TransactionEventHandler trManager)
Protocolinit in interface Protocol<NativePacketPayload>init in class AbstractProtocol<NativePacketPayload>sess - SessionphConnection - SocketConnectionpropSet - PropertySettrManager - TransactionEventHandlerpublic MessageBuilder<NativePacketPayload> getMessageBuilder()
getMessageBuilder in interface Protocol<NativePacketPayload>getMessageBuilder in class AbstractProtocol<NativePacketPayload>public MessageSender<NativePacketPayload> getPacketSender()
public MessageReader<NativePacketHeader,NativePacketPayload> getPacketReader()
public java.util.function.Supplier<ValueEncoder> getValueEncoderSupplier(java.lang.Object obj)
getValueEncoderSupplier in interface Protocol<NativePacketPayload>public void negotiateSSLConnection()
negotiateSSLConnection in interface Protocol<NativePacketPayload>public void rejectProtocol(NativePacketPayload msg)
public void beforeHandshake()
beforeHandshake in interface Protocol<NativePacketPayload>public void afterHandshake()
afterHandshake in interface Protocol<NativePacketPayload>public void handlePropertyChange(RuntimeProperty<?> prop)
handlePropertyChange in interface RuntimeProperty.RuntimePropertyListenerpublic void applyPacketDecorators(MessageSender<NativePacketPayload> sender, MessageReader<NativePacketHeader,NativePacketPayload> messageReader)
sender - MessageSendermessageReader - MessageReaderpublic NativeCapabilities readServerCapabilities()
ProtocolreadServerCapabilities in interface Protocol<NativePacketPayload>ServerCapabilitiespublic NativeServerSession getServerSession()
getServerSession in interface Protocol<NativePacketPayload>public void changeDatabase(java.lang.String database)
changeDatabase in interface Protocol<NativePacketPayload>public final NativePacketPayload readMessage(NativePacketPayload reuse)
ProtocolreadMessage in interface Protocol<NativePacketPayload>reuse - Message instance to read into, may be nullpublic final NativePacketPayload probeMessage(NativePacketPayload reuse)
public final void send(Message packet, int packetLen)
send in interface Protocol<NativePacketPayload>packet - MessagepacketLen - length of header + payloadpublic final NativePacketPayload sendCommand(Message queryPacket, boolean skipCheck, int timeoutMillis)
ProtocolsendCommand in interface Protocol<NativePacketPayload>queryPacket - a packet pre-loaded with data for the protocol (eg.
from a client-side prepared statement). The first byte of
this packet is the MySQL protocol 'command' from MysqlDefsskipCheck - do not call checkErrorPacket() if truetimeoutMillis - timeoutpublic void checkTransactionState()
public NativePacketPayload checkErrorMessage()
ProtocolcheckErrorMessage in interface Protocol<NativePacketPayload>public void checkErrorMessage(NativePacketPayload resultPacket)
public void clearInputStream()
public void reclaimLargeReusablePacket()
public final <T extends Resultset> T sendQueryString(Query callingQuery, java.lang.String query, java.lang.String characterEncoding, int maxRows, boolean streamResults, ColumnDefinition cachedMetadata, ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory) throws java.io.IOException
T - extends ResultsetcallingQuery - Queryquery - query stringcharacterEncoding - Java encoding namemaxRows - rows limitstreamResults - whether a stream result should be createdcachedMetadata - use this metadata instead of the one provided on wireresultSetFactory - ProtocolEntityFactoryjava.io.IOException - if an i/o error occurspublic final <T extends Resultset> T sendQueryPacket(Query callingQuery, NativePacketPayload queryPacket, int maxRows, boolean streamResults, ColumnDefinition cachedMetadata, ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory) throws java.io.IOException
T - extends ResultsetcallingQuery - QueryqueryPacket - NativePacketPayload containing querymaxRows - rows limitstreamResults - whether a stream result should be createdcachedMetadata - use this metadata instead of the one provided on wireresultSetFactory - ProtocolEntityFactoryjava.io.IOException - if an i/o error occurspublic <T extends Resultset> T invokeQueryInterceptorsPre(java.util.function.Supplier<java.lang.String> sql, Query interceptedQuery, boolean forceExecute)
public <M extends Message> M invokeQueryInterceptorsPre(M queryPacket, boolean forceExecute)
M - extends MessagequeryPacket - NativePacketPayload containing queryforceExecute - currently ignoredpublic <T extends Resultset> T invokeQueryInterceptorsPost(java.util.function.Supplier<java.lang.String> sql, Query interceptedQuery, T originalResultSet, boolean forceExecute)
public <M extends Message> M invokeQueryInterceptorsPost(M queryPacket, M originalResponsePacket, boolean forceExecute)
M - extends MessagequeryPacket - NativePacketPayload containing queryoriginalResponsePacket - NativePacketPayload containing responseforceExecute - currently ignoredpublic long getCurrentTimeNanosOrMillis()
public boolean hadWarnings()
public void setHadWarnings(boolean hadWarnings)
public void explainSlowQuery(java.lang.String query,
java.lang.String truncatedQuery)
query - full query stringtruncatedQuery - query string truncated for profilingpublic final void skipPacket()
CJException - if the network fails while skipping the
packet.public final void quit()
public NativePacketPayload getSharedSendPacket()
public void changeUser(java.lang.String user,
java.lang.String password,
java.lang.String database)
changeUser in interface Protocol<NativePacketPayload>user - user namepassword - passworddatabase - database nameprotected boolean useNanosForElapsedTime()
public long getSlowQueryThreshold()
public int getCommandCount()
public void setQueryInterceptors(java.util.List<QueryInterceptor> queryInterceptors)
public java.util.List<QueryInterceptor> getQueryInterceptors()
public void setSocketTimeout(int milliseconds)
public void releaseResources()
public void connect(java.lang.String user,
java.lang.String password,
java.lang.String database)
Protocolconnect in interface Protocol<NativePacketPayload>user - DB user namepassword - DB user passworddatabase - database nameprotected boolean isDataAvailable()
public NativePacketPayload getReusablePacket()
public int getWarningCount()
public void setWarningCount(int warningCount)
public void dumpPacketRingBuffer()
public boolean versionMeetsMinimum(int major,
int minor,
int subminor)
versionMeetsMinimum in interface Protocol<NativePacketPayload>public static MysqlType findMysqlType(PropertySet propertySet, int mysqlTypeId, short colFlag, long length, LazyString tableName, LazyString originalTableName, int collationIndex, java.lang.String encoding)
public <T extends ProtocolEntity> T read(java.lang.Class<T> requiredClass, ProtocolEntityFactory<T,NativePacketPayload> protocolEntityFactory) throws java.io.IOException
read in interface Protocol<NativePacketPayload>java.io.IOExceptionpublic <T extends ProtocolEntity> T read(java.lang.Class<Resultset> requiredClass, int maxRows, boolean streamResults, NativePacketPayload resultPacket, boolean isBinaryEncoded, ColumnDefinition metadata, ProtocolEntityFactory<T,NativePacketPayload> protocolEntityFactory) throws java.io.IOException
Protocolread in interface Protocol<NativePacketPayload>T - object extending the ProtocolEntityrequiredClass - required Resultset classmaxRows - the maximum number of rows to read (-1 means all rows)streamResults - should the driver leave the results on the wire,
and read them only when needed?resultPacket - the first packet of information in the result setisBinaryEncoded - true if the binary protocol is used (for server prepared statements)metadata - use this metadata instead of the one provided on wireprotocolEntityFactory - ProtocolEntityFactory instanceProtocolEntity instancejava.io.IOException - if an error occurspublic <T extends ProtocolEntity> T readNextResultset(T currentProtocolEntity, int maxRows, boolean streamResults, boolean isBinaryEncoded, ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory) throws java.io.IOException
T - extends ProtocolEntitycurrentProtocolEntity - T instancemaxRows - rows limitstreamResults - whether a stream result should be createdisBinaryEncoded - true for binary protocolresultSetFactory - ProtocolEntityFactoryjava.io.IOException - if an i/o error occurspublic <T extends Resultset> T readAllResults(int maxRows, boolean streamResults, NativePacketPayload resultPacket, boolean isBinaryEncoded, ColumnDefinition metadata, ProtocolEntityFactory<T,NativePacketPayload> resultSetFactory) throws java.io.IOException
java.io.IOExceptionpublic final <T> T readServerStatusForResultSets(NativePacketPayload rowPacket, boolean saveOldStatus)
public <T extends QueryResult> T readQueryResult(ResultBuilder<T> resultBuilder)
ProtocolreadQueryResult in interface Protocol<NativePacketPayload>T - result typeresultBuilder - ResultBuilder instanceQueryResultpublic java.io.InputStream getLocalInfileInputStream()
ProtocolgetLocalInfileInputStream in interface Protocol<NativePacketPayload>public void setLocalInfileInputStream(java.io.InputStream stream)
ProtocolsetLocalInfileInputStream in interface Protocol<NativePacketPayload>stream - input streampublic final NativePacketPayload sendFileToServer(java.lang.String fileName)
fileName - the file name to send.public ResultsetRows getStreamingData()
public void setStreamingData(ResultsetRows streamingData)
public void checkForOutstandingStreamingData()
public void unsetStreamingData(ResultsetRows streamer)
public void scanForAndThrowDataTruncation()
public java.lang.StringBuilder generateQueryCommentBlock(java.lang.StringBuilder buf)
public BaseMetricsHolder getMetricsHolder()
public java.lang.String getQueryComment()
ProtocolgetQueryComment in interface Protocol<NativePacketPayload>public void setQueryComment(java.lang.String comment)
ProtocolsetQueryComment in interface Protocol<NativePacketPayload>comment - query comment stringpublic java.sql.SQLWarning convertShowWarningsToSQLWarnings(boolean forTruncationOnly)
forTruncationOnly - if this method should only scan for data truncation warningspublic ColumnDefinition readMetadata()
readMetadata in interface Protocol<NativePacketPayload>public void close()
throws java.io.IOException
close in interface Protocol<NativePacketPayload>java.io.IOExceptionpublic void configureTimeZone()
configureTimeZone in interface Protocol<NativePacketPayload>CJException - if the timezone the server is configured to use can't be
mapped to a Java timezone.public void initServerSession()
initServerSession in interface Protocol<NativePacketPayload>