unixODBC-MSSQL/odbcinst/ODBCINSTConstructProperties.c

251 строка
9.3 KiB
C

/**************************************************
* ODBCINSTConstructProperties
*
**************************************************
* This code was created by Peter Harvey @ CodeByDesign.
* Released under LGPL 28.JAN.99
*
* Contributions from...
* -----------------------------------------------
* Peter Harvey - pharvey@codebydesign.com
**************************************************/
#include <config.h>
#include <odbcinstext.h>
/*
static const char *aYesNo[] =
{
"Yes",
"No",
NULL
};
*/
/*!
* \brief Builds a property list for pszDriver.
*
* Adds common DSN properties (Name,Driver,Description) and then asks the
* drivers setup to load any additional properties.
*
* This is used to support editing DSN properties without forcing the driver
* developer to create a UI for the many different UI implementations. The
* driver developer can just implement ODBCINSTGetProperties. This function
* can then call ODBCINSTGetProperties to get properties. The code that calls
* this function can then display the properties in the UI in use.
*
* \param pszDriver Friendly driver name.
* \param hFirstProperty Place to store the properties list. The properties (including
* some of the elements within each HODBCINSTPROPERTY may
* need to be freed using \sa ODBCINSTDestructProperties.
*
* \return int
* \retval ODBCINST_ERROR Called failed. No memory was allocated at hFirstProperty. The
* likely reasons for this; \li failed to lookup setup library name
* \li failed to load setup library \li failed to find
* ODBCINSTGetProperties symbol in setup library
* \retval ODBCINST_SUCCESS Success! Do not forget to call ODBCINSTDestructProperties to
* free memory used by the properties when you are done.
*
* \sa ODBCINSTDestructProperties
*/
int ODBCINSTConstructProperties( char *pszDriver, HODBCINSTPROPERTY *hFirstProperty )
{
char szError[LOG_MSG_MAX+1];
char szDriverSetup[ODBC_FILENAME_MAX+1];
HINI hIni;
int (*pODBCINSTGetProperties)( HODBCINSTPROPERTY );
void *hDLL = NULL;
HODBCINSTPROPERTY hLastProperty;
char szSectionName[INI_MAX_OBJECT_NAME+1];
char szIniName[ INI_MAX_OBJECT_NAME + 1 ];
char b1[ 256 ], b2[ 256 ];
/* SANITY CHECKS */
if ( pszDriver == NULL )
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "Need a driver name. Make it the friendly name." );
return ODBCINST_ERROR;
}
#ifdef VMS
sprintf( szIniName, "%s:%s", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ));
#else
sprintf( szIniName, "%s/%s", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ));
#endif
/* GET DRIVER SETUP FILE NAME FOR GIVEN DRIVER */
#ifdef __OS2__
if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', FALSE, 1L ) != INI_SUCCESS )
#else
if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', FALSE ) != INI_SUCCESS )
#endif
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "Could not open odbcinst.ini" );
return ODBCINST_ERROR;
}
#ifdef PLATFORM64
/* ASSUME USER FRIENDLY NAME FOR STARTERS */
if ( iniPropertySeek( hIni, pszDriver, "Setup64", "" ) == INI_SUCCESS )
{
}
else if ( iniPropertySeek( hIni, pszDriver, "Setup", "" ) == INI_SUCCESS )
{
}
else
{
/* NOT USER FRIENDLY NAME I GUESS SO ASSUME DRIVER FILE NAME */
if ( iniPropertySeek( hIni, "", "Driver64", pszDriver ) == INI_SUCCESS )
{
iniObject( hIni, szSectionName );
if ( iniPropertySeek( hIni, szSectionName, "Setup64", "" ) != INI_SUCCESS )
{
sprintf( szError, "Could not find Setup property for (%s) in system information", pszDriver );
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, szError );
iniClose( hIni );
return ODBCINST_ERROR;
}
}
else if ( iniPropertySeek( hIni, "", "Driver", pszDriver ) == INI_SUCCESS )
{
iniObject( hIni, szSectionName );
if ( iniPropertySeek( hIni, szSectionName, "Setup", "" ) != INI_SUCCESS )
{
sprintf( szError, "Could not find Setup property for (%s) in system information", pszDriver );
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, szError );
iniClose( hIni );
return ODBCINST_ERROR;
}
}
else
{
sprintf( szError, "Could not find driver (%s) in system information", pszDriver );
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, szError );
iniClose( hIni );
return ODBCINST_ERROR;
}
}
#else
/* ASSUME USER FRIENDLY NAME FOR STARTERS */
if ( iniPropertySeek( hIni, pszDriver, "Setup", "" ) != INI_SUCCESS )
{
/* NOT USER FRIENDLY NAME I GUESS SO ASSUME DRIVER FILE NAME */
if ( iniPropertySeek( hIni, "", "Driver", pszDriver ) != INI_SUCCESS )
{
sprintf( szError, "Could not find driver (%s) in system information", pszDriver );
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, szError );
iniClose( hIni );
return ODBCINST_ERROR;
}
else
{
iniObject( hIni, szSectionName );
if ( iniPropertySeek( hIni, szSectionName, "Setup", "" ) != INI_SUCCESS )
{
sprintf( szError, "Could not find Setup property for (%s) in system information", pszDriver );
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, szError );
iniClose( hIni );
return ODBCINST_ERROR;
}
}
}
#endif
iniValue( hIni, szDriverSetup );
iniClose( hIni );
if ( szDriverSetup[ 0 ] == '\0' )
{
sprintf( szError, "Could not find Setup property for (%s) in system information", pszDriver );
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, szError );
return ODBCINST_ERROR;
}
/*
* initialize libtool
*/
lt_dlinit();
/* TRY GET FUNC FROM DRIVER SETUP */
if ( !(hDLL = lt_dlopen( szDriverSetup )) )
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "Could not load library" );
return ODBCINST_ERROR;
}
pODBCINSTGetProperties = (int(*)(struct tODBCINSTPROPERTY*)) lt_dlsym( hDLL, "ODBCINSTGetProperties" );
/* PAH - This can be true even when we found the symbol.
if ( lt_dlerror() != NULL )
*/
if ( pODBCINSTGetProperties == NULL )
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "Could not find ODBCINSTGetProperties()" );
return ODBCINST_ERROR;
}
/* MANDATORY PROPERTIES */
(*hFirstProperty) = (HODBCINSTPROPERTY)malloc( sizeof(ODBCINSTPROPERTY) );
memset( (*hFirstProperty), 0, sizeof(ODBCINSTPROPERTY) );
(*hFirstProperty)->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT;
(*hFirstProperty)->pNext = NULL;
(*hFirstProperty)->bRefresh = 0;
(*hFirstProperty)->hDLL = hDLL;
(*hFirstProperty)->pWidget = NULL;
(*hFirstProperty)->pszHelp = NULL;
(*hFirstProperty)->aPromptData = NULL;
strncpy( (*hFirstProperty)->szName, "Name", INI_MAX_PROPERTY_NAME );
strcpy( (*hFirstProperty)->szValue, "" );
hLastProperty = (*hFirstProperty);
(*hFirstProperty)->pNext = (HODBCINSTPROPERTY)malloc( sizeof(ODBCINSTPROPERTY) );
hLastProperty = (*hFirstProperty)->pNext;
memset( hLastProperty, 0, sizeof(ODBCINSTPROPERTY) );
hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT;
hLastProperty->pNext = NULL;
hLastProperty->bRefresh = 0;
hLastProperty->hDLL = hDLL;
hLastProperty->pWidget = NULL;
(*hFirstProperty)->pszHelp = NULL;
(*hFirstProperty)->aPromptData = NULL;
strncpy( hLastProperty->szName, "Description", INI_MAX_PROPERTY_NAME );
strncpy( hLastProperty->szValue, pszDriver, INI_MAX_PROPERTY_VALUE );
hLastProperty->pNext = (HODBCINSTPROPERTY)malloc( sizeof(ODBCINSTPROPERTY) );
hLastProperty = hLastProperty->pNext;
memset( hLastProperty, 0, sizeof(ODBCINSTPROPERTY) );
hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_LABEL;
hLastProperty->pNext = NULL;
hLastProperty->bRefresh = 0;
hLastProperty->hDLL = hDLL;
hLastProperty->pWidget = NULL;
(*hFirstProperty)->pszHelp = NULL;
(*hFirstProperty)->aPromptData = NULL;
strncpy( hLastProperty->szName, "Driver", INI_MAX_PROPERTY_NAME );
strncpy( hLastProperty->szValue, pszDriver, INI_MAX_PROPERTY_VALUE );
/*
hLastProperty->pNext = (HODBCINSTPROPERTY)malloc( sizeof(ODBCINSTPROPERTY) );
hLastProperty = hLastProperty->pNext;
memset( hLastProperty, 0, sizeof(ODBCINSTPROPERTY) );
hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_LISTBOX;
hLastProperty->aPromptData = malloc( sizeof(aYesNo) );
memcpy( hLastProperty->aPromptData, aYesNo, sizeof(aYesNo) );
strncpy( hLastProperty->szName, "Trace", INI_MAX_PROPERTY_NAME );
strcpy( hLastProperty->szValue, "No" );
hLastProperty->pNext = (HODBCINSTPROPERTY)malloc( sizeof(ODBCINSTPROPERTY) );
hLastProperty = hLastProperty->pNext;
memset( hLastProperty, 0, sizeof(ODBCINSTPROPERTY) );
hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_FILENAME;
strncpy( hLastProperty->szName, "TraceFile", INI_MAX_PROPERTY_NAME );
strncpy( hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE );
*/
/* APPEND OTHERS */
pODBCINSTGetProperties( hLastProperty );
return ODBCINST_SUCCESS;
}