|
1 |
| -/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.24 2004/10/14 20:23:46 momjian Exp $ */ |
| 1 | +/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.25 2005/09/12 11:57:53 meskes Exp $ */ |
2 | 2 |
|
3 | 3 | #definePOSTGRES_ECPG_INTERNAL
|
4 | 4 | #include"postgres_fe.h"
|
@@ -186,31 +186,35 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
|
186 | 186 | /* if we have no connection we just simulate the command */
|
187 | 187 | if (con&&con->connection)
|
188 | 188 | {
|
189 |
| -/* |
190 |
| - * if we are not in autocommit mode, already have committed the |
191 |
| - * transaction and get another commit, just ignore it |
| 189 | +/* If we got a transaction command but have no open transaction, |
| 190 | + * we have to start one, unless we are in autocommit, where the |
| 191 | + * developers have to take care themselves. |
| 192 | + * However, if the command is a begin statement, we just execute it once. |
192 | 193 | */
|
193 |
| -if (!con->committed||con->autocommit) |
| 194 | +if (con->committed&& !con->autocommit&&strncmp(transaction,"begin",5)!=0&&strncmp(transaction,"start",5)!=0) |
194 | 195 | {
|
195 |
| -if ((res=PQexec(con->connection,transaction))==NULL) |
| 196 | +res=PQexec(con->connection,"begin transaction"); |
| 197 | +if (res==NULL||PQresultStatus(res)!=PGRES_COMMAND_OK) |
196 | 198 | {
|
197 | 199 | ECPGraise(lineno,ECPG_TRANS,ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN,NULL);
|
198 | 200 | return FALSE;
|
199 | 201 | }
|
200 | 202 | PQclear(res);
|
201 | 203 | }
|
| 204 | + |
| 205 | +res=PQexec(con->connection,transaction); |
| 206 | +if (res==NULL||PQresultStatus(res)!=PGRES_COMMAND_OK) |
| 207 | +{ |
| 208 | +ECPGraise(lineno,ECPG_TRANS,ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN,NULL); |
| 209 | +return FALSE; |
| 210 | +} |
| 211 | +PQclear(res); |
202 | 212 | }
|
203 | 213 |
|
204 | 214 | if (strcmp(transaction,"commit")==0||strcmp(transaction,"rollback")==0)
|
205 |
| -{ |
206 | 215 | con->committed= true;
|
207 |
| - |
208 |
| -#if0 |
209 |
| -/* deallocate all prepared statements */ |
210 |
| -if (!ECPGdeallocate_all(lineno)) |
211 |
| -return false; |
212 |
| -#endif |
213 |
| -} |
| 216 | +else |
| 217 | +con->committed= false; |
214 | 218 |
|
215 | 219 | return true;
|
216 | 220 | }
|
|