⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setup.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
字号:
/* Module:          setup.c * * Description:     This module contains the setup functions for  *                  adding/modifying a Data Source in the ODBC.INI portion *                  of the registry. * * Classes:         n/a * * API functions:   ConfigDSN * * Comments:        See "notice.txt" for copyright and license information. * *************************************************************************************/#include  "psqlodbc.h"#include  "connection.h"#include  <windows.h>#include  <windowsx.h>#include  <odbcinst.h>#include  <string.h>#include  <stdlib.h>#include  "resource.h"#include  "dlg_specific.h"#define INTFUNC  __stdcallextern HINSTANCE NEAR s_hModule;               /* Saved module handle. */extern GLOBAL_VALUES globals;// Constants ---------------------------------------------------------------#define MIN(x,y)      ((x) < (y) ? (x) : (y))#define MAXPATHLEN      (255+1)           // Max path length#define MAXKEYLEN       (15+1)            // Max keyword length#define MAXDESC         (255+1)           // Max description length#define MAXDSNAME       (32+1)            // Max data source name length// Globals -----------------------------------------------------------------// NOTE:  All these are used by the dialog procedurestypedef struct tagSETUPDLG {        HWND       hwndParent;                   // Parent window handle        LPCSTR     lpszDrvr;                     // Driver description		ConnInfo   ci;        char       szDSN[MAXDSNAME];             // Original data source name        BOOL       fNewDSN;                      // New data source flag        BOOL       fDefault;                     // Default data source flag} SETUPDLG, FAR *LPSETUPDLG;// Prototypes --------------------------------------------------------------void INTFUNC CenterDialog(HWND hdlg);int  CALLBACK ConfigDlgProc(HWND hdlg, WORD wMsg, WPARAM wParam, LPARAM lParam);void INTFUNC ParseAttributes (LPCSTR lpszAttributes, LPSETUPDLG lpsetupdlg);BOOL INTFUNC SetDSNAttributes(HWND hwnd, LPSETUPDLG lpsetupdlg);/* ConfigDSN ---------------------------------------------------------------  Description:  ODBC Setup entry point                This entry point is called by the ODBC Installer                (see file header for more details)  Input      :  hwnd ----------- Parent window handle                fRequest ------- Request type (i.e., add, config, or remove)                lpszDriver ----- Driver name                lpszAttributes - data source attribute string  Output     :  TRUE success, FALSE otherwise--------------------------------------------------------------------------*/BOOL CALLBACK ConfigDSN (HWND    hwnd,                         WORD    fRequest,                         LPCSTR  lpszDriver,                         LPCSTR  lpszAttributes){BOOL  fSuccess;                                            // Success/fail flagGLOBALHANDLE hglbAttr;LPSETUPDLG lpsetupdlg;                // Allocate attribute array        hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG));        if (!hglbAttr)                return FALSE;        lpsetupdlg = (LPSETUPDLG)GlobalLock(hglbAttr);        // Parse attribute string        if (lpszAttributes)                ParseAttributes(lpszAttributes, lpsetupdlg);        // Save original data source name        if (lpsetupdlg->ci.dsn[0])                lstrcpy(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn);        else                lpsetupdlg->szDSN[0] = '\0';        // Remove data source        if (ODBC_REMOVE_DSN == fRequest) {                // Fail if no data source name was supplied                if (!lpsetupdlg->ci.dsn[0])                        fSuccess = FALSE;                // Otherwise remove data source from ODBC.INI                else                        fSuccess = SQLRemoveDSNFromIni(lpsetupdlg->ci.dsn);        }        // Add or Configure data source        else {                // Save passed variables for global access (e.g., dialog access)                lpsetupdlg->hwndParent = hwnd;                lpsetupdlg->lpszDrvr     = lpszDriver;                lpsetupdlg->fNewDSN      = (ODBC_ADD_DSN == fRequest);                lpsetupdlg->fDefault     = !lstrcmpi(lpsetupdlg->ci.dsn, INI_DSN);                // Display the appropriate dialog (if parent window handle supplied)                if (hwnd) {                        // Display dialog(s)                          fSuccess = (IDOK == DialogBoxParam(s_hModule,                                                                MAKEINTRESOURCE(DLG_CONFIG),                                                                hwnd,                                                                ConfigDlgProc,                                                                (LONG)(LPSTR)lpsetupdlg));                }                else if (lpsetupdlg->ci.dsn[0])                        fSuccess = SetDSNAttributes(hwnd, lpsetupdlg);                else                        fSuccess = FALSE;        }        GlobalUnlock(hglbAttr);        GlobalFree(hglbAttr);        return fSuccess;}/* CenterDialog ------------------------------------------------------------        Description:  Center the dialog over the frame window        Input      :  hdlg -- Dialog window handle        Output     :  None--------------------------------------------------------------------------*/void INTFUNC CenterDialog(HWND hdlg){        HWND    hwndFrame;        RECT    rcDlg, rcScr, rcFrame;        int             cx, cy;        hwndFrame = GetParent(hdlg);        GetWindowRect(hdlg, &rcDlg);        cx = rcDlg.right  - rcDlg.left;        cy = rcDlg.bottom - rcDlg.top;        GetClientRect(hwndFrame, &rcFrame);        ClientToScreen(hwndFrame, (LPPOINT)(&rcFrame.left));        ClientToScreen(hwndFrame, (LPPOINT)(&rcFrame.right));        rcDlg.top    = rcFrame.top  + (((rcFrame.bottom - rcFrame.top) - cy) >> 1);        rcDlg.left   = rcFrame.left + (((rcFrame.right - rcFrame.left) - cx) >> 1);        rcDlg.bottom = rcDlg.top  + cy;        rcDlg.right  = rcDlg.left + cx;        GetWindowRect(GetDesktopWindow(), &rcScr);        if (rcDlg.bottom > rcScr.bottom)        {                rcDlg.bottom = rcScr.bottom;                rcDlg.top    = rcDlg.bottom - cy;        }        if (rcDlg.right  > rcScr.right)        {                rcDlg.right = rcScr.right;                rcDlg.left  = rcDlg.right - cx;        }        if (rcDlg.left < 0) rcDlg.left = 0;        if (rcDlg.top  < 0) rcDlg.top  = 0;        MoveWindow(hdlg, rcDlg.left, rcDlg.top, cx, cy, TRUE);        return;}/* ConfigDlgProc -----------------------------------------------------------  Description:  Manage add data source name dialog  Input      :  hdlg --- Dialog window handle                wMsg --- Message                wParam - Message parameter                lParam - Message parameter  Output     :  TRUE if message processed, FALSE otherwise--------------------------------------------------------------------------*/int CALLBACK ConfigDlgProc(HWND   hdlg,                           WORD   wMsg,                           WPARAM wParam,                           LPARAM lParam){	switch (wMsg) {	// Initialize the dialog	case WM_INITDIALOG:	{		LPSETUPDLG lpsetupdlg = (LPSETUPDLG) lParam;		ConnInfo *ci = &lpsetupdlg->ci;		/*	Hide the driver connect message */		ShowWindow(GetDlgItem(hdlg, DRV_MSG_LABEL), SW_HIDE);		SetWindowLong(hdlg, DWL_USER, lParam);		CenterDialog(hdlg);                             // Center dialog		// NOTE: Values supplied in the attribute string will always		//       override settings in ODBC.INI		//	Get the rest of the common attributes		getDSNinfo(ci, CONN_DONT_OVERWRITE);		//	Fill in any defaults		getDSNdefaults(ci);		// Initialize dialog fields		SetDlgStuff(hdlg, ci);		if (lpsetupdlg->fDefault) {			EnableWindow(GetDlgItem(hdlg, IDC_DSNAME), FALSE);			EnableWindow(GetDlgItem(hdlg, IDC_DSNAMETEXT), FALSE);		}		else			SendDlgItemMessage(hdlg, IDC_DSNAME,				EM_LIMITTEXT, (WPARAM)(MAXDSNAME-1), 0L);		SendDlgItemMessage(hdlg, IDC_DESC,			EM_LIMITTEXT, (WPARAM)(MAXDESC-1), 0L);		return TRUE;                                            // Focus was not set    }	// Process buttons	case WM_COMMAND:		switch (GET_WM_COMMAND_ID(wParam, lParam)) {		// Ensure the OK button is enabled only when a data source name		// is entered		case IDC_DSNAME:			if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE)			{				char    szItem[MAXDSNAME];              // Edit control text				// Enable/disable the OK button				EnableWindow(GetDlgItem(hdlg, IDOK),					GetDlgItemText(hdlg, IDC_DSNAME,					szItem, sizeof(szItem)));				return TRUE;			}			break;		// Accept results		case IDOK:		{			LPSETUPDLG lpsetupdlg;			lpsetupdlg = (LPSETUPDLG)GetWindowLong(hdlg, DWL_USER);			// Retrieve dialog values			if (!lpsetupdlg->fDefault)					GetDlgItemText(hdlg, IDC_DSNAME,							lpsetupdlg->ci.dsn,							sizeof(lpsetupdlg->ci.dsn));			//	Get Dialog Values			GetDlgStuff(hdlg, &lpsetupdlg->ci);			// Update ODBC.INI			SetDSNAttributes(hdlg, lpsetupdlg);        }		// Return to caller		case IDCANCEL:			EndDialog(hdlg, wParam);			return TRUE;		case IDC_DRIVER:			DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DRV),									hdlg, driver_optionsProc, (LPARAM) NULL);			return TRUE;		case IDC_DATASOURCE:			{			LPSETUPDLG lpsetupdlg;			lpsetupdlg = (LPSETUPDLG)GetWindowLong(hdlg, DWL_USER);			DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DS),									hdlg, ds_optionsProc, (LPARAM) &lpsetupdlg->ci);			return TRUE;			}		}		break;	}	// Message not processed	return FALSE;}/* ParseAttributes ---------------------------------------------------------  Description:  Parse attribute string moving values into the aAttr array  Input      :  lpszAttributes - Pointer to attribute string  Output     :  None (global aAttr normally updated)--------------------------------------------------------------------------*/void INTFUNC ParseAttributes(LPCSTR lpszAttributes, LPSETUPDLG lpsetupdlg){LPCSTR  lpsz;LPCSTR  lpszStart;char    aszKey[MAXKEYLEN];int     cbKey;char    value[MAXPATHLEN];		memset(&lpsetupdlg->ci, 0, sizeof(ConnInfo));        for (lpsz=lpszAttributes; *lpsz; lpsz++)        {  //  Extract key name (e.g., DSN), it must be terminated by an equals                lpszStart = lpsz;                for (;; lpsz++)                {                        if (!*lpsz)                                return;         // No key was found                        else if (*lpsz == '=')                                break;          // Valid key found                }                // Determine the key's index in the key table (-1 if not found)                cbKey    = lpsz - lpszStart;                if (cbKey < sizeof(aszKey))                {                        _fmemcpy(aszKey, lpszStart, cbKey);                        aszKey[cbKey] = '\0';                }                // Locate end of key value                lpszStart = ++lpsz;                for (; *lpsz; lpsz++);                // lpsetupdlg->aAttr[iElement].fSupplied = TRUE;                _fmemcpy(value, lpszStart, MIN(lpsz-lpszStart+1, MAXPATHLEN));				mylog("aszKey='%s', value='%s'\n", aszKey, value);				//	Copy the appropriate value to the conninfo 				copyAttributes(&lpsetupdlg->ci, aszKey, value);        }        return;}/* SetDSNAttributes --------------------------------------------------------  Description:  Write data source attributes to ODBC.INI  Input      :  hwnd - Parent window handle (plus globals)  Output     :  TRUE if successful, FALSE otherwise--------------------------------------------------------------------------*/BOOL INTFUNC SetDSNAttributes(HWND hwndParent, LPSETUPDLG lpsetupdlg){LPCSTR  lpszDSN;                                                // Pointer to data source name            lpszDSN = lpsetupdlg->ci.dsn;        // Validate arguments        if (lpsetupdlg->fNewDSN && !*lpsetupdlg->ci.dsn)                return FALSE;        // Write the data source name        if (!SQLWriteDSNToIni(lpszDSN, lpsetupdlg->lpszDrvr))        {                if (hwndParent)                {                        char  szBuf[MAXPATHLEN];                        char  szMsg[MAXPATHLEN];                        LoadString(s_hModule, IDS_BADDSN, szBuf, sizeof(szBuf));                        wsprintf(szMsg, szBuf, lpszDSN);                        LoadString(s_hModule, IDS_MSGTITLE, szBuf, sizeof(szBuf));                        MessageBox(hwndParent, szMsg, szBuf, MB_ICONEXCLAMATION | MB_OK);                }                return FALSE;        }        // Update ODBC.INI		writeDSNinfo(&lpsetupdlg->ci);        // If the data source name has changed, remove the old name        if (lstrcmpi(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn))        {                SQLRemoveDSNFromIni(lpsetupdlg->szDSN);        }        return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -