Adding SendBytesWithResults option to receive data after sending a message (used by copy-both)
This commit is contained in:
committed by
Jack Christensen
parent
fdfc783345
commit
1debbfeec4
@@ -904,6 +904,51 @@ func (pgConn *PgConn) Exec(ctx context.Context, sql string) *MultiResultReader {
|
|||||||
return multiResult
|
return multiResult
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendBytesWithResults sends buf to the PostgreSQL server. It must only be used when the connection is not busy. e.g. It is as
|
||||||
|
// error to call SendBytes while reading the result of a query.
|
||||||
|
//
|
||||||
|
// This is a very low level method that requires deep understanding of the PostgreSQL wire protocol to use correctly.
|
||||||
|
// See https://www.postgresql.org/docs/current/protocol.html.
|
||||||
|
//
|
||||||
|
// So far this only seems required with CopyDone handling.
|
||||||
|
func (pgConn *PgConn) SendBytesWithResults(ctx context.Context, buf []byte) *MultiResultReader {
|
||||||
|
if err := pgConn.lock(); err != nil {
|
||||||
|
return &MultiResultReader{
|
||||||
|
closed: true,
|
||||||
|
err: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pgConn.multiResultReader = MultiResultReader{
|
||||||
|
pgConn: pgConn,
|
||||||
|
ctx: ctx,
|
||||||
|
}
|
||||||
|
multiResult := &pgConn.multiResultReader
|
||||||
|
if ctx != context.Background() {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
multiResult.closed = true
|
||||||
|
multiResult.err = &contextAlreadyDoneError{err: ctx.Err()}
|
||||||
|
pgConn.unlock()
|
||||||
|
return multiResult
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
pgConn.contextWatcher.Watch(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
n, err := pgConn.conn.Write(buf)
|
||||||
|
if err != nil {
|
||||||
|
pgConn.asyncClose()
|
||||||
|
pgConn.contextWatcher.Unwatch()
|
||||||
|
multiResult.closed = true
|
||||||
|
multiResult.err = &writeError{err: err, safeToRetry: n == 0}
|
||||||
|
pgConn.unlock()
|
||||||
|
return multiResult
|
||||||
|
}
|
||||||
|
|
||||||
|
return multiResult
|
||||||
|
}
|
||||||
|
|
||||||
// ExecParams executes a command via the PostgreSQL extended query protocol.
|
// ExecParams executes a command via the PostgreSQL extended query protocol.
|
||||||
//
|
//
|
||||||
// sql is a SQL command string. It may only contain one query. Parameter substitution is positional using $1, $2, $3,
|
// sql is a SQL command string. It may only contain one query. Parameter substitution is positional using $1, $2, $3,
|
||||||
|
|||||||
Reference in New Issue
Block a user