Changeset: ebd87e1a690b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ebd87e1a690b
Modified Files:
clients/odbc/driver/ODBCDbc.h
clients/odbc/driver/SQLBrowseConnect.c
clients/odbc/driver/SQLDriverConnect.c
Branch: Dec2011
Log Message:
ODBC: SQLBrowseConnect should return connection string when successfully
connected.
diffs (truncated from 321 to 300 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
@@ -146,6 +146,13 @@ ODBCError *getDbcError(ODBCDbc *dbc);
void destroyODBCDbc(ODBCDbc *dbc);
int ODBCGetKeyAttr(SQLCHAR **conn, SQLSMALLINT *nconn, char **key, char
**attr);
+SQLRETURN ODBCConnectionString(SQLRETURN rc, ODBCDbc *dbc,
+ SQLCHAR *OutConnectionString,
+ SQLSMALLINT BufferLength,
+ SQLSMALLINT *StringLength2Ptr,
+ const char *dsn, const char *uid,
+ const char *pwd, const char *host,
+ int port, const char *database);
SQLRETURN SQLAllocStmt_(ODBCDbc *dbc, SQLHANDLE *pnOutputHandle);
SQLRETURN SQLConnect_(ODBCDbc *dbc, SQLCHAR *szDataSource, SQLSMALLINT
nDataSourceLength, SQLCHAR *szUID, SQLSMALLINT nUIDLength, SQLCHAR *szPWD,
SQLSMALLINT nPWDLength, const char *host, int port, const char *schema);
SQLRETURN SQLGetConnectAttr_(ODBCDbc *dbc, SQLINTEGER Attribute, SQLPOINTER
ValuePtr, SQLINTEGER BufferLength, SQLINTEGER *StringLength);
diff --git a/clients/odbc/driver/SQLBrowseConnect.c
b/clients/odbc/driver/SQLBrowseConnect.c
--- a/clients/odbc/driver/SQLBrowseConnect.c
+++ b/clients/odbc/driver/SQLBrowseConnect.c
@@ -170,6 +170,13 @@ SQLBrowseConnect_(ODBCDbc *dbc,
if (uid != NULL && pwd != NULL) {
rc = SQLConnect_(dbc, (SQLCHAR *) dsn, SQL_NTS, (SQLCHAR *)
uid, SQL_NTS, (SQLCHAR *) pwd, SQL_NTS, host, port, dbname);
+ if (SQL_SUCCEEDED(rc)) {
+ rc = ODBCConnectionString(rc, dbc, OutConnectionString,
+ BufferLength,
+ StringLength2Ptr,
+ dsn, uid, pwd, host, port,
+ dbname);
+ }
} else {
if (uid == NULL) {
if (BufferLength > 0)
@@ -291,10 +298,12 @@ SQLBrowseConnectW(SQLHDBC ConnectionHand
clearDbcErrors(dbc);
- fixWcharIn(InConnectionString, StringLength1, SQLCHAR, in, addDbcError,
dbc, return SQL_ERROR);
- out = malloc(100); /* max 80 needed */
- rc = SQLBrowseConnect_(dbc, in, SQL_NTS, out, 100, &n);
- fixWcharOut(rc, out, n, OutConnectionString, BufferLength,
StringLength2Ptr, 1, addDbcError, dbc);
+ fixWcharIn(InConnectionString, StringLength1, SQLCHAR, in,
+ addDbcError, dbc, return SQL_ERROR);
+ out = malloc(1024);
+ rc = SQLBrowseConnect_(dbc, in, SQL_NTS, out, 1024, &n);
+ fixWcharOut(rc, out, n, OutConnectionString, BufferLength,
+ StringLength2Ptr, 1, addDbcError, dbc);
if (in)
free(in);
return rc;
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
@@ -102,6 +102,144 @@ ODBCGetKeyAttr(SQLCHAR **conn, SQLSMALLI
return 1;
}
+SQLRETURN
+ODBCConnectionString(SQLRETURN rc,
+ ODBCDbc *dbc,
+ SQLCHAR *OutConnectionString,
+ SQLSMALLINT BufferLength,
+ SQLSMALLINT *StringLength2Ptr,
+ const char *dsn,
+ const char *uid,
+ const char *pwd,
+ const char *host,
+ int port,
+ const char *database)
+{
+ int n;
+#ifdef ODBCDEBUG
+ SQLCHAR *buf = OutConnectionString;
+ int buflen = BufferLength;
+#endif
+
+ if (OutConnectionString == NULL)
+ BufferLength = -1;
+ if (BufferLength > 0) {
+ n = snprintf((char *) OutConnectionString, BufferLength,
+ "DSN=%s;", dsn ? dsn : "DEFAULT");
+ /* some snprintf's return -1 if buffer too small */
+ if (n < 0)
+ n = BufferLength + 1; /* make sure it becomes < 0 */
+ BufferLength -= n;
+ OutConnectionString += n;
+ } else {
+ BufferLength = -1;
+ }
+ if (uid) {
+ if (BufferLength > 0) {
+ n = snprintf((char *) OutConnectionString,
+ BufferLength, "UID=%s;", uid);
+ if (n < 0)
+ n = BufferLength + 1;
+ BufferLength -= n;
+ OutConnectionString += n;
+ } else {
+ BufferLength = -1;
+ }
+ }
+ if (pwd) {
+ if (BufferLength > 0) {
+ n = snprintf((char *) OutConnectionString,
+ BufferLength, "PWD=%s;", pwd);
+ if (n < 0)
+ n = BufferLength + 1;
+ BufferLength -= n;
+ OutConnectionString += n;
+ } else {
+ BufferLength = -1;
+ }
+ }
+ if (host) {
+ if (BufferLength > 0) {
+ n = snprintf((char *) OutConnectionString,
+ BufferLength, "HOST=%s;", host);
+ if (n < 0)
+ n = BufferLength + 1;
+ BufferLength -= n;
+ OutConnectionString += n;
+ } else {
+ BufferLength = -1;
+ }
+ }
+ if (port) {
+ char portbuf[10];
+
+ if (BufferLength > 0) {
+ n = snprintf((char *) OutConnectionString,
+ BufferLength, "PORT=%d;", port);
+ if (n < 0)
+ n = BufferLength + 1;
+ BufferLength -= n;
+ OutConnectionString += n;
+ } else {
+ BufferLength = -1;
+ }
+ port = snprintf(portbuf, sizeof(portbuf), "%d", port);
+ }
+ if (database) {
+ if (BufferLength > 0) {
+ n = snprintf((char *) OutConnectionString,
+ BufferLength,
+ "DATABASE=%s;", database);
+ if (n < 0)
+ n = BufferLength + 1;
+ BufferLength -= n;
+ OutConnectionString += n;
+ } else {
+ BufferLength = -1;
+ }
+ }
+#ifdef ODBCDEBUG
+ if (ODBCdebug && getenv("ODBCDEBUG") == NULL) {
+ if (BufferLength > 0) {
+ n = snprintf((char *) OutConnectionString,
+ BufferLength,
+ "LOGFILE=%s;", ODBCdebug);
+ if (n < 0)
+ n = BufferLength + 1;
+ BufferLength -= n;
+ OutConnectionString += n;
+ } else {
+ BufferLength = -1;
+ }
+ }
+#endif
+
+ /* calculate how much space was needed */
+ if (StringLength2Ptr)
+ *StringLength2Ptr = (int) (strlen(dsn ? dsn : "DEFAULT") + 5 +
+ (uid ? strlen(uid) + 5 : 0) +
+ (pwd ? strlen(pwd) + 5 : 0) +
+ (host ? strlen(host) + 6 : 0) +
+ (port ? port + 6 : 0) +
+ (database ? strlen(database) + 10 :
0)
+#ifdef ODBCDEBUG
+ + (ODBCdebug && getenv("ODBCDEBUG")
== NULL ? strlen(ODBCdebug) + 9 : 0)
+#endif
+ );
+
+#ifdef ODBCDEBUG
+ ODBCLOG("ConnectionString: \"%.*s\" %d\n", buf ? buflen : 6, buf ? buf
: "(null)", buflen);
+#endif
+
+ /* if it didn't fit, say so */
+ if (BufferLength < 0) {
+ /* String data, right-truncated */
+ addDbcError(dbc, "01004", NULL, 0);
+ return SQL_SUCCESS_WITH_INFO;
+ }
+ return rc;
+}
+
static SQLRETURN
SQLDriverConnect_(ODBCDbc *dbc,
SQLHWND WindowHandle,
@@ -189,117 +327,11 @@ SQLDriverConnect_(ODBCDbc *dbc,
}
if (SQL_SUCCEEDED(rc)) {
- int n;
+ rc = ODBCConnectionString(rc, dbc, OutConnectionString,
+ BufferLength, StringLength2Ptr,
+ dsn, uid, pwd, host, port, database);
+ }
- if (OutConnectionString == NULL)
- BufferLength = -1;
- if (BufferLength > 0) {
- n = snprintf((char *) OutConnectionString, BufferLength,
- "DSN=%s;", dsn ? dsn : "DEFAULT");
- /* some snprintf's return -1 if buffer too small */
- if (n < 0)
- n = BufferLength + 1; /* make sure it becomes
< 0 */
- BufferLength -= n;
- OutConnectionString += n;
- } else {
- BufferLength = -1;
- }
- if (uid) {
- if (BufferLength > 0) {
- n = snprintf((char *) OutConnectionString,
- BufferLength, "UID=%s;", uid);
- if (n < 0)
- n = BufferLength + 1;
- BufferLength -= n;
- OutConnectionString += n;
- } else {
- BufferLength = -1;
- }
- }
- if (pwd) {
- if (BufferLength > 0) {
- n = snprintf((char *) OutConnectionString,
- BufferLength, "PWD=%s;", pwd);
- if (n < 0)
- n = BufferLength + 1;
- BufferLength -= n;
- OutConnectionString += n;
- } else {
- BufferLength = -1;
- }
- }
- if (host) {
- if (BufferLength > 0) {
- n = snprintf((char *) OutConnectionString,
- BufferLength, "HOST=%s;", host);
- if (n < 0)
- n = BufferLength + 1;
- BufferLength -= n;
- OutConnectionString += n;
- } else {
- BufferLength = -1;
- }
- }
- if (port) {
- char portbuf[10];
-
- if (BufferLength > 0) {
- n = snprintf((char *) OutConnectionString,
- BufferLength, "PORT=%d;", port);
- if (n < 0)
- n = BufferLength + 1;
- BufferLength -= n;
- OutConnectionString += n;
- } else {
- BufferLength = -1;
- }
- port = snprintf(portbuf, sizeof(portbuf), "%d", port);
- }
- if (database) {
- if (BufferLength > 0) {
- n = snprintf((char *) OutConnectionString,
- BufferLength,
- "DATABASE=%s;", database);
- if (n < 0)
- n = BufferLength + 1;
- BufferLength -= n;
- OutConnectionString += n;
- } else {
- BufferLength = -1;
- }
- }
-#ifdef ODBCDEBUG
- if (ODBCdebug) {
- if (BufferLength > 0) {
- n = snprintf((char *) OutConnectionString,
- BufferLength,
- "LOGFILE=%s;", ODBCdebug);
- if (n < 0)
- n = BufferLength + 1;
- BufferLength -= n;
- OutConnectionString += n;
- } else {
- BufferLength = -1;
- }
- }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list