drvconn.c
来自「一个可以替代windows ODBC驱动程序管理器的通用ODBC数据库引擎」· C语言 代码 · 共 385 行
C
385 行
/* * drvconn.c * * $Id: drvconn.c,v 1.1 2001/06/07 00:49:40 source Exp $ * * The data_sources dialog for SQLDriverConnect and a login box procedures * * The iODBC driver manager. * * Copyright (C) 2001 by OpenLink Software <iodbc@openlinksw.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include "gui.h"#include <herr.h>#include <dlproc.h>#ifndef WIN32#include <unistd.h>#define CALL_DRVCONN_DIALBOX(path) \ if ((handle = DLL_OPEN(path)) != NULL) \ { \ if ((pDrvConn = (pDrvConnFunc)DLL_PROC(handle, "_iodbcdm_drvconn_dialbox")) != NULL) \ { \ if (pDrvConn (hwnd, connstr, cbInOutConnStr, sqlStat) == SQL_SUCCESS) \ { \ DLL_CLOSE(handle); \ retcode = SQL_SUCCESS; \ goto login; \ } \ } \ DLL_CLOSE(handle); \ }#endifextern SQLRETURN iodbcdm_loginbox (HWND, LPSTR, DWORD, int FAR *);extern void create_translatorchooser (HWND, TTRANSLATORCHOOSER *);SQLRETURN SQL_APIiodbcdm_drvconn_dialbox ( HWND hwnd, LPSTR szInOutConnStr, DWORD cbInOutConnStr, int FAR * sqlStat){ RETCODE retcode = SQL_ERROR; TDSNCHOOSER choose_t; UWORD configMode = ODBC_BOTH_DSN; char *szDSN = NULL, *curr, *cour, *connstr = NULL, *szDriver = NULL; char tokenstr[4096], eltstr[4096], drvbuf[4096]; HDLL handle; pDrvConnFunc pDrvConn; int i;#ifdef _MACX CFStringRef libname; CFBundleRef bundle; CFURLRef liburl; char name[1024] = { 0 };#endif /* Check input parameters */ if (!hwnd || !szInOutConnStr || cbInOutConnStr < 1) goto quit; /* Check if the DSN is already set or DRIVER */ for (curr = szInOutConnStr; *curr; curr += (STRLEN (curr) + 1)) { if (!strncasecmp (curr, "DSN=", STRLEN ("DSN="))) szDSN = curr + STRLEN ("DSN="); if (!strncasecmp (curr, "DRIVER=", STRLEN ("DRIVER="))) szDriver = curr + STRLEN ("DRIVER="); } if (!szDSN) { create_dsnchooser (hwnd, &choose_t); /* Check output parameters */ if (choose_t.dsn) { if (cbInOutConnStr > STRLEN (choose_t.dsn) + STRLEN ("DSN=")) { sprintf (szInOutConnStr, "DSN=%s", choose_t.dsn); szDSN = szInOutConnStr + STRLEN ("DSN="); retcode = SQL_SUCCESS; } else { if (sqlStat)#if (ODBCVER>=0x3000) *sqlStat = en_HY092;#else *sqlStat = en_S1000;#endif retcode = SQL_ERROR; } } else retcode = SQL_NO_DATA; if (choose_t.dsn) free (choose_t.dsn); if (retcode != SQL_SUCCESS) goto quit; } if (szDSN == NULL || szDSN[0] == '\0') szDSN = "default"; /* Get the config mode */ SQLGetConfigMode (&configMode); /* Read the file DSN and check if enough parameters are provided */ connstr = (LPSTR) malloc (sizeof (char) * cbInOutConnStr); if (!connstr) { if (sqlStat)#if (ODBCVER>=0x3000) *sqlStat = en_HY092;#else *sqlStat = en_S1000;#endif retcode = SQL_ERROR; goto quit; } sprintf (connstr, "DSN=%s", szDSN); i = STRLEN (connstr) + 1; /* Retrieve some information */ SQLSetConfigMode (configMode); if (SQLGetPrivateProfileString (szDSN, NULL, "", tokenstr, sizeof (tokenstr), NULL)) for (curr = connstr + i, cour = tokenstr; *cour; i += (STRLEN (curr) + 1), cour += (STRLEN (cour) + 1), curr += (STRLEN (curr) + 1)) { SQLSetConfigMode (configMode); SQLGetPrivateProfileString (szDSN, cour, "", eltstr, sizeof (eltstr), NULL); if (i + STRLEN (eltstr) + STRLEN (cour) + 2 < cbInOutConnStr) { STRCPY (curr, cour); STRCAT (curr, "="); STRCAT (curr, eltstr); } else { if (sqlStat)#if (ODBCVER>=0x3000) *sqlStat = en_HY092;#else *sqlStat = en_S1000;#endif retcode = SQL_ERROR; goto quit; } } else memcpy (connstr, szInOutConnStr, cbInOutConnStr); *curr = 0; SQLSetConfigMode (configMode);#ifdef WIN32 if (SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", szDSN, "", tokenstr, sizeof (tokenstr), NULL))#else if (SQLGetPrivateProfileString ("ODBC Data Sources", szDSN, "", tokenstr, sizeof (tokenstr), NULL))#endif szDriver = tokenstr; /* Call the _iodbcadm_drvconn_dialbox of the specific driver */ SQLSetConfigMode (ODBC_USER_DSN); if (SQLGetPrivateProfileString (szDriver, "Driver", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); if (SQLGetPrivateProfileString (szDriver, "Setup", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); if (szDriver && !access (szDriver, X_OK)) CALL_DRVCONN_DIALBOX (szDriver); if (SQLGetPrivateProfileString ("Default", "Driver", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); if (SQLGetPrivateProfileString ("Default", "Setup", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); SQLSetConfigMode (ODBC_SYSTEM_DSN); if (SQLGetPrivateProfileString (szDriver, "Driver", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); if (SQLGetPrivateProfileString (szDriver, "Setup", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); if (szDriver && !access (szDriver, X_OK)) CALL_DRVCONN_DIALBOX (szDriver); if (SQLGetPrivateProfileString ("Default", "Driver", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); if (SQLGetPrivateProfileString ("Default", "Setup", "", drvbuf, sizeof (drvbuf), "odbcinst.ini")) CALL_DRVCONN_DIALBOX (drvbuf); /* The last ressort, a proxy driver */#ifdef _MACX bundle = CFBundleGetBundleWithIdentifier (CFSTR ("org.iodbc.core")); if (bundle) { /* Search for the drvproxy library */ liburl = CFBundleCopyResourceURL (bundle, CFSTR ("iODBCdrvproxy.bundle"), NULL, NULL); if (liburl && (libname = CFURLCopyFileSystemPath (liburl, kCFURLPOSIXPathStyle))) { CFStringGetCString (libname, name, sizeof (name), kCFStringEncodingASCII); strcat (name, "/Contents/MacOS/iODBCdrvproxy"); CALL_DRVCONN_DIALBOX (name); } if (liburl) CFRelease (liburl); if (libname) CFRelease (libname); CFRelease (bundle); }#else CALL_DRVCONN_DIALBOX ("libdrvproxy.so");#endif if (sqlStat) *sqlStat = en_IM003; goto quit;login: if (iodbcdm_loginbox (hwnd, connstr, cbInOutConnStr, sqlStat) != SQL_SUCCESS) goto quit; retcode = SQL_SUCCESS;quit: if (connstr) { for (i = 0; connstr[i] || connstr[i + 1]; i++) if (!connstr[i]) connstr[i] = ';'; STRNCPY (szInOutConnStr, connstr, (cbInOutConnStr != SQL_NTS) ? cbInOutConnStr : STRLEN (connstr) + 1); free (connstr); } return retcode;}SQLRETURN SQL_API_iodbcdm_drvchoose_dialbox ( HWND hwnd, LPSTR szInOutConnStr, DWORD cbInOutConnStr, int FAR * sqlStat){ RETCODE retcode = SQL_ERROR; TDRIVERCHOOSER choose_t; /* Check input parameters */ if (!hwnd || !szInOutConnStr || cbInOutConnStr < 1) goto quit; create_driverchooser (hwnd, &choose_t); /* Check output parameters */ if (choose_t.driver) { if (cbInOutConnStr > STRLEN (choose_t.driver) + STRLEN ("DRIVER=")) { sprintf (szInOutConnStr, "DRIVER=%s", choose_t.driver); retcode = SQL_SUCCESS; } else { if (sqlStat)#if (ODBCVER>=0x3000) *sqlStat = en_HY092;#else *sqlStat = en_S1000;#endif retcode = SQL_ERROR; } } else retcode = SQL_NO_DATA; if (choose_t.driver) free (choose_t.driver);quit: return retcode;}SQLRETURN SQL_API_iodbcdm_admin_dialbox (HWND hwnd){ RETCODE retcode = SQL_ERROR; /* Check input parameters */ if (!hwnd) goto quit; create_administrator (hwnd); retcode = SQL_SUCCESS;quit: return retcode;}SQLRETURN SQL_API_iodbcdm_trschoose_dialbox ( HWND hwnd, LPSTR szInOutConnStr, DWORD cbInOutConnStr, int FAR * sqlStat){ RETCODE retcode = SQL_ERROR; TTRANSLATORCHOOSER choose_t; /* Check input parameters */ if (!hwnd || !szInOutConnStr || cbInOutConnStr < 1) goto quit; create_translatorchooser (hwnd, &choose_t); /* Check output parameters */ if (choose_t.translator) { if (cbInOutConnStr > STRLEN (choose_t.translator) + STRLEN ("TranslationName=")) { sprintf (szInOutConnStr, "TranslationName=%s", choose_t.translator); retcode = SQL_SUCCESS; } else { if (sqlStat)#if (ODBCVER>=0x3000) *sqlStat = en_HY092;#else *sqlStat = en_S1000;#endif retcode = SQL_ERROR; } } else retcode = SQL_NO_DATA; if (choose_t.translator) free (choose_t.translator);quit: return retcode;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?