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

Reply via email to