@@ -370,6 +370,34 @@ create_statement(int lineno, struct connection *connection, struct statement **
370
370
return (true);
371
371
}
372
372
373
+ static void
374
+ free_variable (struct variable * var )
375
+ {
376
+ struct variable * var_next ;
377
+
378
+ if ( var == (struct variable * )NULL )
379
+ return ;
380
+ var_next = var -> next ;
381
+ free (var );
382
+
383
+ while (var_next )
384
+ {
385
+ var = var_next ;
386
+ var_next = var -> next ;
387
+ free (var );
388
+ }
389
+ }
390
+
391
+ static void
392
+ free_statement (struct statement * stmt )
393
+ {
394
+ if ( stmt == (struct statement * )NULL )
395
+ return ;
396
+ free_variable (stmt -> inlist );
397
+ free_variable (stmt -> outlist );
398
+ free (stmt );
399
+ }
400
+
373
401
static char *
374
402
next_insert (char * text )
375
403
{
@@ -981,7 +1009,6 @@ ECPGexecute(struct statement * stmt)
981
1009
status = false;
982
1010
}
983
1011
984
- PQclear (results );
985
1012
break ;
986
1013
case PGRES_EMPTY_QUERY :
987
1014
/* do nothing */
@@ -1017,6 +1044,7 @@ ECPGexecute(struct statement * stmt)
1017
1044
status = false;
1018
1045
break ;
1019
1046
}
1047
+ PQclear (results );
1020
1048
}
1021
1049
1022
1050
/* check for asynchronous returns */
@@ -1037,10 +1065,11 @@ ECPGdo(int lineno, const char *connection_name, char *query,...)
1037
1065
va_list args ;
1038
1066
struct statement * stmt ;
1039
1067
struct connection * con = get_connection (connection_name );
1068
+ bool status ;
1040
1069
1041
1070
if (con == NULL )
1042
1071
{
1043
- register_error (ECPG_NO_CONN , "No such connection %s in line %d." , connection_name , lineno );
1072
+ register_error (ECPG_NO_CONN , "No such connection %s in line %d." , connection_name ? connection_name : "NULL" , lineno );
1044
1073
return (false);
1045
1074
}
1046
1075
@@ -1057,7 +1086,9 @@ ECPGdo(int lineno, const char *connection_name, char *query,...)
1057
1086
return false;
1058
1087
}
1059
1088
1060
- return (ECPGexecute (stmt ));
1089
+ status = ECPGexecute (stmt );
1090
+ free_statement (stmt );
1091
+ return (status );
1061
1092
}
1062
1093
1063
1094
bool
@@ -1067,7 +1098,7 @@ ECPGstatus(int lineno, const char *connection_name)
1067
1098
1068
1099
if (con == NULL )
1069
1100
{
1070
- register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name , lineno );
1101
+ register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name ? connection_name : "NULL" , lineno );
1071
1102
return (false);
1072
1103
}
1073
1104
@@ -1090,7 +1121,7 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
1090
1121
1091
1122
if (con == NULL )
1092
1123
{
1093
- register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name , lineno );
1124
+ register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name ? connection_name : "NULL" , lineno );
1094
1125
return (false);
1095
1126
}
1096
1127
@@ -1125,6 +1156,52 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
1125
1156
return true;
1126
1157
}
1127
1158
1159
+ bool
1160
+ ECPGsetcommit (int lineno , const char * mode , const char * connection_name )
1161
+ {
1162
+ struct connection * con = get_connection (connection_name );
1163
+ PGresult * results ;
1164
+
1165
+ if (con )
1166
+ {
1167
+ if (con -> no_auto_trans == true && strncmp (mode , "ON" , strlen ("ON" )) == 0 )
1168
+ {
1169
+ if (con -> committed )
1170
+ {
1171
+ if ((results = PQexec (con -> connection , "begin transaction" )) == NULL )
1172
+ {
1173
+ register_error (ECPG_TRANS , "Error in transaction processing line %d." , lineno );
1174
+ return false;
1175
+ }
1176
+ PQclear (results );
1177
+ con -> committed = false;
1178
+ }
1179
+ con -> no_auto_trans = false;
1180
+ }
1181
+ else if (con -> no_auto_trans == false && strncmp (mode , "OFF" , strlen ("OFF" )) == 0 )
1182
+ {
1183
+ if (!con -> committed )
1184
+ {
1185
+ if ((results = PQexec (con -> connection , "commit" )) == NULL )
1186
+ {
1187
+ register_error (ECPG_TRANS , "Error in transaction processing line %d." , lineno );
1188
+ return false;
1189
+ }
1190
+ PQclear (results );
1191
+ con -> committed = true;
1192
+ }
1193
+ con -> no_auto_trans = true;
1194
+ }
1195
+ }
1196
+ else
1197
+ {
1198
+ register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name ? connection_name : "NULL" , lineno );
1199
+ return false;
1200
+ }
1201
+
1202
+ return true;
1203
+ }
1204
+
1128
1205
bool
1129
1206
ECPGsetconn (int lineno , const char * connection_name )
1130
1207
{
@@ -1137,7 +1214,7 @@ ECPGsetconn(int lineno, const char *connection_name)
1137
1214
}
1138
1215
else
1139
1216
{
1140
- register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name , lineno );
1217
+ register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name ? connection_name : "NULL" , lineno );
1141
1218
return false;
1142
1219
}
1143
1220
}
@@ -1207,8 +1284,8 @@ ECPGdisconnect(int lineno, const char *connection_name)
1207
1284
1208
1285
if (con == NULL )
1209
1286
{
1210
- ECPGlog ("disconnect: not connected to connection %s\n" , connection_name );
1211
- register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name , lineno );
1287
+ ECPGlog ("disconnect: not connected to connection %s\n" , connection_name ? connection_name : "NULL" );
1288
+ register_error (ECPG_NO_CONN , "No such connection %s in line %d" , connection_name ? connection_name : "NULL" , lineno );
1212
1289
return false;
1213
1290
}
1214
1291
else
0 commit comments