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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
/**************************************************
*
**************************************************
* 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>
BOOL SQLRemoveDriver( LPCSTR pszDriver,
BOOL nRemoveDSN,
LPDWORD pnUsageCount )
{
HINI hODBCInstIni;
char szValue[INI_MAX_PROPERTY_VALUE+1];
char szIniName[ INI_MAX_OBJECT_NAME + 1 ];
char b1[ 256 ], b2[ 256 ];
inst_logClear();
/* 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, "%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
/* 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, "%ld", (long int)(*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;
}
BOOL INSTAPI SQLRemoveDriverW(LPCWSTR lpszDriver,
BOOL fRemoveDSN,
LPDWORD lpdwUsageCount)
{
BOOL ret;
char *drv = _single_string_alloc_and_copy( lpszDriver );
inst_logClear();
ret = SQLRemoveDriver( drv, fRemoveDSN, lpdwUsageCount );
free( drv );
return ret;
}
|