Changeset: 093d9a60f588 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/093d9a60f588
Modified Files:
        clients/odbc/driver/ODBCDbc.h
        clients/odbc/driver/SQLConnect.c
        clients/odbc/driver/SQLDriverConnect.c
        clients/odbc/samples/odbcconnect.c
Branch: odbc-tls
Log Message:

More valgrind


diffs (112 lines):

diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h
--- a/clients/odbc/driver/ODBCDbc.h
+++ b/clients/odbc/driver/ODBCDbc.h
@@ -164,6 +164,7 @@ SQLRETURN MNDBSetConnectAttr(ODBCDbc *db
  */
 extern char *ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t 
length, SQLULEN noscan);
 
+// consumes 'settings'!
 extern SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, const char *dsn, msettings 
*settings);
 extern SQLRETURN MNDBDriverConnect(ODBCDbc *dbc, SQLHWND WindowHandle, const 
SQLCHAR *InConnectionString, SQLSMALLINT StringLength1, SQLCHAR 
*OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength2Ptr, 
SQLUSMALLINT DriverCompletion, int tryOnly);
 
diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c
--- a/clients/odbc/driver/SQLConnect.c
+++ b/clients/odbc/driver/SQLConnect.c
@@ -482,9 +482,7 @@ MNDBConnect(ODBCDbc *dbc,
        SQLRETURN ret;
 
        ret = MNDBConnectSettings(dbc, dsn, settings);
-       if (SQL_SUCCEEDED(ret)) {
-               settings = NULL; // must not be free'd now
-       }
+       settings = NULL; // must not be free'd now
 
        goto end;
 
@@ -522,6 +520,7 @@ MNDBConnectSettings(ODBCDbc *dbc, const 
 
        Mapi mid = mapi_settings(settings);
        if (mid) {
+               settings = NULL; // will be free'd as part of 'mid' now
                mapi_setAutocommit(mid, dbc->sql_attr_autocommit == 
SQL_AUTOCOMMIT_ON);
                mapi_set_size_header(mid, true);
                mapi_reconnect(mid);
@@ -530,6 +529,9 @@ MNDBConnectSettings(ODBCDbc *dbc, const 
                const char *error_state = "08001";
                const char *error_explanation = mid ? mapi_error_str(mid) : 
NULL;
                addDbcError(dbc, error_state, error_explanation, 0);
+               if (mid)
+                       mapi_destroy(mid);
+               msettings_destroy(settings);
                msettings_destroy(clone);
                return SQL_ERROR;
        }
diff --git a/clients/odbc/driver/SQLDriverConnect.c 
b/clients/odbc/driver/SQLDriverConnect.c
--- a/clients/odbc/driver/SQLDriverConnect.c
+++ b/clients/odbc/driver/SQLDriverConnect.c
@@ -370,10 +370,10 @@ MNDBDriverConnect(ODBCDbc *dbc,
                setODBCdebug(scratch_no_alloc, false);
 
        rc = MNDBConnectSettings(dbc, dsn, settings);
+       settings = NULL; // do not free now
        if (!SQL_SUCCEEDED(rc))
                goto end; // not to 'failure', all errors have already been 
logged
 
-       settings = NULL; // do not free now
 
        // Build a connect string for the current connection
        // and put it in the buffer.
diff --git a/clients/odbc/samples/odbcconnect.c 
b/clients/odbc/samples/odbcconnect.c
--- a/clients/odbc/samples/odbcconnect.c
+++ b/clients/odbc/samples/odbcconnect.c
@@ -50,6 +50,17 @@ SQLHANDLE conn = NULL;
 
 SQLCHAR outbuf[4096];
 
+static void
+cleanup(void)
+{
+       if (conn) {
+               SQLDisconnect(conn);
+               SQLFreeHandle(SQL_HANDLE_DBC, conn);
+       }
+       if (env)
+               SQLFreeHandle(SQL_HANDLE_DBC, env);
+}
+
 int
 main(int argc, char **argv)
 {
@@ -108,10 +119,8 @@ main(int argc, char **argv)
                        break;
        }
 
-       SQLDisconnect(conn);
-       SQLFreeHandle(SQL_HANDLE_DBC, conn);
-       SQLFreeHandle(SQL_HANDLE_DBC, env);
        free(targets);
+       cleanup();
 
        return ret;
 }
@@ -137,7 +146,7 @@ ensure_ok(SQLSMALLINT type, SQLHANDLE ha
                        break;
                default:
                        fprintf(stderr, "Internal error: %s: unknown SQLRETURN 
%d", message, ret);
-                       exit(1);
+                       break;
        }
 
        SQLCHAR state[6];
@@ -157,6 +166,11 @@ ensure_ok(SQLSMALLINT type, SQLHANDLE ha
                }
                fprintf(stderr, "    - %s: %s\n", state, explanation);
        }
+
+       if (!SQL_SUCCEEDED(ret)) {
+               cleanup();
+               exit(1);
+       }
 }
 
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to