mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
I suspect that you are not the person to send this to, but I wasn't sure
where else to mail it. I am the maintainer of unixODBC, and we have a set of code in our project that started life as the Postgres windows ODBC driver, which has been ported back to unix. Anyway I have just fixed a memory leak in the driver, and I cant see any mention of the fix being done in the main Postgres code, so I thougth I would let you know. Its in the statement.c module, after the COMMIT statement has been executed in SC_Execute, the code was Nick Gorham
This commit is contained in:
parent
d891ca1853
commit
f4ca323d21
@ -62,7 +62,7 @@ static struct {
|
|||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API SQLAllocStmt(HDBC hdbc,
|
RETCODE SQL_API SQLAllocStmt(HDBC hdbc,
|
||||||
HSTMT FAR *phstmt)
|
HSTMT FAR *phstmt)
|
||||||
{
|
{
|
||||||
static char *func="SQLAllocStmt";
|
static char *func="SQLAllocStmt";
|
||||||
ConnectionClass *conn = (ConnectionClass *) hdbc;
|
ConnectionClass *conn = (ConnectionClass *) hdbc;
|
||||||
@ -88,12 +88,12 @@ StatementClass *stmt;
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( ! CC_add_statement(conn, stmt)) {
|
if ( ! CC_add_statement(conn, stmt)) {
|
||||||
conn->errormsg = "Maximum number of connections exceeded.";
|
conn->errormsg = "Maximum number of connections exceeded.";
|
||||||
conn->errornumber = CONN_STMT_ALLOC_ERROR;
|
conn->errornumber = CONN_STMT_ALLOC_ERROR;
|
||||||
CC_log_error(func, "", conn);
|
CC_log_error(func, "", conn);
|
||||||
SC_Destructor(stmt);
|
SC_Destructor(stmt);
|
||||||
*phstmt = SQL_NULL_HSTMT;
|
*phstmt = SQL_NULL_HSTMT;
|
||||||
return SQL_ERROR;
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
*phstmt = (HSTMT) stmt;
|
*phstmt = (HSTMT) stmt;
|
||||||
@ -111,7 +111,7 @@ StatementClass *stmt;
|
|||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API SQLFreeStmt(HSTMT hstmt,
|
RETCODE SQL_API SQLFreeStmt(HSTMT hstmt,
|
||||||
UWORD fOption)
|
UWORD fOption)
|
||||||
{
|
{
|
||||||
static char *func="SQLFreeStmt";
|
static char *func="SQLFreeStmt";
|
||||||
StatementClass *stmt = (StatementClass *) hstmt;
|
StatementClass *stmt = (StatementClass *) hstmt;
|
||||||
@ -151,20 +151,20 @@ StatementClass *stmt = (StatementClass *) hstmt;
|
|||||||
} else if (fOption == SQL_CLOSE) {
|
} else if (fOption == SQL_CLOSE) {
|
||||||
/* this should discard all the results, but leave the statement */
|
/* this should discard all the results, but leave the statement */
|
||||||
/* itself in place (it can be executed again) */
|
/* itself in place (it can be executed again) */
|
||||||
if (!SC_recycle_statement(stmt)) {
|
if (!SC_recycle_statement(stmt)) {
|
||||||
// errormsg passed in above
|
// errormsg passed in above
|
||||||
SC_log_error(func, "", stmt);
|
SC_log_error(func, "", stmt);
|
||||||
return SQL_ERROR;
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if(fOption == SQL_RESET_PARAMS) {
|
} else if(fOption == SQL_RESET_PARAMS) {
|
||||||
SC_free_params(stmt, STMT_FREE_PARAMS_ALL);
|
SC_free_params(stmt, STMT_FREE_PARAMS_ALL);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
stmt->errormsg = "Invalid option passed to SQLFreeStmt.";
|
stmt->errormsg = "Invalid option passed to SQLFreeStmt.";
|
||||||
stmt->errornumber = STMT_OPTION_OUT_OF_RANGE_ERROR;
|
stmt->errornumber = STMT_OPTION_OUT_OF_RANGE_ERROR;
|
||||||
SC_log_error(func, "", stmt);
|
SC_log_error(func, "", stmt);
|
||||||
return SQL_ERROR;
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
@ -663,9 +663,9 @@ ColumnInfoClass *ci;
|
|||||||
self->bindings[lf].data_left = -1;
|
self->bindings[lf].data_left = -1;
|
||||||
|
|
||||||
if (self->bindings[lf].buffer != NULL) {
|
if (self->bindings[lf].buffer != NULL) {
|
||||||
// this column has a binding
|
// this column has a binding
|
||||||
|
|
||||||
// type = QR_get_field_type(res, lf);
|
// type = QR_get_field_type(res, lf);
|
||||||
type = CI_get_oid(ci, lf); /* speed things up */
|
type = CI_get_oid(ci, lf); /* speed things up */
|
||||||
|
|
||||||
mylog("type = %d\n", type);
|
mylog("type = %d\n", type);
|
||||||
@ -827,8 +827,9 @@ QueryInfo qi;
|
|||||||
|
|
||||||
// If we are in autocommit, we must send the commit.
|
// If we are in autocommit, we must send the commit.
|
||||||
if ( ! self->internal && CC_is_in_autocommit(conn) && STMT_UPDATE(self)) {
|
if ( ! self->internal && CC_is_in_autocommit(conn) && STMT_UPDATE(self)) {
|
||||||
CC_send_query(conn, "COMMIT", NULL);
|
res = CC_send_query(conn, "COMMIT", NULL);
|
||||||
CC_set_no_trans(conn);
|
QR_Destructor(res);
|
||||||
|
CC_set_no_trans(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user