Package org.postgresql.core.v3
Class QueryExecutorImpl
- java.lang.Object
-
- org.postgresql.core.QueryExecutorBase
-
- org.postgresql.core.v3.QueryExecutorImpl
-
- All Implemented Interfaces:
QueryExecutor
,TypeTransferModeRegistry
public class QueryExecutorImpl extends QueryExecutorBase
QueryExecutor implementation for the V3 protocol.
-
-
Field Summary
-
Fields inherited from class org.postgresql.core.QueryExecutorBase
logServerErrorDetail, pgStream
-
Fields inherited from interface org.postgresql.core.QueryExecutor
MAX_SAVE_POINTS, QUERY_BOTH_ROWS_AND_STATUS, QUERY_DESCRIBE_ONLY, QUERY_DISALLOW_BATCHING, QUERY_EXECUTE_AS_SIMPLE, QUERY_FORCE_DESCRIBE_PORTAL, QUERY_FORWARD_CURSOR, QUERY_NO_BINARY_TRANSFER, QUERY_NO_METADATA, QUERY_NO_RESULTS, QUERY_ONESHOT, QUERY_READ_ONLY_HINT, QUERY_SUPPRESS_BEGIN
-
-
Constructor Summary
Constructors Constructor Description QueryExecutorImpl(PGStream pgStream, java.lang.String user, java.lang.String database, int cancelSignalTimeout, java.util.Properties info)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
cancelCopy(CopyOperationImpl op)
Finishes a copy operation and unlocks connection discarding any exchanged data.ParameterList
createFastpathParameters(int count)
Create a new ParameterList implementation suitable for invoking a fastpath function viaQueryExecutor.fastpathCall(int, org.postgresql.core.ParameterList, boolean)
.Query
createSimpleQuery(java.lang.String sql)
Create an unparameterized Query object suitable for execution by this QueryExecutor.void
doSubprotocolBegin()
long
endCopy(CopyOperationImpl op)
Finishes writing to copy and unlocks connection.void
execute(Query[] queries, ParameterList[] parameterLists, BatchResultHandler batchHandler, int maxRows, int fetchSize, int flags)
Execute several Query, passing results to a provided ResultHandler.void
execute(Query query, ParameterList parameters, ResultHandler handler, int maxRows, int fetchSize, int flags)
Execute a Query, passing results to a provided ResultHandler.byte[]
fastpathCall(int fnid, ParameterList parameters, boolean suppressBegin)
Invoke a backend function via the fastpath interface.void
fetch(ResultCursor cursor, ResultHandler handler, int fetchSize)
Fetch additional rows from a cursor.void
flushCopy(CopyOperationImpl op)
java.lang.String
getApplicationName()
Returns application_name connection property.boolean
getIntegerDateTimes()
Returns true if server uses integer instead of double for binary date and time encodings.int
getProtocolVersion()
ReplicationProtocol
getReplicationProtocol()
java.util.TimeZone
getTimeZone()
Returns backend timezone in java format.void
processNotifies()
Prior to attempting to retrieve notifications, we need to pull any recently received notifications off of the network buffers.void
processNotifies(int timeoutMillis)
Prior to attempting to retrieve notifications, we need to pull any recently received notifications off of the network buffers.protected void
processResults(ResultHandler handler, int flags)
void
readStartupMessages()
void
receiveParameterStatus()
protected void
sendCloseMessage()
void
setApplicationName(java.lang.String applicationName)
void
setBinaryReceiveOids(java.util.Set<java.lang.Integer> oids)
Sets the oids that should be received using binary encoding.void
setBinarySendOids(java.util.Set<java.lang.Integer> oids)
Sets the oids that should be sent using binary encoding.void
setTimeZone(java.util.TimeZone timeZone)
CopyOperation
startCopy(java.lang.String sql, boolean suppressBegin)
Sends given query to BE to start, initialize and lock connection for a CopyOperation.boolean
useBinaryForReceive(int oid)
Returns if given oid should be received in binary format.boolean
useBinaryForSend(int oid)
Returns if given oid should be sent in binary format.Query
wrap(java.util.List<NativeQuery> queries)
Wrap given native query into a ready for execution format.void
writeToCopy(CopyOperationImpl op, byte[] data, int off, int siz)
Sends data during a live COPY IN operation.void
writeToCopy(CopyOperationImpl op, ByteStreamWriter from)
Sends data during a live COPY IN operation.-
Methods inherited from class org.postgresql.core.QueryExecutorBase
abort, addNotification, addWarning, borrowCallableQuery, borrowQuery, borrowQueryByKey, borrowReturningQuery, close, createQuery, createQueryByKey, createQueryKey, getAutoSave, getBackendPID, getDatabase, getEncoding, getEscapeSyntaxCallMode, getHostSpec, getNetworkTimeout, getNotifications, getParameterStatus, getParameterStatuses, getPreferQueryMode, getServerVersion, getServerVersionNum, getStandardConformingStrings, getTransactionState, getUser, getWarnings, hasNotifications, isClosed, isColumnSanitiserDisabled, isFlushCacheOnDeallocate, isReWriteBatchedInsertsEnabled, onParameterStatus, releaseQuery, sendQueryCancel, setAutoSave, setBackendKeyData, setEncoding, setFlushCacheOnDeallocate, setNetworkTimeout, setServerVersion, setServerVersionNum, setStandardConformingStrings, setTransactionState, willHealOnRetry, willHealViaReparse
-
-
-
-
Constructor Detail
-
QueryExecutorImpl
public QueryExecutorImpl(PGStream pgStream, java.lang.String user, java.lang.String database, int cancelSignalTimeout, java.util.Properties info) throws java.sql.SQLException, java.io.IOException
- Throws:
java.sql.SQLException
java.io.IOException
-
-
Method Detail
-
getProtocolVersion
public int getProtocolVersion()
- Returns:
- the version of the implementation
-
createSimpleQuery
public Query createSimpleQuery(java.lang.String sql) throws java.sql.SQLException
Description copied from interface:QueryExecutor
Create an unparameterized Query object suitable for execution by this QueryExecutor. The provided query string is not parsed for parameter placeholders ('?' characters), and theQuery.createParameterList()
of the returned object will always return an empty ParameterList.- Parameters:
sql
- the SQL for the query to create- Returns:
- a new Query object
- Throws:
java.sql.SQLException
- if something goes wrong
-
wrap
public Query wrap(java.util.List<NativeQuery> queries)
Description copied from interface:QueryExecutor
Wrap given native query into a ready for execution format.- Parameters:
queries
- list of queries in native to database syntax- Returns:
- query object ready for execution by this query executor
-
execute
public void execute(Query query, ParameterList parameters, ResultHandler handler, int maxRows, int fetchSize, int flags) throws java.sql.SQLException
Description copied from interface:QueryExecutor
Execute a Query, passing results to a provided ResultHandler.- Parameters:
query
- the query to execute; must be a query returned from callingQueryExecutor.wrap(List)
on this QueryExecutor object.parameters
- the parameters for the query. Must be non-null
if the query takes parameters. Must be a parameter object returned byQuery.createParameterList()
.handler
- a ResultHandler responsible for handling results generated by this querymaxRows
- the maximum number of rows to retrievefetchSize
- if QUERY_FORWARD_CURSOR is set, the preferred number of rows to retrieve before suspendingflags
- a combination of QUERY_* flags indicating how to handle the query.- Throws:
java.sql.SQLException
- if query execution fails
-
execute
public void execute(Query[] queries, ParameterList[] parameterLists, BatchResultHandler batchHandler, int maxRows, int fetchSize, int flags) throws java.sql.SQLException
Description copied from interface:QueryExecutor
Execute several Query, passing results to a provided ResultHandler.- Parameters:
queries
- the queries to execute; each must be a query returned from callingQueryExecutor.wrap(List)
on this QueryExecutor object.parameterLists
- the parameter lists for the queries. The parameter lists correspond 1:1 to the queries passed in thequeries
array. Each must be non-null
if the corresponding query takes parameters, and must be a parameter object returned byQuery.createParameterList()
created by the corresponding query.batchHandler
- a ResultHandler responsible for handling results generated by this querymaxRows
- the maximum number of rows to retrievefetchSize
- if QUERY_FORWARD_CURSOR is set, the preferred number of rows to retrieve before suspendingflags
- a combination of QUERY_* flags indicating how to handle the query.- Throws:
java.sql.SQLException
- if query execution fails
-
fastpathCall
public byte[] fastpathCall(int fnid, ParameterList parameters, boolean suppressBegin) throws java.sql.SQLException
Description copied from interface:QueryExecutor
Invoke a backend function via the fastpath interface.- Parameters:
fnid
- the OID of the backend function to invokeparameters
- a ParameterList returned fromQueryExecutor.createFastpathParameters(int)
containing the parameters to pass to the backend functionsuppressBegin
- if begin should be suppressed- Returns:
- the binary-format result of the fastpath call, or
null
if a void result was returned - Throws:
java.sql.SQLException
- if an error occurs while executing the fastpath call
-
doSubprotocolBegin
public void doSubprotocolBegin() throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createFastpathParameters
public ParameterList createFastpathParameters(int count)
Description copied from interface:QueryExecutor
Create a new ParameterList implementation suitable for invoking a fastpath function viaQueryExecutor.fastpathCall(int, org.postgresql.core.ParameterList, boolean)
.- Parameters:
count
- the number of parameters the fastpath call will take- Returns:
- a ParameterList suitable for passing to
QueryExecutor.fastpathCall(int, org.postgresql.core.ParameterList, boolean)
.
-
processNotifies
public void processNotifies() throws java.sql.SQLException
Description copied from interface:QueryExecutor
Prior to attempting to retrieve notifications, we need to pull any recently received notifications off of the network buffers. The notification retrieval in ProtocolConnection cannot do this as it is prone to deadlock, so the higher level caller must be responsible which requires exposing this method.- Throws:
java.sql.SQLException
- if and error occurs while fetching notifications
-
processNotifies
public void processNotifies(int timeoutMillis) throws java.sql.SQLException
Description copied from interface:QueryExecutor
Prior to attempting to retrieve notifications, we need to pull any recently received notifications off of the network buffers. The notification retrieval in ProtocolConnection cannot do this as it is prone to deadlock, so the higher level caller must be responsible which requires exposing this method. This variant supports blocking for the given time in millis.- Parameters:
timeoutMillis
- when > 0, block for this time when =0, block forever when < 0, don't block- Throws:
java.sql.SQLException
- if and error occurs while fetching notifications
-
startCopy
public CopyOperation startCopy(java.lang.String sql, boolean suppressBegin) throws java.sql.SQLException
Sends given query to BE to start, initialize and lock connection for a CopyOperation.- Parameters:
sql
- COPY FROM STDIN / COPY TO STDOUT statementsuppressBegin
- if begin should be suppressed- Returns:
- CopyIn or CopyOut operation object
- Throws:
java.sql.SQLException
- on failure
-
cancelCopy
public void cancelCopy(CopyOperationImpl op) throws java.sql.SQLException
Finishes a copy operation and unlocks connection discarding any exchanged data.- Parameters:
op
- the copy operation presumably currently holding lock on this connection- Throws:
java.sql.SQLException
- on any additional failure
-
endCopy
public long endCopy(CopyOperationImpl op) throws java.sql.SQLException
Finishes writing to copy and unlocks connection.- Parameters:
op
- the copy operation presumably currently holding lock on this connection- Returns:
- number of rows updated for server versions 8.2 or newer
- Throws:
java.sql.SQLException
- on failure
-
writeToCopy
public void writeToCopy(CopyOperationImpl op, byte[] data, int off, int siz) throws java.sql.SQLException
Sends data during a live COPY IN operation. Only unlocks the connection if server suddenly returns CommandComplete, which should not happen- Parameters:
op
- the CopyIn operation presumably currently holding lock on this connectiondata
- bytes to sendoff
- index of first byte to send (usually 0)siz
- number of bytes to send (usually data.length)- Throws:
java.sql.SQLException
- on failure
-
writeToCopy
public void writeToCopy(CopyOperationImpl op, ByteStreamWriter from) throws java.sql.SQLException
Sends data during a live COPY IN operation. Only unlocks the connection if server suddenly returns CommandComplete, which should not happen- Parameters:
op
- the CopyIn operation presumably currently holding lock on this connectionfrom
- the source of bytes, e.g. a ByteBufferByteStreamWriter- Throws:
java.sql.SQLException
- on failure
-
flushCopy
public void flushCopy(CopyOperationImpl op) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
processResults
protected void processResults(ResultHandler handler, int flags) throws java.io.IOException
- Throws:
java.io.IOException
-
fetch
public void fetch(ResultCursor cursor, ResultHandler handler, int fetchSize) throws java.sql.SQLException
Description copied from interface:QueryExecutor
Fetch additional rows from a cursor.- Parameters:
cursor
- the cursor to fetch fromhandler
- the handler to feed results tofetchSize
- the preferred number of rows to retrieve before suspending- Throws:
java.sql.SQLException
- if query execution fails
-
sendCloseMessage
protected void sendCloseMessage() throws java.io.IOException
- Specified by:
sendCloseMessage
in classQueryExecutorBase
- Throws:
java.io.IOException
-
readStartupMessages
public void readStartupMessages() throws java.io.IOException, java.sql.SQLException
- Throws:
java.io.IOException
java.sql.SQLException
-
receiveParameterStatus
public void receiveParameterStatus() throws java.io.IOException, java.sql.SQLException
- Throws:
java.io.IOException
java.sql.SQLException
-
setTimeZone
public void setTimeZone(java.util.TimeZone timeZone)
-
getTimeZone
public java.util.TimeZone getTimeZone()
Description copied from interface:QueryExecutor
Returns backend timezone in java format.- Returns:
- backend timezone in java format.
-
setApplicationName
public void setApplicationName(java.lang.String applicationName)
-
getApplicationName
public java.lang.String getApplicationName()
Description copied from interface:QueryExecutor
Returns application_name connection property.- Returns:
- application_name connection property
-
getReplicationProtocol
public ReplicationProtocol getReplicationProtocol()
- Returns:
- the ReplicationProtocol instance for this connection.
-
useBinaryForReceive
public boolean useBinaryForReceive(int oid)
Description copied from interface:TypeTransferModeRegistry
Returns if given oid should be received in binary format.- Parameters:
oid
- type oid- Returns:
- true if given oid should be received in binary format
-
setBinaryReceiveOids
public void setBinaryReceiveOids(java.util.Set<java.lang.Integer> oids)
Description copied from interface:QueryExecutor
Sets the oids that should be received using binary encoding.- Parameters:
oids
- The oids to request with binary encoding.
-
useBinaryForSend
public boolean useBinaryForSend(int oid)
Description copied from interface:TypeTransferModeRegistry
Returns if given oid should be sent in binary format.- Parameters:
oid
- type oid- Returns:
- true if given oid should be sent in binary format
-
setBinarySendOids
public void setBinarySendOids(java.util.Set<java.lang.Integer> oids)
Description copied from interface:QueryExecutor
Sets the oids that should be sent using binary encoding.- Parameters:
oids
- The oids to send with binary encoding.
-
getIntegerDateTimes
public boolean getIntegerDateTimes()
Description copied from interface:QueryExecutor
Returns true if server uses integer instead of double for binary date and time encodings.- Returns:
- the server integer_datetime setting.
-
-