Re: Memory Leak ? - Mailing list pgsql-odbc
| From | zhaoxin |
|---|---|
| Subject | Re: Memory Leak ? |
| Date | |
| Msg-id | 44967985.70508@necas.nec.com.cn Whole thread Raw |
| In response to | Re: Memory Leak ? (Hiroshi Inoue <inoue@tpf.co.jp>) |
| List | pgsql-odbc |
To:Hiroshi Inoue
> I can't see the growth here with a similar test case.
> Could you send me the test program(exe) ?
ok , I add my cpp file to the attachment .
I hope you can help me .thanks
Regards,
zhao
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <process.h>
#include <time.h>
#define RC_SUCCESSFUL(rc) (((rc) == SQL_SUCCESS) || ((rc) == SQL_SUCCESS_WITH_INFO))
#define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc)))
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLHSTMT hstmt= SQL_NULL_HSTMT;
char szSqlState[SQL_MAX_MESSAGE_LENGTH], szErrorMsg[SQL_MAX_MESSAGE_LENGTH];
#define MAXBUFLEN 255
#define TAB_LEN SQL_MAX_TABLE_NAME_LEN + 1
#define COL_LEN SQL_MAX_COLUMN_NAME_LEN + 1
#define STR_LEN 128
#define REM_LEN 254+1
#define BIG_DATA_LEN 1024
SQLCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT MsgLen;
RETCODE retcode;
char szDSN[20] ;
char szUID[20] ;
char szAuthStr[20] ;
int count = 10, n , i;
int iInterval;
void exit_nicely(){
if( RC_NOTSUCCESSFUL(retcode) )
{
SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, (SQLCHAR*)szSqlState, &NativeError,(SQLCHAR*)szErrorMsg,
SQL_MAX_MESSAGE_LENGTH,&MsgLen);
fprintf(stdout,"SqlState=%s, NativeError=%d, ErrorMsg=%s\n", szSqlState, NativeError, szErrorMsg);
SQLExecDirect(hstmt , (SQLCHAR*)"ROLLBACK" , SQL_NTS);
}
//SQLExecDirect(hstmt , (SQLCHAR*)"ROLLBACK" , SQL_NTS);
SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT);
/* Clean up. */
SQLFreeStmt(hstmt, SQL_CLOSE);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
//getchar();
exit(1);
}
void initDBCon(){
// Allocate the ODBC Environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
// Let ODBC know this is an ODBC 3.0 application.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3,
SQL_IS_INTEGER);
// Allocate an ODBC connection handle and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//Set Connect Attr
retcode = SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
//Connect
retcode = SQLConnect(hdbc,(SQLCHAR*)szDSN, (SQLSMALLINT)strlen(szDSN),
(SQLCHAR*)szUID, (SQLSMALLINT)strlen(szUID),
(SQLCHAR*)szAuthStr, (SQLSMALLINT)strlen(szAuthStr));
if( RC_NOTSUCCESSFUL(retcode) )
{
exit_nicely();
}
// Allocate statement handles and do ODBC processing.
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
return;
}
void freeDBCon(){
SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT);
/* Clean up. */
SQLFreeStmt(hstmt, SQL_CLOSE);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return;
}
void testInsert()
{
char *sqlInsert="insert into TestLeak values(?,?,?)";
char szTmp[101];
SQLINTEGER sOrderID=0 , sOrderID1=0 , cbValue2 = SQL_NTS;
SQLINTEGER cbOrderID = 0 , cbOrderID1 = 0;
//SQLINTEGER cbData;
int i;
//initialize
memset(szTmp,0,101);
memset(szTmp,'a',10);//insert 'a'
//INSERT
for(i = 0 ; i < count ; i++)
{
retcode = SQLPrepare(hstmt, (SQLCHAR*)sqlInsert, SQL_NTS);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,STR_LEN, 0, &szTmp, 0, &cbValue2);
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID);
sOrderID = i;
retcode = SQLExecute(hstmt);
if( RC_NOTSUCCESSFUL(retcode) )
{
exit_nicely();
}
}
//retcode = SQLFreeStmt(hstmt,SQL_RESET_PARAMS);
SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT);
}
void testUpdate()
{
char *sqlUpdate="update TestLeak set c2 = ? where c1 = ?";
char szTmp[101];
SQLINTEGER sOrderID=0 , sOrderID1=0 , cbValue2 = SQL_NTS;
SQLINTEGER cbOrderID = 0 , cbOrderID1 = 0;
int i;
//initialize
memset(szTmp,0,101);
memset(szTmp,'b',10);//update to 'b'
//Update
for(i = 0 ; i < count ; i++)
{
retcode = SQLPrepare(hstmt, (SQLCHAR*)sqlUpdate, SQL_NTS);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,STR_LEN, 0, &szTmp, 0, &cbValue2);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID);
//SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID);
sOrderID = i;
retcode = SQLExecute(hstmt);
if( RC_NOTSUCCESSFUL(retcode) )
{
exit_nicely();
}
}
SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT);
}
void testDelete()
{
char *sqlDelete="DELETE from TestLeak where c1 = ?";
//char szTmp[101];
SQLINTEGER sOrderID=0 , sOrderID1=0;
SQLINTEGER cbOrderID = 0 , cbOrderID1 = 0;
int i;
//Delete
for(i = 0 ; i < count ; i++)
{
retcode = SQLPrepare(hstmt, (SQLCHAR*)sqlDelete, SQL_NTS);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &sOrderID, 0, &cbOrderID);
sOrderID = i;
retcode = SQLExecute(hstmt);
if( RC_NOTSUCCESSFUL(retcode) )
{
exit_nicely();
}
}
SQLEndTran(SQL_HANDLE_DBC,(SQLHDBC)hdbc, SQL_COMMIT);
}
int main(int argc, char *argv[] )
{
int m = 1;
if( argc == 1 ){//default
sprintf(szDSN,"postgre_8.02\0");
sprintf(szUID,"postgres\0");
sprintf(szAuthStr,"postgres\0");
iInterval = 1;
}else if( argc == 5 ){
sprintf(szDSN,argv[1]);//DSN
sprintf(szUID,argv[2]);//User
sprintf(szAuthStr,argv[3]);//Password
iInterval = atoi(argv[4]);//Interval
}else{
fprintf(stdout,"invalid args!\n");
fprintf(stdout,"Usage: testODBC.exe <DSN> <User> <Password> <Interval>");
return(0);
}
//----test begin-----
while(true){
fprintf(stdout,"connect....\n");
initDBCon();
fprintf(stdout,"insert....\n");
testInsert();
fprintf(stdout,"update....\n");
testUpdate();
fprintf(stdout,"delete....\n");
testDelete();
Sleep(1*1000);
fprintf(stdout,"free....\n");
freeDBCon();
}
//----test end-----
exit_nicely();
}
pgsql-odbc by date: