From 5274e5d455f1478e19fc02df822eca04aae19116 Mon Sep 17 00:00:00 2001 From: ormorph Date: Mon, 20 Dec 2021 19:47:08 +0300 Subject: [PATCH] Added kexi hotfix to support versions 12 and higher, fixing issue #15 Signed-off-by: ormorph --- kexi/kexidb/connection.cpp | 4 ++++ kexi/kexidb/drivers/pqxx/pqxxconnection.cpp | 26 ++++++++++++++++----- kexi/kexidb/drivers/pqxx/pqxxconnection.h | 1 + kexi/kexidb/drivers/pqxx/pqxxdriver.cpp | 2 +- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/kexi/kexidb/connection.cpp b/kexi/kexidb/connection.cpp index 776285e50..fbc938685 100644 --- a/kexi/kexidb/connection.cpp +++ b/kexi/kexidb/connection.cpp @@ -3227,6 +3227,10 @@ bool Connection::updateRow(QuerySchema &query, RowData& data, RowEditBuffer& buf setError(ERR_UPDATE_SERVER_ERROR, i18n("Row updating on the server failed.")); return false; } + + if (m_driver->beh->ROW_ID_FIELD_NAME == "xmin") + data[data.size()-1]=drv_lastInsertRowID(); + //success: now also assign new values in memory: TQMap columnsOrderExpanded; updateRowDataWithNewValues(query, data, b, columnsOrderExpanded); diff --git a/kexi/kexidb/drivers/pqxx/pqxxconnection.cpp b/kexi/kexidb/drivers/pqxx/pqxxconnection.cpp index 76684483a..90187b5a8 100644 --- a/kexi/kexidb/drivers/pqxx/pqxxconnection.cpp +++ b/kexi/kexidb/drivers/pqxx/pqxxconnection.cpp @@ -203,7 +203,6 @@ bool pqxxSqlConnection::drv_useDatabase( const TQString &dbName, bool *cancelled try { d->pqxxsql = new pqxx::connection( conninfo.latin1() ); - drv_executeSQL( "SET DEFAULT_WITH_OIDS TO ON" ); //Postgres 8.1 changed the default to no oids but we need them if (d->version) { //! @todo set version using the connection pointer when we drop libpqxx for libpq @@ -259,6 +258,15 @@ bool pqxxSqlConnection::drv_dropDatabase( const TQString &dbName ) //Execute an SQL statement bool pqxxSqlConnection::drv_executeSQL( const TQString& statement ) { + std::string temp = std::string(statement.utf8()); +// Adding xmin result output for inserting rows + bool isInserted = false; + pqxx::result::const_iterator itRow; + if (statement.find("INSERT INTO") == 0 || statement.find("UPDATE") == 0) { + temp += " RETURNING xmin"; + isInserted = true; + } + // KexiDBDrvDbg << "pqxxSqlConnection::drv_executeSQL: " << statement << endl; bool ok = false; @@ -277,7 +285,15 @@ bool pqxxSqlConnection::drv_executeSQL( const TQString& statement ) // m_trans = new pqxx::nontransaction(*m_pqxxsql); // KexiDBDrvDbg << "About to execute" << endl; //Create a result object through the transaction - d->res = new pqxx::result(m_trans->data->exec(std::string(statement.utf8()))); + d->res = new pqxx::result(m_trans->data->exec(temp)); + +// Get the xmin of the last inserted row + if (isInserted) { + itRow = d->res->begin(); + itRow[0].to(temp); + lastRowId = temp.c_str(); + } + // KexiDBDrvDbg << "Executed" << endl; //Commit the transaction if (implicityStarted) { @@ -327,11 +343,9 @@ TQ_ULLONG pqxxSqlConnection::drv_lastInsertRowID() { if (d->res) { - pqxx::oid theOid = d->res->inserted_oid(); - - if (theOid != pqxx::oid_none) + if (!lastRowId.isEmpty()) { - return (TQ_ULLONG)theOid; + return lastRowId.toULong(); } else { diff --git a/kexi/kexidb/drivers/pqxx/pqxxconnection.h b/kexi/kexidb/drivers/pqxx/pqxxconnection.h index 20840074b..50ec655ed 100644 --- a/kexi/kexidb/drivers/pqxx/pqxxconnection.h +++ b/kexi/kexidb/drivers/pqxx/pqxxconnection.h @@ -90,6 +90,7 @@ class pqxxSqlConnection : public Connection pqxxSqlConnectionInternal *d; private: + TQString lastRowId; TQString escapeName(const TQString &tn) const; // pqxx::transaction_base* m_trans; //! temporary solution for executeSQL()... diff --git a/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp b/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp index 3809cd160..2050457cc 100644 --- a/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp +++ b/kexi/kexidb/drivers/pqxx/pqxxdriver.cpp @@ -41,7 +41,7 @@ pqxxSqlDriver::pqxxSqlDriver( TQObject *parent, const char *name, const TQString //! @todo enable this when kexidb supports multiple: d->features = MultipleTransactions | CursorForward | CursorBackward; beh->UNSIGNED_TYPE_KEYWORD = ""; - beh->ROW_ID_FIELD_NAME = "oid"; + beh->ROW_ID_FIELD_NAME = "xmin"; beh->SPECIAL_AUTO_INCREMENT_DEF = false; beh->AUTO_INCREMENT_TYPE = "SERIAL"; beh->AUTO_INCREMENT_FIELD_OPTION = "";