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