mirror of
				https://github.com/psycopg/psycopg2.git
				synced 2025-10-30 23:37:29 +03:00 
			
		
		
		
	Simplified psyco_wait() function interface.
This commit is contained in:
		
							parent
							
								
									8efa1fa6af
								
							
						
					
					
						commit
						2596cf7125
					
				|  | @ -346,7 +346,6 @@ static int | ||||||
| _conn_sync_connect(connectionObject *self) | _conn_sync_connect(connectionObject *self) | ||||||
| { | { | ||||||
|     PGconn *pgconn; |     PGconn *pgconn; | ||||||
|     PyObject *wait_rv; |  | ||||||
|     int green; |     int green; | ||||||
| 
 | 
 | ||||||
|     /* store this value to prevent inconsistencies due to a change
 |     /* store this value to prevent inconsistencies due to a change
 | ||||||
|  | @ -382,10 +381,7 @@ _conn_sync_connect(connectionObject *self) | ||||||
| 
 | 
 | ||||||
|     /* if the connection is green, wait to finish connection */ |     /* if the connection is green, wait to finish connection */ | ||||||
|     if (green) { |     if (green) { | ||||||
|         wait_rv = psyco_wait(self); |         if (0 != psyco_wait(self)) { | ||||||
|         if (wait_rv) { |  | ||||||
|             Py_DECREF(wait_rv); |  | ||||||
|         } else { |  | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -114,9 +114,9 @@ have_wait_callback() | ||||||
|  * raise `InterfaceError` if it is not. Use `psyco_green()` to check if |  * raise `InterfaceError` if it is not. Use `psyco_green()` to check if | ||||||
|  * the function is to be called. |  * the function is to be called. | ||||||
|  * |  * | ||||||
|  * The function returns the return value of the called function. |  * Return 0 on success, else nonzero and set a Python exception. | ||||||
|  */ |  */ | ||||||
| PyObject * | int | ||||||
| psyco_wait(connectionObject *conn) | psyco_wait(connectionObject *conn) | ||||||
| { | { | ||||||
|     PyObject *rv; |     PyObject *rv; | ||||||
|  | @ -124,13 +124,19 @@ psyco_wait(connectionObject *conn) | ||||||
| 
 | 
 | ||||||
|     Dprintf("psyco_wait"); |     Dprintf("psyco_wait"); | ||||||
|     if (!(cb = have_wait_callback())) { |     if (!(cb = have_wait_callback())) { | ||||||
|         return NULL; |         return -1; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     rv = PyObject_CallFunctionObjArgs(cb, conn, NULL); |     rv = PyObject_CallFunctionObjArgs(cb, conn, NULL); | ||||||
|     Py_DECREF(cb); |     Py_DECREF(cb); | ||||||
| 
 | 
 | ||||||
|     return rv; |     if (NULL != rv) { | ||||||
|  |         Py_DECREF(rv); | ||||||
|  |         return 0; | ||||||
|  |     } else { | ||||||
|  |         Dprintf("psyco_wait: error in wait callback"); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Replacement for PQexec using the user-provided wait function.
 | /* Replacement for PQexec using the user-provided wait function.
 | ||||||
|  | @ -145,16 +151,10 @@ PGresult * | ||||||
| psyco_exec_green(connectionObject *conn, const char *command) | psyco_exec_green(connectionObject *conn, const char *command) | ||||||
| { | { | ||||||
|     PGresult *result = NULL; |     PGresult *result = NULL; | ||||||
|     PyObject *cb, *pyrv; |  | ||||||
| 
 |  | ||||||
|     Dprintf("psyco_exec_green: executing query async"); |  | ||||||
|     if (!(cb = have_wait_callback())) { |  | ||||||
|         goto end; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     /* Send the query asynchronously */ |     /* Send the query asynchronously */ | ||||||
|     if (0 == pq_send_query(conn, command)) { |     if (0 == pq_send_query(conn, command)) { | ||||||
|         goto clear; |         goto end; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Enter the poll loop with a write. When writing is finished the poll
 |     /* Enter the poll loop with a write. When writing is finished the poll
 | ||||||
|  | @ -163,21 +163,16 @@ psyco_exec_green(connectionObject *conn, const char *command) | ||||||
|     */ |     */ | ||||||
|     conn->async_status = ASYNC_WRITE; |     conn->async_status = ASYNC_WRITE; | ||||||
| 
 | 
 | ||||||
|     pyrv = PyObject_CallFunctionObjArgs(cb, conn, NULL); |     if (0 != psyco_wait(conn)) { | ||||||
|     if (!pyrv) { |  | ||||||
|         Dprintf("psyco_exec_green: error in wait callback"); |  | ||||||
|         psyco_clear_result_blocking(conn); |         psyco_clear_result_blocking(conn); | ||||||
|         goto clear; |         goto end; | ||||||
|     } |     } | ||||||
|     Py_DECREF(pyrv); |  | ||||||
| 
 | 
 | ||||||
|     /* Now we can read the data without fear of blocking. */ |     /* Now we can read the data without fear of blocking. */ | ||||||
|     result = pq_get_last_result(conn); |     result = pq_get_last_result(conn); | ||||||
| 
 | 
 | ||||||
| clear: |  | ||||||
|     conn->async_status = ASYNC_DONE; |  | ||||||
|     Py_DECREF(cb); |  | ||||||
| end: | end: | ||||||
|  |     conn->async_status = ASYNC_DONE; | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -59,7 +59,7 @@ HIDDEN PyObject *psyco_set_wait_callback(PyObject *self, PyObject *obj); | ||||||
| HIDDEN PyObject *psyco_get_wait_callback(PyObject *self, PyObject *obj); | HIDDEN PyObject *psyco_get_wait_callback(PyObject *self, PyObject *obj); | ||||||
| 
 | 
 | ||||||
| HIDDEN int psyco_green(void); | HIDDEN int psyco_green(void); | ||||||
| HIDDEN PyObject *psyco_wait(connectionObject *conn); | HIDDEN int psyco_wait(connectionObject *conn); | ||||||
| HIDDEN PGresult *psyco_exec_green(connectionObject *conn, const char *command); | HIDDEN PGresult *psyco_exec_green(connectionObject *conn, const char *command); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user