Re: Memory Leak ?

Поиск
Список
Период
Сортировка
От zhaoxin
Тема Re: Memory Leak ?
Дата
Msg-id 44967985.70508@necas.nec.com.cn
обсуждение исходный текст
Ответ на Re: Memory Leak ?  (Hiroshi Inoue <inoue@tpf.co.jp>)
Список 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 по дате отправления:

Предыдущее
От: Hiroshi Inoue
Дата:
Сообщение: Re: Memory Leak ?
Следующее
От: Hiroshi Inoue
Дата:
Сообщение: Re: Memory Leak ?