--- sql/pgsql/parser3pgsql.C 2004/05/25 07:07:48 1.21 +++ sql/pgsql/parser3pgsql.C 2004/12/23 15:57:41 1.23 @@ -7,7 +7,7 @@ 2001.07.30 using PgSQL 7.1.2 */ -static const char *RCSId="$Id: parser3pgsql.C,v 1.21 2004/05/25 07:07:48 paf Exp $"; +static const char *RCSId="$Id: parser3pgsql.C,v 1.23 2004/12/23 15:57:41 paf Exp $"; #include "config_includes.h" @@ -127,6 +127,7 @@ public: char *charset=0; char *datestyle=0; + isDefaultTransaction = true; while(options) { if(char *key=lsplit(&options, '&')) { @@ -139,6 +140,8 @@ public: cstrBackwardCompAskServerToTranscode=value; } else if(strcasecmp(key, "datestyle")==0) { datestyle=value; + } else if(strcmp(key, "WithoutDefaultTransaction")==0) { + isDefaultTransaction = false; } else services._throw("unknown connect option" /*key*/); } else @@ -182,22 +185,28 @@ public: connection.conn=0; } void commit(void *aconnection) { - Connection& connection=*static_cast(aconnection); - - if(PGresult *res=PQexec(connection.conn, "COMMIT")) - PQclear(res); - else - throwPQerror; - begin_transaction(connection); + if(isDefaultTransaction) + { + Connection& connection=*static_cast(aconnection); + + if(PGresult *res=PQexec(connection.conn, "COMMIT")) + PQclear(res); + else + throwPQerror; + begin_transaction(connection); + } } void rollback(void *aconnection) { - Connection& connection=*static_cast(aconnection); - - if(PGresult *res=PQexec(connection.conn, "ROLLBACK")) - PQclear(res); - else - throwPQerror; - begin_transaction(connection); + if(isDefaultTransaction) + { + Connection& connection=*static_cast(aconnection); + + if(PGresult *res=PQexec(connection.conn, "ROLLBACK")) + PQclear(res); + else + throwPQerror; + begin_transaction(connection); + } } bool ping(void *aconnection) { @@ -228,7 +237,9 @@ public: return result; } void query(void *aconnection, - const char *astatement, unsigned long offset, unsigned long limit, + const char *astatement, + size_t placeholders_count, Placeholder* placeholders, + unsigned long offset, unsigned long limit, SQL_Driver_query_event_handlers& handlers) { // _asm int 3; Connection& connection=*static_cast(aconnection); @@ -236,6 +247,9 @@ public: SQL_Driver_services& services=*connection.services; PGconn *conn=connection.conn; + if(placeholders_count>0) + services._throw("bind variables not supported (yet)"); + // transcode from $request:charset to connect-string?client_charset if(cstrClientCharset) { size_t transcoded_statement_size; @@ -368,10 +382,13 @@ cleanup: private: // private funcs void begin_transaction(Connection& connection) { - if(PGresult *res=PQexec(connection.conn, "BEGIN")) - PQclear(res); - else - throwPQerror; + if(isDefaultTransaction) + { + if(PGresult *res=PQexec(connection.conn, "BEGIN")) + PQclear(res); + else + throwPQerror; + } } const char *preprocess_statement(Connection& connection, @@ -555,6 +572,8 @@ private: // conn client library funcs li return 0; } + // Default transaction flag, if true make it. + bool isDefaultTransaction; }; extern "C" SQL_Driver *SQL_DRIVER_CREATE() {