administrator.c

来自「一个可以替代windows ODBC驱动程序管理器的通用ODBC数据库引擎」· C语言 代码 · 共 1,788 行 · 第 1/5 页

C
1,788
字号
/* *  administrator.c * *  $Id: administrator.c,v 1.2 2001/06/11 12:36:50 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 <dlfcn.h>#include <sys/stat.h>#include <unistd.h>#include "../gui.h"#include "odbc4.xpm"#if defined(HAVE_DLADDR)#if defined(linux)typedef struct{  __const char *dli_fname;	/* File name of defining object.  */  void *dli_fbase;		/* Load address of that object.  */  __const char *dli_sname;	/* Name of nearest symbol.  */  void *dli_saddr;		/* Exact value of nearest symbol.  */} Dl_info;#endif#endif /* HAVE_DLADDR */static char *szDriverButtons[] = {  "_Add a driver",  "_Remove the driver",  "Confi_gure the driver"};static char *szCpLabels[] = {  "Name",  "Pool timeout (seconds)"};static char *szComponentNames[] = {  "libiodbc.so",  "libiodbcadm.so",  "libiodbcinst.so",  "libdrvproxy.so",  "libtranslator.so"};static voidaddcomponents_to_list (GtkWidget *widget){  char _date[1024], _size[1024];  char *data[5];  struct stat _stat;#if defined(HAVE_DLADDR)  Dl_info info;#endif  void *handle, *proc;  int i;  if (!GTK_IS_CLIST (widget))    return;  gtk_clist_clear (GTK_CLIST (widget));  for (i = 0; i < sizeof (szComponentNames) / sizeof (char *); i++)    {      if ((handle = dlopen (szComponentNames[i], RTLD_LAZY)))	{	  /* Take the name of the library */	  if ((proc = dlsym (handle, "libname")))	    {	      data[0] = *(char **) proc;	      data[1] = *(char **) dlsym (handle, "version");	      data[2] = szComponentNames[i];	      /* Take some information about the library */#ifdef HAVE_DLADDR	      dladdr (proc, &info);	      if (!stat (info.dli_fname, &_stat))		{		  sprintf (_size, "%d Kb", _stat.st_size / 1024);		  sprintf (_date, "%s", ctime (&_stat.st_mtime));		  data[3] = _date;		  data[4] = _size;		}	      else		{		  data[3] = "";		  data[4] = "";		}#else	      data[3] = "";	      data[4] = "";#endif	      gtk_clist_append (GTK_CLIST (widget), data);	    }	  dlclose (handle);	}    }  if (GTK_CLIST (widget)->rows > 0)    {      gtk_clist_columns_autosize (GTK_CLIST (widget));      gtk_clist_sort (GTK_CLIST (widget));    }}static voidaddconnectionpool_to_list (GtkWidget *widget){  char *curr, *buffer = (char *) malloc (sizeof (char) * 65536), *szDriver;  char driver[1024];  char *data[2];  int len, row = 0, i;  BOOL careabout;  UWORD confMode = ODBC_USER_DSN;  if (!buffer || !GTK_IS_CLIST (widget))    return;  gtk_clist_clear (GTK_CLIST (widget));  /* Get the current config mode */  while (confMode != ODBC_SYSTEM_DSN + 1)    {      /* Get the list of drivers in the user context */      SQLSetConfigMode (confMode);#ifdef WIN32      len =	  SQLGetPrivateProfileString ("ODBC 32 bit Drivers", NULL, "", buffer,	  65535, "odbcinst.ini");#else      len =	  SQLGetPrivateProfileString ("ODBC Drivers", NULL, "", buffer, 65535,	  "odbcinst.ini");#endif      if (len)	goto process;      goto end;    process:      for (curr = buffer; *curr; curr += (STRLEN (curr) + 1))	{	  /* Shadowing system odbcinst.ini */	  for (i = 0, careabout = TRUE; i < GTK_CLIST (widget)->rows; i++)	    {	      gtk_clist_get_text (GTK_CLIST (widget), i, 0, &szDriver);	      if (!strcmp (szDriver, curr))		{		  careabout = FALSE;		  break;		}	    }	  if (!careabout)	    continue;	  SQLSetConfigMode (confMode);#ifdef WIN32	  SQLGetPrivateProfileString ("ODBC 32 bit Drivers", curr, "", driver,	      sizeof (driver), "odbcinst.ini");#else	  SQLGetPrivateProfileString ("ODBC Drivers", curr, "", driver,	      sizeof (driver), "odbcinst.ini");#endif	  /* Check if the driver is installed */	  if (strcasecmp (driver, "Installed"))	    goto end;	  /* Get the driver library name */	  SQLSetConfigMode (confMode);	  if (!SQLGetPrivateProfileString (curr, "CPTimeout", "<Not pooled>",		  driver, sizeof (driver), "odbcinst.ini"))	    {	      SQLSetConfigMode (confMode);	      SQLGetPrivateProfileString ("Default", "CPTimeout",		  "<Not pooled>", driver, sizeof (driver), "odbcinst.ini");	    }	  if (STRLEN (curr) && STRLEN (driver))	    {	      data[0] = curr;	      data[1] = driver;	      gtk_clist_append (GTK_CLIST (widget), data);	    }	}    end:      if (confMode == ODBC_USER_DSN)	confMode = ODBC_SYSTEM_DSN;      else	confMode = ODBC_SYSTEM_DSN + 1;    }  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 voidadmin_switch_page (GtkNotebook *notebook, GtkNotebookPage *page,    gint page_num, void **inparams){  TDSNCHOOSER *dsnchoose_t = (inparams) ? inparams[0] : NULL;  TDRIVERCHOOSER *driverchoose_t = (inparams) ? inparams[1] : NULL;  TTRACING *tracing_t = (inparams) ? inparams[2] : NULL;  TCOMPONENT *component_t = (inparams) ? inparams[3] : NULL;  TCONNECTIONPOOLING *connectionpool_t = (inparams) ? inparams[4] : NULL;  BOOL trace = FALSE, traceauto = FALSE, perfmon = FALSE;  char tokenstr[4096] = { 0 };  switch (page_num)    {      /* The User DSN panel */    case 0:      if (dsnchoose_t)	{	  dsnchoose_t->type_dsn = 0;	  adddsns_to_list (dsnchoose_t->udsnlist, FALSE);	}      break;      /* The System DSN panel */    case 1:      if (dsnchoose_t)	{	  dsnchoose_t->type_dsn = 1;	  adddsns_to_list (dsnchoose_t->sdsnlist, TRUE);	}      break;      /* The File DSN panel */      /*case 2:         if(dsnchoose_t)         {         dsnchoose_t->type_dsn = 2; dsnchoose_t->curr_dir = strdup(getenv("HOME") ? getenv("HOME") : "/");         addlistofdir_to_optionmenu(dsnchoose_t->dir_combo, dsnchoose_t->curr_dir, dsnchoose_t);         adddirectories_to_list(dsnchoose_t->mainwnd, dsnchoose_t->dir_list, dsnchoose_t->curr_dir);         addfiles_to_list(dsnchoose_t->mainwnd, dsnchoose_t->file_list, dsnchoose_t->curr_dir);         }         break; */      /* The ODBC Driver panel */    case 2:      if (driverchoose_t)	{	  adddrivers_to_list (driverchoose_t->driverlist, FALSE);	  gtk_widget_set_sensitive (driverchoose_t->b_remove, FALSE);	  gtk_widget_set_sensitive (driverchoose_t->b_configure, FALSE);	}      break;      /* The Connection Pooling */    case 3:      if (!connectionpool_t->changed)	{	  /* Get the connection pooling options */	  SQLGetPrivateProfileString ("ODBC Connection Pooling", "Perfmon",	      "", tokenstr, sizeof (tokenstr), "odbcinst.ini");	  if (!strcasecmp (tokenstr, "1") || !strcasecmp (tokenstr, "On"))	    perfmon = TRUE;	  SQLGetPrivateProfileString ("ODBC Connection Pooling", "Retry Wait",	      "", tokenstr, sizeof (tokenstr), "odbcinst.ini");	  if (perfmon)	    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON		(connectionpool_t->enperfmon_rb), 1);	  else	    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON		(connectionpool_t->disperfmon_rb), 1);	  gtk_entry_set_text (GTK_ENTRY (connectionpool_t->retwait_entry),	      tokenstr);	  connectionpool_t->changed = TRUE;	}      addconnectionpool_to_list (connectionpool_t->driverlist);      break;      /* The tracing panel */    case 4:      if (!tracing_t->changed)	{	  /* Get the traces options */	  SQLGetPrivateProfileString ("ODBC", "Trace", "", tokenstr,	      sizeof (tokenstr), NULL);	  if (!strcasecmp (tokenstr, "1") || !strcasecmp (tokenstr, "On"))	    trace = TRUE;	  SQLGetPrivateProfileString ("ODBC", "TraceAutoStop", "", tokenstr,	      sizeof (tokenstr), NULL);	  if (!strcasecmp (tokenstr, "1") || !strcasecmp (tokenstr, "On"))	    traceauto = TRUE;	  SQLGetPrivateProfileString ("ODBC", "TraceFile", "", tokenstr,	      sizeof (tokenstr), NULL);	  /* Set the widgets */	  if (trace)	    {	      if (!traceauto)		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tracing_t->			allthetime_rb), 1);	      else		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tracing_t->			onetime_rb), 1);	    }	  else	    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tracing_t->		    donttrace_rb), 1);	  gtk_entry_set_text (GTK_ENTRY (tracing_t->logfile_entry),	      (STRLEN (tokenstr)) ? tokenstr : "sql.log");	  tracing_t->changed = TRUE;	}      break;      /* The About panel */    case 5:      if (component_t)	addcomponents_to_list (component_t->componentlist);      break;    };  if (dsnchoose_t)    {      if (dsnchoose_t->uremove)	gtk_widget_set_sensitive (dsnchoose_t->uremove, FALSE);      if (dsnchoose_t->uconfigure)	gtk_widget_set_sensitive (dsnchoose_t->uconfigure, FALSE);      if (dsnchoose_t->utest)	gtk_widget_set_sensitive (dsnchoose_t->utest, FALSE);      if (dsnchoose_t->sremove)

⌨️ 快捷键说明

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