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 -- [email protected]
To unsubscribe send an email to [email protected]