public class NativeProtocol extends AbstractProtocol<NativePacketPayload> implements Protocol<NativePacketPayload>, RuntimeProperty.RuntimePropertyListener
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 boolean |
platformDbCharsetMatches
Does the character set of this connection match the character set of the
platform
|
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 |
checkForCharsetMismatch()
Determines if the database charset is the same as the platform charset
|
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(int warningCountIfKnown,
boolean forTruncationOnly)
Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
|
boolean |
doesPlatformDbCharsetMatches() |
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 |
getPasswordCharacterEncoding() |
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() |
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.
|
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) |
getAuthenticationProvider, getExceptionInterceptor, getPacketReceivedTimeHolder, getPacketSentTimeHolder, getPropertySet, getQueryTimingUnits, getSocketConnection, reset, setPacketReceivedTimeHolder, setPacketSentTimeHolder, setPropertySet
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getAuthenticationProvider, getExceptionInterceptor, getPacketReceivedTimeHolder, getPacketSentTimeHolder, getPropertySet, getQueryTimingUnits, getSocketConnection, reset, setPacketReceivedTimeHolder, setPacketSentTimeHolder, setPropertySet
protected 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
protected boolean platformDbCharsetMatches
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)
Protocol
init
in interface Protocol<NativePacketPayload>
init
in class AbstractProtocol<NativePacketPayload>
sess
- Session
phConnection
- SocketConnection
propSet
- PropertySet
trManager
- TransactionEventHandler
public MessageBuilder<NativePacketPayload> getMessageBuilder()
getMessageBuilder
in interface Protocol<NativePacketPayload>
getMessageBuilder
in class AbstractProtocol<NativePacketPayload>
public MessageSender<NativePacketPayload> getPacketSender()
public MessageReader<NativePacketHeader,NativePacketPayload> getPacketReader()
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.RuntimePropertyListener
public void applyPacketDecorators(MessageSender<NativePacketPayload> sender, MessageReader<NativePacketHeader,NativePacketPayload> messageReader)
sender
- MessageSender
messageReader
- MessageReader
public NativeCapabilities readServerCapabilities()
Protocol
readServerCapabilities
in interface Protocol<NativePacketPayload>
ServerCapabilities
public 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)
Protocol
readMessage
in interface Protocol<NativePacketPayload>
reuse
- Message
instance to read into, may be nullpublic final void send(Message packet, int packetLen)
send
in interface Protocol<NativePacketPayload>
packet
- Message
packetLen
- length of header + payloadpublic final NativePacketPayload sendCommand(Message queryPacket, boolean skipCheck, int timeoutMillis)
Protocol
sendCommand
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()
Protocol
checkErrorMessage
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 Resultset
callingQuery
- Query
query
- query stringcharacterEncoding
- Java encoding namemaxRows
- rows limitstreamResults
- whether a stream result should be createdcachedMetadata
- use this metadata instead of the one provided on wireresultSetFactory
- ProtocolEntityFactory
java.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 Resultset
callingQuery
- Query
queryPacket
- NativePacketPayload
containing querymaxRows
- rows limitstreamResults
- whether a stream result should be createdcachedMetadata
- use this metadata instead of the one provided on wireresultSetFactory
- ProtocolEntityFactory
java.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 Message
queryPacket
- 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 Message
queryPacket
- 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 namepublic void checkForCharsetMismatch()
protected 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)
Protocol
connect
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 doesPlatformDbCharsetMatches()
public java.lang.String getPasswordCharacterEncoding()
getPasswordCharacterEncoding
in interface Protocol<NativePacketPayload>
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.IOException
public <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
Protocol
read
in interface Protocol<NativePacketPayload>
T
- object extending the ProtocolEntity
requiredClass
- 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 ProtocolEntity
currentProtocolEntity
- T instancemaxRows
- rows limitstreamResults
- whether a stream result should be createdisBinaryEncoded
- true for binary protocolresultSetFactory
- ProtocolEntityFactory
java.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.IOException
public final <T> T readServerStatusForResultSets(NativePacketPayload rowPacket, boolean saveOldStatus)
public <T extends QueryResult> T readQueryResult(ResultBuilder<T> resultBuilder)
Protocol
readQueryResult
in interface Protocol<NativePacketPayload>
T
- result typeresultBuilder
- ResultBuilder
instanceQueryResult
public java.io.InputStream getLocalInfileInputStream()
Protocol
getLocalInfileInputStream
in interface Protocol<NativePacketPayload>
public void setLocalInfileInputStream(java.io.InputStream stream)
Protocol
setLocalInfileInputStream
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()
Protocol
getQueryComment
in interface Protocol<NativePacketPayload>
public void setQueryComment(java.lang.String comment)
Protocol
setQueryComment
in interface Protocol<NativePacketPayload>
comment
- query comment stringpublic java.sql.SQLWarning convertShowWarningsToSQLWarnings(int warningCountIfKnown, boolean forTruncationOnly)
warningCountIfKnown
- the warning count (if known), otherwise set it to 0.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.IOException
public 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>