Integration of Psycopg with XTA

From: Christian Ferrari <camauz(at)yahoo(dot)com>
To: "psycopg(at)lists(dot)postgresql(dot)org" <psycopg(at)lists(dot)postgresql(dot)org>
Subject: Integration of Psycopg with XTA
Date: 2018-09-25 20:57:05
Message-ID: 2001056273.7945904.1537909025251@mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: psycopg

Dear All,XTA (XA Transaction API, http://www.tiian.org/lixa/XTA.html) is a new API that has been developed inside the LIXA project to support two phase commit transactions in the context of FaaS (Function as a Service) and microservice oriented, polyglot applications.
The API already supports C and C++ languages; it aims to support many more, at the bare minimum Python, PHP and Java.I'm currently working on supporting Python with PostgreSQL and MySQL, this mail thread is related to Python/PostgreSQL.
XTA is implemented in C language and XTA for Python is generated using SWIG: I would like to repeat the approach for all the languages that provides drivers derived from libpq-fe.h
Now the request for help: XTA needs to enlist all the resource managers (here PostgreSQL) to manage them using 2 phase commit, basically it requires a pointer (PGconn *) that must be passed to PostgresqlXaResource constructor (http://www.tiian.org/lixa/manuals/xta/CPP/classxta_1_1PostgresqlXaResource.html) to create an XTA object associated to an already opened PostgreSQL connection.
Here are the basic steps of a Python example program (https://github.com/tiian/lixa/blob/master/doc/examples/xta/python/example_xta_sa21.py)
# initialize XTA environment
Xta_Init()

# create a new PostgreSQL connection
# Note: using PostgreSQL Psycopg2 functions
rm1 = psycopg2.connect("dbname=testdb")

# create a new MySQL connection
# Note: using MySQLdb functions
rm2 = MySQLdb.connect("localhost", "lixa", "", "lixa")

# create a new XTA Transaction Manager object
tm = TransactionManager()

# create an XA resource for PostgreSQL
# second parameter "PostgreSQL" is descriptive
# third parameter "dbname=testdb" identifies the specific database
#
# how to retrieve PGconn * from rm1?!
xar1 = PostgresqlXaResource(rm1.conn, "PostgreSQL", "dbname=testdb")

Looking at the last statement, the stack is:- XTA native C library expects "PGconn *" to register the connection handler- XTA C++ wrapper expects "PGconn *" as the first parameter to construct the object- XTA Python (SWIG generated) wrapper expects a "SWIG generated" PGconn * pointer- psycopg2.connect does not provide me something equivalent to PGconn *, at least it seems so to me.
Stated that replacing "PGconn *" with "void *" in the API stack would not be an issue, the question is: what's the best way to retrieve something that can be transformed in a C pointer that could be passed to XTA constructor?

From my point of view, this new API layout should solve most of the issues presented by the old style TX API that I explored some years ago: https://grokbase.com/t/postgresql/psycopg/122b1re71w/psycopg2-and-lixa
Thanks in advance for your help.
Regards,
Ch.F.

Responses

Browse psycopg by date

  From Date Subject
Next Message Federico Di Gregorio 2018-09-26 07:33:22 Re: Integration of Psycopg with XTA
Previous Message Thomas Güttler 2018-07-20 12:41:02 Re: R: Number of SQL queries