dsnchooser.c
来自「一个可以替代windows ODBC驱动程序管理器的通用ODBC数据库引擎」· C语言 代码 · 共 1,772 行 · 第 1/4 页
C
1,772 行
/* * dsnchooser.c * * $Id: dsnchooser.c,v 1.1 2001/06/07 00:49:40 source Exp $ * * 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 <sys/types.h>#include <sys/stat.h>#include <sys/param.h>#include <dirent.h>#include <errno.h>#include "gui.h"#include "odbc4.xpm"char *szDSNColumnNames[] = { "Name", "Description", "Driver"};char *szTabNames[] = { "User DSN", "System DSN", "File DSN", "ODBC Drivers", "Connection Pooling", "Tracing", "About"};char *szDSNButtons[] = { "_Add", "_Remove", "Confi_gure", "_Test",};static voiddisplay_sqlerror (HWND parent, LPCSTR description, LPCSTR dsn, HENV henv, HDBC hdbc, HSTMT hstmt){ UCHAR state[32], err[SQL_MAX_MESSAGE_LENGTH]; SDWORD native; SWORD len; char *message; if (SQLError (henv, hdbc, hstmt, state, &native, err, sizeof (err) - 1, &len) == SQL_SUCCESS) { message = (char *) malloc (STRLEN (err) + STRLEN ("SQL State : ") + 1); if (message) sprintf (message, "SQL State : %s", state); create_error (parent, dsn, description, message); }}voidaddlistofdir_to_optionmenu (GtkWidget *widget, LPCSTR path, TDSNCHOOSER *choose_t){ GtkWidget *menu, *menu_item; char *curr_dir, *prov, *dir; void **array; if (!path || !GTK_IS_OPTION_MENU (widget) || !(prov = strdup (path))) return; if (prov[STRLEN (prov) - 1] == '/' && STRLEN (prov) > 1) prov[STRLEN (prov) - 1] = 0; /* Add the root directory */ menu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_label ("/"); gtk_widget_show (menu_item); gtk_menu_prepend (GTK_MENU (menu), menu_item); if (!(array = (void **) malloc (sizeof (void *) * 2))) return; array[0] = g_strdup ("/"); array[1] = choose_t; gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (filedsn_lookin_clicked), array); for (curr_dir = prov, dir = NULL; curr_dir; curr_dir = strchr (curr_dir + 1, '/')) { if (strchr (curr_dir + 1, '/')) { dir = strchr (curr_dir + 1, '/'); *dir = 0; } menu_item = gtk_menu_item_new_with_label (prov); gtk_widget_show (menu_item); gtk_menu_prepend (GTK_MENU (menu), menu_item); if (!(array = (void **) malloc (sizeof (void *) * 2))) return; array[0] = g_strdup (prov); array[1] = choose_t; gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (filedsn_lookin_clicked), array); if (dir) *dir = '/'; } gtk_option_menu_remove_menu (GTK_OPTION_MENU (widget)); gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu); free (prov);}voidadddirectories_to_list (HWND hwnd, GtkWidget *widget, LPCSTR path){ DIR *dir; char *path_buf[MAXPATHLEN * 2]; struct dirent *dir_entry; struct stat fstat; char *data[1]; if (!path || !GTK_IS_CLIST (widget)) return; if ((dir = opendir (path))) { /* Remove all the entries */ gtk_clist_clear (GTK_CLIST (widget)); while ((dir_entry = readdir (dir))) { STRCPY (path_buf, path); if (path[STRLEN (path) - 1] != '/') STRCAT (path_buf, "/"); STRCAT (path_buf, dir_entry->d_name); if (stat ((LPCSTR) path_buf, &fstat) >= 0 && S_ISDIR (fstat.st_mode)) if (strcmp (path, "/") || strcmp (dir_entry->d_name, "..")) { data[0] = dir_entry->d_name; gtk_clist_append (GTK_CLIST (widget), data); } } /* Close the directory entry */ closedir (dir); if (GTK_CLIST (widget)->rows > 0) gtk_clist_sort (GTK_CLIST (widget)); } else create_error (hwnd, NULL, "Error during accessing directory information", strerror (errno));}voidaddfiles_to_list (HWND hwnd, GtkWidget *widget, LPCSTR path){ DIR *dir; char *path_buf[MAXPATHLEN * 2]; struct dirent *dir_entry; struct stat fstat; char *data[1]; if (!path || !GTK_IS_CLIST (widget)) return; if ((dir = opendir (path))) { /* Remove all the entries */ gtk_clist_clear (GTK_CLIST (widget)); while ((dir_entry = readdir (dir))) { STRCPY (path_buf, path); if (path[STRLEN (path) - 1] != '/') STRCAT (path_buf, "/"); STRCAT (path_buf, dir_entry->d_name); if (stat ((LPCSTR) path_buf, &fstat) >= 0 && !S_ISDIR (fstat.st_mode) && strstr (dir_entry->d_name, ".dsn")) { data[0] = dir_entry->d_name; gtk_clist_append (GTK_CLIST (widget), data); } } /* Close the directory entry */ closedir (dir); if (GTK_CLIST (widget)->rows > 0) gtk_clist_sort (GTK_CLIST (widget)); } else create_error (hwnd, NULL, "Error during accessing directory information", strerror (errno));}voidadddsns_to_list (GtkWidget *widget, BOOL systemDSN){ char *curr, *buffer = (char *) malloc (sizeof (char) * 65536); char diz[1024], driver[1024]; char *data[3]; int len, _case = 0, row = 0; if (!buffer || !GTK_IS_CLIST (widget)) return; gtk_clist_clear (GTK_CLIST (widget)); /* Get the list of DSN in the user context */ SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); len = SQLGetPrivateProfileString ("ODBC Data Sources", NULL, "", buffer, 65536, NULL); if (len) goto process; _case = 1; SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); len = SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", NULL, "", buffer, 65536, NULL); if (len) goto process; goto end;process: for (curr = buffer; *curr; curr += (STRLEN (curr) + 1)) { SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); SQLGetPrivateProfileString (curr, "Description", "", diz, sizeof (diz), NULL); SQLSetConfigMode (systemDSN ? ODBC_SYSTEM_DSN : ODBC_USER_DSN); switch (_case) { case 0: SQLGetPrivateProfileString ("ODBC Data Sources", curr, "", driver, sizeof (driver), NULL); break; case 1: SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", curr, "", driver, sizeof (driver), NULL); break; }; if (STRLEN (curr) && STRLEN (driver)) { data[0] = curr; data[1] = diz; data[2] = driver; gtk_clist_append (GTK_CLIST (widget), data); } }end: SQLSetConfigMode (ODBC_BOTH_DSN); if (GTK_CLIST (widget)->rows > 0) { gtk_clist_columns_autosize (GTK_CLIST (widget)); gtk_clist_sort (GTK_CLIST (widget)); } /* Make the clean up */ free (buffer);}static voiddsnchooser_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, TDSNCHOOSER *choose_t){ if (choose_t) { switch (page_num) { case 0: choose_t->type_dsn = 0; adddsns_to_list (choose_t->udsnlist, FALSE); break; case 1: choose_t->type_dsn = 1; adddsns_to_list (choose_t->sdsnlist, TRUE); break; case 2: choose_t->type_dsn = 2; break; }; if (choose_t) { if (choose_t->uremove) gtk_widget_set_sensitive (choose_t->uremove, FALSE); if (choose_t->uconfigure) gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); if (choose_t->utest) gtk_widget_set_sensitive (choose_t->utest, FALSE); if (choose_t->sremove) gtk_widget_set_sensitive (choose_t->sremove, FALSE); if (choose_t->sconfigure) gtk_widget_set_sensitive (choose_t->sconfigure, FALSE); if (choose_t->stest) gtk_widget_set_sensitive (choose_t->stest, FALSE); } }}voiduserdsn_add_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t){ char connstr[4096] = { 0 }; char drv[1024] = { 0 }; int sqlstat; DWORD error; if (choose_t) { /* Try first to get the driver name */ SQLSetConfigMode (ODBC_USER_DSN); if (_iodbcdm_drvchoose_dialbox (choose_t->mainwnd, drv, sizeof (drv), &sqlstat) == SQL_SUCCESS) { SQLSetConfigMode (ODBC_USER_DSN); if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_ADD_DSN, drv + STRLEN ("DRIVER="), connstr)) { if (SQLInstallerError (1, &error, connstr, sizeof (connstr), NULL) != SQL_NO_DATA) _iodbcdm_errorbox (choose_t->mainwnd, NULL, "An error occured when trying to add the DSN : "); goto done; } adddsns_to_list (choose_t->udsnlist, FALSE); } done: if (GTK_CLIST (choose_t->udsnlist)->selection == NULL) { if (choose_t->uremove) gtk_widget_set_sensitive (choose_t->uremove, FALSE); if (choose_t->uconfigure) gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); if (choose_t->utest) gtk_widget_set_sensitive (choose_t->utest, FALSE); } } return;}voiduserdsn_remove_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t){ char dsn[1024] = { 0 }; char *szDSN = NULL, *szDriver = NULL; if (choose_t) { /* Retrieve the DSN name */ if (GTK_CLIST (choose_t->udsnlist)->selection != NULL) { gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> data), 0, &szDSN); gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> data), 2, &szDriver); } /* Call the right function */ if (szDSN && create_confirm (choose_t->mainwnd, szDSN, "Are you sure you want to remove this DSN ?")) { sprintf (dsn, "DSN=%s\0", szDSN); dsn[STRLEN (dsn) + 1] = 0; if (!SQLConfigDataSource (choose_t->mainwnd, ODBC_REMOVE_DSN, szDriver, dsn)) _iodbcdm_errorbox (choose_t->mainwnd, szDSN, "An error occured when trying to remove the DSN : "); adddsns_to_list (choose_t->udsnlist, FALSE); } if (GTK_CLIST (choose_t->udsnlist)->selection == NULL) { if (choose_t->uremove) gtk_widget_set_sensitive (choose_t->uremove, FALSE); if (choose_t->uconfigure) gtk_widget_set_sensitive (choose_t->uconfigure, FALSE); if (choose_t->utest) gtk_widget_set_sensitive (choose_t->utest, FALSE); } }}voiduserdsn_configure_clicked (GtkWidget *widget, TDSNCHOOSER *choose_t){ char connstr[4096] = { 0 }; char tokenstr[4096] = { 0 }; char *szDSN = NULL, *szDriver = NULL, *curr, *cour; int size = sizeof (connstr); DWORD error; if (choose_t) { /* Retrieve the DSN name */ if (GTK_CLIST (choose_t->udsnlist)->selection != NULL) { gtk_clist_get_text (GTK_CLIST (choose_t->udsnlist), GPOINTER_TO_INT (GTK_CLIST (choose_t->udsnlist)->selection-> data), 0, &szDSN);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?