/*
* administrator.c
*
* $Id: administrator.c,v 1.4 2002/04/25 14:20:50 source Exp $
*
* The iODBC driver manager.
*
* Copyright (C) 1999-2002 by OpenLink Software <iodbc@openlinksw.com>
* All Rights Reserved.
*
* This software is released under the terms of either of the following
* licenses:
*
* - GNU Library General Public License (see LICENSE.LGPL)
* - The BSD License (see LICENSE.BSD).
*
* While not mandated by the BSD license, any patches you make to the
* iODBC source code may be contributed back into the iODBC project
* at your discretion. Contributions will benefit the Open Source and
* Data Access community as a whole. Submissions may be made at:
*
* http://www.iodbc.org
*
*
* GNU Library Generic Public License Version 2
* ============================================
* 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.
*
*
* The BSD License
* ===============
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name of OpenLink Software Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OPENLINK OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <dlfcn.h>
#include <sys/stat.h>
#include <unistd.h>
#include "../gui.h"
#include "odbc4.xpm"
#if !defined(HAVE_DL_INFO)
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 /* HAVE_DL_INFO */
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 void
addcomponents_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 void
addconnectionpool_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 void
admin_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 = (i
评论1