1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/**************************************************
*
**************************************************
* This code was created by Peter Harvey @ CodeByDesign.
* Released under LGPL 28.JAN.99
*
* Contributions from...
* -----------------------------------------------
* Peter Harvey - pharvey@codebydesign.com
**************************************************/
#include <odbcinstext.h>
BOOL SQLRemoveDriver( LPCSTR pszDriver,
BOOL nRemoveDSN,
LPDWORD pnUsageCount )
{
HINI hODBCInstIni;
HINI hODBCIni;
char szValue[INI_MAX_PROPERTY_VALUE+1];
char szODBCFile[ODBC_FILENAME_MAX+1];
char szIniName[ INI_MAX_OBJECT_NAME + 1 ];
/* SANITY CHECKS */
if ( pszDriver == NULL )
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_NAME, "" );
return FALSE;
}
if ( pszDriver[0] == '\0' )
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_NAME, "" );
return FALSE;
}
if ( nRemoveDSN != TRUE && nRemoveDSN != FALSE )
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
return FALSE;
}
(*pnUsageCount) = 0;
#ifdef VMS
sprintf( szIniName, "%sODBCINST.INI", odbcinst_system_file_path() );
#else
sprintf( szIniName, "%s/odbcinst.ini", odbcinst_system_file_path() );
#endif
/* PROCESS ODBC INST INI FILE */
#ifdef __OS2__
if ( iniOpen( &hODBCInstIni, szIniName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS )
#else
if ( iniOpen( &hODBCInstIni, szIniName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS )
#endif
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_COMPONENT_NOT_FOUND, "" );
return FALSE;
}
/* LETS GET ITS FILE USAGE VALUE (if any) */
if ( iniPropertySeek( hODBCInstIni, (char *)pszDriver, "UsageCount", "" ) == INI_SUCCESS )
{
iniValue( hODBCInstIni, szValue );
(*pnUsageCount) = atoi( szValue );
}
/* DOES THE OBJECT ALREADY EXIST? (also ensures that we have correct current object) */
if ( iniObjectSeek( hODBCInstIni, (char *)pszDriver ) == INI_SUCCESS )
{
if ( (*pnUsageCount) == 0 )
(*pnUsageCount) = 1;
(*pnUsageCount)--;
if ( (*pnUsageCount) == 0 )
{
iniObjectDelete( hODBCInstIni );
if ( nRemoveDSN )
{
/***********************************
* TO DO
***********************************/
}
}
else
{
if ( iniPropertySeek( hODBCInstIni, (char *)pszDriver, "UsageCount", "" ) == INI_SUCCESS )
{
sprintf( szValue, "%d", (*pnUsageCount) );
iniPropertyUpdate( hODBCInstIni, "UsageCount", szValue );
}
else
{
iniPropertyInsert( hODBCInstIni, "UsageCount", szValue );
}
}
if ( iniCommit( hODBCInstIni ) != INI_SUCCESS )
{
inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
iniClose( hODBCInstIni );
return FALSE;
}
}
iniClose( hODBCInstIni );
return TRUE;
}
|