mirror of
				https://github.com/psycopg/psycopg2.git
				synced 2025-11-04 01:37:31 +03:00 
			
		
		
		
	xid_get_tid returns a Python string, not a buffer.
This commit is contained in:
		
							parent
							
								
									774be1d616
								
							
						
					
					
						commit
						4fdcfe365c
					
				| 
						 | 
				
			
			@ -939,18 +939,20 @@ conn_tpc_command(connectionObject *self, const char *cmd, XidObject *xid)
 | 
			
		|||
{
 | 
			
		||||
    PGresult *pgres = NULL;
 | 
			
		||||
    char *error = NULL;
 | 
			
		||||
    char *tid = NULL;
 | 
			
		||||
    PyObject *tid = NULL;
 | 
			
		||||
    const char *ctid;
 | 
			
		||||
    int rv = -1;
 | 
			
		||||
 | 
			
		||||
    Dprintf("conn_tpc_command: %s", cmd);
 | 
			
		||||
 | 
			
		||||
    /* convert the xid into PostgreSQL transaction id while keeping the GIL */
 | 
			
		||||
    if (!(tid = xid_get_tid(xid))) { goto exit; }
 | 
			
		||||
    if (!(ctid = PyString_AsString(tid))) { goto exit; }
 | 
			
		||||
 | 
			
		||||
    Py_BEGIN_ALLOW_THREADS;
 | 
			
		||||
    pthread_mutex_lock(&self->lock);
 | 
			
		||||
 | 
			
		||||
    if (0 > (rv = pq_tpc_command_locked(self, cmd, tid,
 | 
			
		||||
    if (0 > (rv = pq_tpc_command_locked(self, cmd, ctid,
 | 
			
		||||
                                        &pgres, &error, &_save))) {
 | 
			
		||||
        pthread_mutex_unlock(&self->lock);
 | 
			
		||||
        Py_BLOCK_THREADS;
 | 
			
		||||
| 
						 | 
				
			
			@ -962,7 +964,7 @@ conn_tpc_command(connectionObject *self, const char *cmd, XidObject *xid)
 | 
			
		|||
    Py_END_ALLOW_THREADS;
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    PyMem_Free(tid);
 | 
			
		||||
    Py_XDECREF(tid);
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ typedef struct {
 | 
			
		|||
 | 
			
		||||
HIDDEN XidObject *xid_ensure(PyObject *oxid);
 | 
			
		||||
HIDDEN XidObject *xid_from_string(PyObject *s);
 | 
			
		||||
HIDDEN char *xid_get_tid(XidObject *self);
 | 
			
		||||
HIDDEN PyObject *xid_get_tid(XidObject *self);
 | 
			
		||||
HIDDEN PyObject *xid_recover(PyObject *conn);
 | 
			
		||||
 | 
			
		||||
#endif /* PSYCOPG_XID_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -348,32 +348,26 @@ exit:
 | 
			
		|||
 * see also: the pgjdbc implementation
 | 
			
		||||
 *   http://cvs.pgfoundry.org/cgi-bin/cvsweb.cgi/jdbc/pgjdbc/org/postgresql/xa/RecoveredXid.java?rev=1.2
 | 
			
		||||
 */
 | 
			
		||||
char *
 | 
			
		||||
PyObject *
 | 
			
		||||
xid_get_tid(XidObject *self)
 | 
			
		||||
{
 | 
			
		||||
    char *buf = NULL;
 | 
			
		||||
    Py_ssize_t bufsize = 0;
 | 
			
		||||
    PyObject *rv = NULL;
 | 
			
		||||
    PyObject *egtrid = NULL;
 | 
			
		||||
    PyObject *ebqual = NULL;
 | 
			
		||||
    PyObject *format = NULL;
 | 
			
		||||
    PyObject *args = NULL;
 | 
			
		||||
    PyObject *tid = NULL;
 | 
			
		||||
 | 
			
		||||
    if (Py_None == self->format_id) {
 | 
			
		||||
        /* Unparsed xid: return the gtrid. */
 | 
			
		||||
        bufsize = 1 + PyString_Size(self->gtrid);
 | 
			
		||||
        if (!(buf = (char *)PyMem_Malloc(bufsize))) {
 | 
			
		||||
            PyErr_NoMemory();
 | 
			
		||||
            goto exit;
 | 
			
		||||
        }
 | 
			
		||||
        strncpy(buf, PyString_AsString(self->gtrid), bufsize);
 | 
			
		||||
        Py_INCREF(self->gtrid);
 | 
			
		||||
        rv = self->gtrid;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        /* XA xid: mash together the components. */
 | 
			
		||||
        if (!(egtrid = _xid_encode64(self->gtrid))) { goto exit; }
 | 
			
		||||
        if (!(ebqual = _xid_encode64(self->bqual))) { goto exit; }
 | 
			
		||||
 | 
			
		||||
        /* tid = "%d_%s_%s" % (format_id, egtrid, ebqual) */
 | 
			
		||||
        /* rv = "%d_%s_%s" % (format_id, egtrid, ebqual) */
 | 
			
		||||
        if (!(format = PyString_FromString("%d_%s_%s"))) { goto exit; }
 | 
			
		||||
 | 
			
		||||
        if (!(args = PyTuple_New(3))) { goto exit; }
 | 
			
		||||
| 
						 | 
				
			
			@ -382,14 +376,7 @@ xid_get_tid(XidObject *self)
 | 
			
		|||
        PyTuple_SET_ITEM(args, 1, egtrid); egtrid = NULL;
 | 
			
		||||
        PyTuple_SET_ITEM(args, 2, ebqual); ebqual = NULL;
 | 
			
		||||
 | 
			
		||||
        if (!(tid = PyString_Format(format, args))) { goto exit; }
 | 
			
		||||
 | 
			
		||||
        bufsize = 1 + PyString_Size(tid);
 | 
			
		||||
        if (!(buf = (char *)PyMem_Malloc(bufsize))) {
 | 
			
		||||
            PyErr_NoMemory();
 | 
			
		||||
            goto exit;
 | 
			
		||||
        }
 | 
			
		||||
        strncpy(buf, PyString_AsString(tid), bufsize);
 | 
			
		||||
        if (!(rv = PyString_Format(format, args))) { goto exit; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
| 
						 | 
				
			
			@ -397,9 +384,8 @@ exit:
 | 
			
		|||
    Py_XDECREF(format);
 | 
			
		||||
    Py_XDECREF(egtrid);
 | 
			
		||||
    Py_XDECREF(ebqual);
 | 
			
		||||
    Py_XDECREF(tid);
 | 
			
		||||
 | 
			
		||||
    return buf;
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user