summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan UrbaƄski <wulczer@wulczer.org>2010-03-31 01:53:59 +0200
committerFederico Di Gregorio <fog@initd.org>2010-04-05 16:25:17 +0200
commit25a609c9a7379b758cd30f365e01d9601a67c37f (patch)
treeb6a09b289c7b6191858392f74486e3ae8242457e
parentb99eac18f8ff799f8ba109c7f440ec495806c8ad (diff)
downloadpsycopg2-25a609c9a7379b758cd30f365e01d9601a67c37f.tar.gz
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.
-rw-r--r--psycopg/connection_int.c22
-rw-r--r--psycopg/connection_type.c2
2 files changed, 17 insertions, 7 deletions
diff --git a/psycopg/connection_int.c b/psycopg/connection_int.c
index 0fce84d..baca47f 100644
--- a/psycopg/connection_int.c
+++ b/psycopg/connection_int.c
@@ -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) {
diff --git a/psycopg/connection_type.c b/psycopg/connection_type.c
index f80eba1..efbe9e6 100644
--- a/psycopg/connection_type.c
+++ b/psycopg/connection_type.c
@@ -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);