Subject: reconnect failing in 3.51.12 2007-02-09 - By John Calcote
Back I've got a linux daemon that logs to myodbc 3.51.12 through unixODBC driver manager. The first time my program receives a command it establishes an entire ODBC environment via the following (abbreviated) code: int connect() { SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hsql); SQLSetEnvAttr(hsql, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, hsql, &hdbc); SQLConnect(hdbc, (SQLCHAR*)dsn, SQL_NTS, (SQLCHAR*)user, SQL_NTS, (SQLCHAR*)passwd, SQL_NTS); SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); SQLPrepare(hstmt, primary_stmt, SQL_NTS); for (i = 0; i < elemcount(pa); i++) SQLBindParameter(hstmt, j++, SQL_PARAM_INPUT, pa[i].c_type, pa[i].s _type, pa[i].csize, 0, pa[i].pvp, 0, &ind[i]); } void disconnect() { if (hstmt != 0) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); if (hdbc != 0) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } if (hsql != 0) SQLFreeHandle(SQL_HANDLE_ENV, hsql); hstmt = hdbc = hsql = 0; } Of course, I check all of the error returns in the real code. The daemon monitors for intermittent request traffic and logs things to the database as requests come in. If there's an 8 hour delay between requests, the ODBC connection times out. I expect this condition in the log code as follows: if (!SQL_SUCCEEDED(SQLExecute(hstmt))) { disconnect(); if (connect() != 0) return -1; else if (!SQL_SUCCEEDED(SQLExecute(hstmt))) return -1; } My problem is that I cannot re-establish the connection once it's been broken like this. I get errors back from myodbc like this: (a snippet from my daemon's log file) [Wed Feb 7 15:26:32 2007] Entering main run loop... (first request established initial connection) [Wed Feb 7 15:27:48 2007] xdm_odbc: Connection established. [DSN=xdas;UID =root;PWD=;]. (second request - over 8 hours later - tries to re-establish connection) [Fri Feb 9 02:52:56 2007] xdm_odbc: the ODBC driver reported -1 during SQLConnect: [Fri Feb 9 02:52:56 2007] xdm_odbc: HYT00:1:2019:[unixODBC][MySQL][ODBC 3 .51 Driver]Can't initialize character set latin1 (path: /usr/share/mysql /charsets/) [Fri Feb 9 02:52:56 2007] xdm_odbc: ODBC Reconnect failed, error -1. What am I doing wrong? It seems simple enough to me. I noticed on the mailing list that a few folks had trouble using SQLDriverConnect, so I switched to SQLConnect, and now I get other types of errors trying to reconnect - not the least of these are that my daemon segfaults down inside of libmyodbc with the following stack trace: #0 0xb741dc5d in my_strcasecmp_8bit () from /usr/lib/mysql/libmysqlclient.so.15 #1 0xb741514d in get_charset_number () from /usr/lib/mysql/libmysqlclient.so.15 #2 0xb74151ab in get_charset_by_csname () from /usr/lib/mysql/libmysqlclient .so.15 #3 0xb74320ec in mysql_real_connect () from /usr/lib/mysql/libmysqlclient.so.15 #4 0xb753c15a in SQLConnect (hdbc=0x807fe78, szDSN=0xb7d8df51, cbDSN=-3, szUID=0xb7d8e270, cbUID=-3, szAuthStr=0xb7d8e1f0, cbAuthStr=-3) at connect .c:253 #5 0xb7d9d394 in SQLConnect (connection_handle=0x80616f0, server_name=0xb7d8e2f0, name_length1=-3, user_name=0xb7d8e270, name_length2=-3, authentication=0xb7d8e1f0, name_length3=-3) at SQLConnect .c:3820 #6 0xb7f63c23 in sql_connect () at xdm_odbc.c:322 #7 0xb7f6411a in xdm_append (msg=0x80776a9, msgsz=272) at xdm_odbc.c:394 #8 0x0804a3cf in xdasd_logger_append (msg=0x8077598, msgsz=272) at xdasd _logger.c:175 #9 0x0804a0e2 in bg_logger (unused=0x0) at xdasd_lcache.c:90 #10 0xb7f3b34b in start_thread () from /lib/libpthread.so.0 #11 0xb7ed365e in clone () from /lib/libc.so.6 Any ideas would be appreciated. Thanks, John -- -- John Calcote (jcalcote@(protected)) Sr. Software Engineeer Novell, Inc.
<HTML><HEAD> <META http-equiv=Content-Type content="text/html; charset=iso-8859 (See http://iso-8859.ora-code.com)-15"> <META content="MSHTML 6.00.5730.11" name=GENERATOR></HEAD> <BODY style="MARGIN: 4px 4px 1px; FONT: 10pt Tahoma"> <DIV>I've got a linux daemon that logs to myodbc 3.51.12 through unixODBC driver manager. The first time my program receives a command it establishes an entire ODBC environment via the following (abbreviated) code:</DIV> <DIV> </DIV> <DIV> int connect()</DIV> <DIV> {</DIV> <DIV> SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hsql);</DIV> <DIV> SQLSetEnvAttr(hsql, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);</DIV> <DIV> SQLAllocHandle(SQL_HANDLE_DBC, hsql, &hdbc); </DIV> <DIV> SQLConnect(hdbc, (SQLCHAR*)dsn, SQL_NTS, (SQLCHAR*)user, SQL_NTS, (SQLCHAR*)passwd, SQL_NTS);</DIV> <DIV> SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt );</DIV> <DIV> SQLPrepare(hstmt, primary_stmt, SQL_NTS);</DIV> <DIV> </DIV> <DIV> for (i = 0; i < elemcount(pa); i++)</DIV> <DIV> SQLBindParameter(hstmt, j++, SQL _PARAM_INPUT, pa[i].c_type, pa[i].s_type, pa[i].csize, 0, pa[i].pvp, 0, &ind[i]);</DIV> <DIV> }</DIV> <DIV> </DIV> <DIV> void disconnect()<BR> {<BR> if (hstmt != 0)<BR> SQLFreeHandle(SQL_HANDLE_STMT, hstmt);<BR> if (hdbc != 0)<BR> {<BR>   ; SQLDisconnect(hdbc);<BR> SQLFreeHandle(SQL_HANDLE_DBC, hdbc);<BR> }<BR> if (hsql != 0)<BR>   ; SQLFreeHandle(SQL_HANDLE_ENV, hsql);<BR> hstmt = hdbc = hsql = 0;<BR> }<BR></DIV> <DIV>Of course, I check all of the error returns in the real code. The daemon monitors for intermittent request traffic and logs things to the database as requests come in. If there's an 8 hour delay between requests, the ODBC connection times out. I expect this condition in the log code as follows:</DIV> <DIV> </DIV> <DIV> if (!SQL_SUCCEEDED(SQLExecute(hstmt)))<BR> {<BR> disconnect();<BR> if (connect() != 0)<BR> return -1;<BR> else if (!SQL_SUCCEEDED(SQLExecute(hstmt)) )<BR> return -1;<BR> }<BR></DIV> <DIV>My problem is that I cannot re-establish the connection once it's been broken like this. I get errors back from myodbc like this:</DIV> <DIV> </DIV> <DIV> (a snippet from my daemon's log file)</DIV> <DIV> [Wed Feb 7 15:26:32 2007] Entering main run loop...< /DIV> <DIV> </DIV> <DIV> (first request established initial connection)<BR> [Wed Feb 7 15:27:48 2007] xdm_odbc: Connection established. [DSN=xdas;UID=root;PWD=;].</DIV> <DIV> </DIV> <DIV> (second request - over 8 hours later - tries to re -establish connection)<BR> [Fri Feb 9 02:52:56 2007] xdm_odbc: the ODBC driver reported -1 during SQLConnect:<BR> [Fri Feb 9 02:52:56 2007] xdm_odbc: HYT00:1:2019:[unixODBC][MySQL][ODBC 3.51 Driver]Can't initialize character set latin1 (path: /usr/share/mysql/charsets/)<BR> [Fri Feb 9 02:52:56 2007] xdm_odbc: ODBC Reconnect failed, error -1 .<BR></DIV> <DIV>What am I doing wrong? It seems simple enough to me. I noticed on the mailing list that a few folks had trouble using SQLDriverConnect, so I switched to SQLConnect, and now I get other types of errors trying to reconnect - not the least of these are that my daemon segfaults down inside of libmyodbc with the following stack trace:</DIV> <DIV> </DIV> <DIV>#0 0xb741dc5d in my_strcasecmp_8bit () from /usr/lib/mysql /libmysqlclient.so.15<BR>#1 0xb741514d in get_charset_number () from /usr /lib/mysql/libmysqlclient.so.15<BR>#2 0xb74151ab in get_charset_by_csname () from /usr/lib/mysql/libmysqlclient.so.15<BR>#3 0xb74320ec in mysql_real _connect () from /usr/lib/mysql/libmysqlclient.so.15<BR>#4 0xb753c15a in SQLConnect (hdbc=0x807fe78, szDSN=0xb7d8df51, cbDSN=-3,<BR> szUID=0xb7d8e270, cbUID=-3, szAuthStr=0xb7d8e1f0, cbAuthStr=-3) at connect.c :253<BR>#5 0xb7d9d394 in SQLConnect (connection_handle=0x80616f0,<BR>  ; server_name=0xb7d8e2f0, name_length1=-3, user_name=0xb7d8e270,<BR> name_length2=-3, authentication=0xb7d8e1f0, name_length3=-3) at SQLConnect.c:3820<BR>#6 0xb7f63c23 in sql_connect () at xdm_odbc.c:322 <BR>#7 0xb7f6411a in xdm_append (msg=0x80776a9, msgsz=272) at xdm_odbc.c :394<BR>#8 0x0804a3cf in xdasd_logger_append (msg=0x8077598, msgsz=272) at xdasd_logger.c:175<BR>#9 0x0804a0e2 in bg_logger (unused=0x0) at xdasd _lcache.c:90<BR>#10 0xb7f3b34b in start_thread () from /lib/libpthread.so.0<BR> #11 0xb7ed365e in clone () from /lib/libc.so.6<BR></DIV> <DIV>Any ideas would be appreciated.</DIV> <DIV> </DIV> <DIV>Thanks,</DIV> <DIV>John</DIV> <DIV> </DIV> <DIV> </DIV>-- --<BR>John Calcote (jcalcote@(protected))<BR>Sr. Software Engineeer<BR>Novell, Inc.<BR></BODY></HTML>
-- MySQL ODBC Mailing List For list archives: http://lists.mysql.com/myodbc To unsubscribe: http://lists.mysql.com/myodbc?unsub=mysql@(protected)
|
|