20#include "pqxxconnection.h"
24#include <kexidb/error.h>
25#include <kexidb/global.h>
28#include "pqxxpreparedstatement.h"
29#include "pqxxconnection_p.h"
32pqxxTransactionData::pqxxTransactionData(
Connection *conn,
bool nontransaction)
36 data =
new pqxx::nontransaction(*
static_cast<pqxxSqlConnection*
>(conn)->d->pqxxsql );
38 data =
new pqxx::transaction<>(*
static_cast<pqxxSqlConnection*
>(conn)->d->pqxxsql );
44pqxxTransactionData::~pqxxTransactionData()
57 , d( new pqxxSqlConnectionInternal(this) )
64pqxxSqlConnection::~pqxxSqlConnection()
75 Q_UNUSED(cursor_options);
76 return new pqxxSqlCursor(
this, statement, 1);
83 Q_UNUSED(cursor_options);
84 return new pqxxSqlCursor(
this, query, 1);
89TQString pqxxSqlConnection::escapeName(
const TQString &name)
const
91 return TQString(
"\"" + name +
"\"");
99 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_connect" << endl;
103#warning pqxxSqlConnection::drv_connect implement setting version info when we drop libpqxx for libpq
113 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_disconnect: " << endl;
123 if (
executeSQL(
"SELECT datname FROM pg_database WHERE datallowconn = TRUE"))
126 for (pqxx::result::const_iterator c = d->res->begin(); c != d->res->end(); ++c)
131 list << TQString::fromLatin1 (N.c_str());
143 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_createDatabase: " << dbName << endl;
145 if (
executeSQL(
"CREATE DATABASE " + escapeName(dbName)))
157 Q_UNUSED(msgHandler);
158 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_useDatabase: " << dbName << endl;
162 TQStringList sockets;
164 if (
data()->hostName.isEmpty() ||
data()->hostName ==
"localhost")
166 if (
data()->localSocketFileName.isEmpty())
168 sockets.append(
"/tmp/.s.PGSQL.5432");
170 for(TQStringList::ConstIterator it = sockets.constBegin(); it != sockets.constEnd(); it++)
172 if(TQFile(*it).exists())
190 if (
data()->port == 0)
193 conninfo += TQString::fromLatin1(
" port='%1'").arg(
data()->port);
195 conninfo += TQString::fromLatin1(
" dbname='%1'").arg(dbName);
197 if (!
data()->userName.isNull())
198 conninfo += TQString::fromLatin1(
" user='%1'").arg(
data()->userName);
200 if (!
data()->password.isNull())
201 conninfo += TQString::fromLatin1(
" password='%1'").arg(
data()->password);
205 d->pqxxsql =
new pqxx::connection( conninfo.latin1() );
212 catch(
const std::exception &e)
214 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_useDatabase:exception - " << e.what() << endl;
215 d->errmsg = TQString::fromUtf8( e.what() );
220 d->errmsg = i18n(
"Unknown error.");
229 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_closeDatabase" << endl;
248 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_dropDatabase: " << dbName << endl;
251 if (
executeSQL(
"DROP DATABASE " + escapeName(dbName)))
261 std::string temp = std::string(statement.utf8());
263 bool isInserted =
false;
264 pqxx::result::const_iterator itRow;
265 if (statement.find(
"INSERT INTO") == 0 || statement.find(
"UPDATE") == 0) {
266 temp +=
" RETURNING xmin";
281 const bool implicityStarted = !m_trans;
282 if (implicityStarted)
283 (void)
new pqxxTransactionData(
this,
true);
288 d->res =
new pqxx::result(m_trans->data->exec(temp));
292 itRow = d->res->begin();
294 lastRowId = temp.c_str();
299 if (implicityStarted) {
300 pqxxTransactionData *t = m_trans;
309 catch(
const pqxx::sql_error& sqlerr) {
310 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_executeSQL: sql_error exception - " << sqlerr.query().c_str() << endl;
312 catch (
const pqxx::broken_connection& bcerr) {
313 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_executeSQL: broken_connection exception" << endl;
315 catch (
const std::exception &e)
318 d->errmsg = TQString::fromUtf8( e.what() );
319 KexiDBDrvDbg <<
"pqxxSqlConnection::drv_executeSQL:exception - " << e.what() << endl;
323 d->errmsg = i18n(
"Unknown error.");
333 if (d->pqxxsql->is_open())
346 if (!lastRowId.isEmpty())
348 return lastRowId.toULong();
362 return resultExists(TQString(
"select 1 from pg_class where relkind='r' and relname LIKE %1")
363 .arg(
driver()->escapeString(tableName)), success) && success;
369 m_sql =
"select lower(relname) from pg_class where relkind='r'";
371 KexiDBDrvWarn <<
"pqxxSqlConnection::drv_getTablesList(): !executeQuery()" << endl;
376 while (!cursor->
eof() && !cursor->
error()) {
377 list += cursor->
value(0).toString();
380 if (cursor->
error()) {
390 return new pqxxTransactionData(
this,
false);
397 static_cast<pqxxTransactionData*
>(tdata)->
data->commit();
399 catch (
const std::exception &e)
402 d->errmsg = TQString::fromUtf8( e.what() );
410 if (m_trans == tdata)
419 static_cast<pqxxTransactionData*
>(tdata)->
data->abort();
421 catch (
const std::exception &e)
424 d->errmsg = TQString::fromUtf8( e.what() );
429 d->errmsg = i18n(
"Unknown error.");
432 if (m_trans == tdata)
439 return d->resultCode;
462#include "pqxxconnection.moc"
TQString localSocketFileName
Name of local (named) socket file.
unsigned short int port
Port used for the remote connection.
TQString hostName
Host name used for the remote connection.
Database specific connection data, e.g. host, port.
Provides database connection, allowing queries and data modification.
bool deleteCursor(Cursor *cursor)
bool executeSQL(const TQString &statement)
Cursor * executeQuery(const TQString &statement, uint cursor_options=0)
bool resultExists(const TQString &sql, bool &success, bool addLimitTo1=true)
ConnectionData * data() const
Provides database cursor functionality.
virtual TQVariant value(uint i)=0
Generic database abstraction.
TQString m_sql
used to store of actually executed SQL statement
virtual void setError(int code=ERR_OTHER, const TQString &msg=TQString())
StatementType
Defines type of the prepared statement.
KexiDB::QuerySchema provides information about database query.
Contains version information about a database backend.
virtual PreparedStatement::Ptr prepareStatement(PreparedStatement::StatementType type, FieldList &fields)
virtual bool drv_executeSQL(const TQString &statement)
virtual bool drv_getTablesList(TQStringList &list)
virtual void drv_clearServerResult()
virtual bool drv_rollbackTransaction(TransactionData *)
virtual bool drv_dropDatabase(const TQString &dbName=TQString())
virtual bool drv_isDatabaseUsed() const
virtual TQ_ULLONG drv_lastInsertRowID()
virtual bool drv_disconnect()
virtual bool drv_closeDatabase()
virtual bool drv_containsTable(const TQString &tableName)
virtual Cursor * prepareQuery(const TQString &statement=TQString(), uint cursor_options=0)
virtual int serverResult()
virtual bool drv_createDatabase(const TQString &dbName=TQString())
virtual bool drv_getDatabasesList(TQStringList &list)
virtual TQString serverResultName()
virtual bool drv_useDatabase(const TQString &dbName=TQString(), bool *cancelled=0, MessageHandler *msgHandler=0)
virtual bool drv_commitTransaction(TransactionData *)
virtual TransactionData * drv_beginTransaction()
virtual bool drv_connect(KexiDB::ServerVersionInfo &version)
virtual TQString serverErrorMsg()
High-level database connectivity library with database backend drivers.
KEXI_DB_EXPORT DatabaseVersionInfo version()