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 + -
显示快捷键?