mirror of
https://github.com/psycopg/psycopg2.git
synced 2025-02-28 14:30:32 +03:00
Handle initial connection queries being sent partly
The CONN_STATUS_SENT_* statuses were not being handled at all, and they indicate that a query has been sent, but not fully, so the client should wait for the socket to become writable again and flush the output.
This commit is contained in:
parent
b99eac18f8
commit
25a609c9a7
|
@ -387,7 +387,7 @@ conn_connect(connectionObject *self, long int async)
|
|||
PyObject *
|
||||
conn_poll_send(connectionObject *self)
|
||||
{
|
||||
const char *query;
|
||||
const char *query = NULL;
|
||||
int next_status;
|
||||
int ret;
|
||||
|
||||
|
@ -404,6 +404,12 @@ conn_poll_send(connectionObject *self)
|
|||
query = psyco_client_encoding;
|
||||
next_status = CONN_STATUS_SENT_CLIENT_ENCODING;
|
||||
break;
|
||||
case CONN_STATUS_SENT_DATESTYLE:
|
||||
case CONN_STATUS_SENT_CLIENT_ENCODING:
|
||||
/* the query has only been partially sent */
|
||||
query = NULL;
|
||||
next_status = self->status;
|
||||
break;
|
||||
default:
|
||||
/* unexpected state, error out */
|
||||
PyErr_Format(OperationalError,
|
||||
|
@ -416,12 +422,14 @@ conn_poll_send(connectionObject *self)
|
|||
Py_BEGIN_ALLOW_THREADS;
|
||||
pthread_mutex_lock(&(self->lock));
|
||||
|
||||
if (PQsendQuery(self->pgconn, query) != 1) {
|
||||
pthread_mutex_unlock(&(self->lock));
|
||||
Py_BLOCK_THREADS;
|
||||
PyErr_SetString(OperationalError,
|
||||
PQerrorMessage(self->pgconn));
|
||||
return NULL;
|
||||
if (query != NULL) {
|
||||
if (PQsendQuery(self->pgconn, query) != 1) {
|
||||
pthread_mutex_unlock(&(self->lock));
|
||||
Py_BLOCK_THREADS;
|
||||
PyErr_SetString(OperationalError,
|
||||
PQerrorMessage(self->pgconn));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (PQflush(self->pgconn) == 0) {
|
||||
|
|
|
@ -426,7 +426,9 @@ psyco_conn_poll(connectionObject *self)
|
|||
switch (self->status) {
|
||||
|
||||
case CONN_STATUS_SEND_DATESTYLE:
|
||||
case CONN_STATUS_SENT_DATESTYLE:
|
||||
case CONN_STATUS_SEND_CLIENT_ENCODING:
|
||||
case CONN_STATUS_SENT_CLIENT_ENCODING:
|
||||
/* these mean that we need to wait for the socket to become writable
|
||||
to send the rest of our query */
|
||||
return conn_poll_send(self);
|
||||
|
|
Loading…
Reference in New Issue
Block a user