BOOL SQLInstallDriverManager( LPSTR pszPath, WORD nPathMax, WORD *pnPathOut ) { char szIniName[ INI_MAX_OBJECT_NAME + 1 ]; char b1[ ODBC_FILENAME_MAX + 1 ]; inst_logClear(); /* SANITY CHECKS */ if ( pszPath == NULL || nPathMax < 2 ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return 0; } sprintf( szIniName, "%s", odbcinst_system_file_path( b1 ) ); /* DO SOMETHING */ strncpy( pszPath, szIniName, nPathMax ); if ( pnPathOut != NULL ) *pnPathOut = strlen( pszPath ); return TRUE; }
BOOL INSTAPI SQLReadFileDSNW(LPCWSTR lpszFileName, LPCWSTR lpszAppName, LPCWSTR lpszKeyName, LPWSTR lpszString, WORD cbString, WORD *pcbString) { char *file; char *app; char *key; char *str; WORD len; BOOL ret; inst_logClear(); file = lpszFileName ? _single_string_alloc_and_copy( lpszFileName ) : (char*)NULL; app = lpszAppName ? _single_string_alloc_and_copy( lpszAppName ) : (char*)NULL; key = lpszKeyName ? _single_string_alloc_and_copy( lpszKeyName ) : (char*)NULL; if ( lpszString ) { if ( cbString > 0 ) { str = calloc( cbString + 1, 1 ); } else { str = NULL; } } else { str = NULL; } ret = SQLReadFileDSN( file, app, key, str, cbString, &len ); if ( ret ) { if ( str && lpszString ) { _single_copy_to_wide( lpszString, str, len + 1 ); } } if ( file ) free( file ); if ( app ) free( app ); if ( key ) free( key ); if ( str ) free( str ); if ( pcbString ) *pcbString = len; return ret; }
BOOL INSTAPI SQLInstallTranslatorExW(LPCWSTR lpszTranslator, LPCWSTR lpszPathIn, LPWSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount) { inst_logClear(); return FALSE; }
BOOL INSTAPI SQLGetTranslatorW (HWND hwnd, LPWSTR lpszName, WORD cbNameMax, WORD *pcbNameOut, LPWSTR lpszPath, WORD cbPathMax, WORD *pcbPathOut, DWORD *pvOption) { inst_logClear(); return FALSE; }
BOOL SQLGetTranslator( HWND hWnd, LPSTR pszName, WORD nNameMax, WORD *pnNameOut, LPSTR pszPath, WORD nPathMax, WORD *pnPathOut, DWORD *pnOption ) { inst_logClear(); return FALSE; }
BOOL SQLInstallTranslatorEx( LPCSTR pszTranslator, LPCSTR pszPathIn, LPSTR pszPathOut, WORD nPathOutMax, WORD *pnPathOut, WORD nRequest, LPDWORD pnUsageCount ) { inst_logClear(); return FALSE; }
BOOL SQLRemoveDriverManager( LPDWORD pnUsageCount ) { inst_logClear(); if ( pnUsageCount == NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return FALSE; } *pnUsageCount = 1; 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; }
BOOL INSTAPI SQLGetInstalledDriversW (LPWSTR lpszBuf, WORD cbBufMax, WORD * pcbBufOut) { char *path; BOOL ret; inst_logClear(); path = calloc( cbBufMax, 1 ); ret = SQLGetInstalledDrivers( path, cbBufMax, pcbBufOut ); if ( ret ) { _multi_string_copy_to_wide( lpszBuf, path, cbBufMax ); } free( path ); return ret; }
BOOL INSTAPI SQLInstallDriverManagerW (LPWSTR lpszPath, WORD cbPathMax, WORD * pcbPathOut) { char *path; BOOL ret; inst_logClear(); path = calloc( cbPathMax, 1 ); ret = SQLInstallDriverManager( path, cbPathMax, pcbPathOut ); if ( ret ) { _single_string_copy_to_wide( lpszPath, path, cbPathMax ); } free( path ); return ret; }
BOOL SQLGetInstalledDrivers( LPSTR pszBuf, WORD nBufMax, WORD *pnBufOut ) { HINI hIni; WORD nBufPos = 0; WORD nToCopySize = 0; char szObjectName[INI_MAX_OBJECT_NAME+1]; char szIniName[ INI_MAX_OBJECT_NAME + 1 ]; char b1[ 256 ], b2[ 256 ]; inst_logClear(); #ifdef VMS sprintf( szIniName, "%s:%s", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ) ); #else sprintf( szIniName, "%s/%d", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ) ); #endif #ifdef __OS2__ if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_COMPONENT_NOT_FOUND, "" ); return FALSE; } memset( pszBuf, '\0', nBufMax ); iniObjectFirst( hIni ); while ( iniObjectEOL( hIni ) == FALSE ) { iniObject( hIni, szObjectName ); if ( strcmp( szObjectName, "ODBC" ) == 0 ) { iniObjectNext( hIni ); continue; } if ( (strlen( szObjectName )+1) > (nBufMax - nBufPos) ) { nToCopySize = nBufMax - nBufPos; strncpy( &(pszBuf[nBufPos]), szObjectName, nToCopySize ); nBufPos = nBufMax; break; } else { strcpy( &(pszBuf[nBufPos]), szObjectName ); nBufPos += strlen( szObjectName )+1; } iniObjectNext( hIni ); } iniClose( hIni ); if ( pnBufOut ) *pnBufOut = nBufPos-1; return TRUE; }
int INSTAPI SQLGetPrivateProfileStringW( LPCWSTR lpszSection, LPCWSTR lpszEntry, LPCWSTR lpszDefault, LPWSTR lpszRetBuffer, int cbRetBuffer, LPCWSTR lpszFilename) { int ret; char *sect; char *entry; char *def; char *buf; char *name; inst_logClear(); sect = lpszSection ? _single_string_alloc_and_copy( lpszSection ) : (char*)NULL; entry = lpszEntry ? _single_string_alloc_and_copy( lpszEntry ) : (char*)NULL; def = lpszDefault ? _single_string_alloc_and_copy( lpszDefault ) : (char*)NULL; name = lpszFilename ? _single_string_alloc_and_copy( lpszFilename ) : (char*)NULL; if ( lpszRetBuffer ) { if ( cbRetBuffer > 0 ) { buf = calloc( cbRetBuffer + 1, 1 ); } else { buf = NULL; } } else { buf = NULL; } ret = SQLGetPrivateProfileString( sect, entry, def, buf, cbRetBuffer, name ); if ( sect ) free( sect ); if ( entry ) free( entry ); if ( def ) free( def ); if ( name ) free( name ); if ( ret > 0 ) { if ( buf && lpszRetBuffer ) { _single_copy_to_wide( lpszRetBuffer, buf, ret + 1 ); } } if ( buf ) { free( buf ); } return ret; }
int SQLGetPrivateProfileString( LPCSTR pszSection, LPCSTR pszEntry, LPCSTR pszDefault, LPSTR pRetBuffer, int nRetBuffer, LPCSTR pszFileName ) { HINI hIni; int nBufPos = 0; char szValue[INI_MAX_PROPERTY_VALUE+1]; char szFileName[ODBC_FILENAME_MAX+1]; UWORD nConfigMode; int ini_done = 0; int ret; inst_logClear(); if ( check_ini_cache( &ret, pszSection, pszEntry, pszDefault, pRetBuffer, nRetBuffer, pszFileName )) { return ret; } /* SANITY CHECKS */ if ( pRetBuffer == NULL || nRetBuffer < 2 ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return -1; } if ( pszSection != NULL && pszEntry != NULL && pszDefault == NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "need default value - try empty string" ); return -1; } *pRetBuffer = '\0'; /***************************************************** * SOME MS CODE (ie some drivers) MAY USE THIS FUNCTION TO GET ODBCINST INFO SO... *****************************************************/ if ( pszFileName != NULL ) { if ( strstr( pszFileName, "odbcinst" ) || strstr( pszFileName, "ODBCINST" ) ) { ret = _SQLGetInstalledDrivers( pszSection, pszEntry, pszDefault, pRetBuffer, nRetBuffer ); if ( ret == -1 ) { /* try to use any default provided */ if ( pRetBuffer && nRetBuffer > 0 ) { if ( pszDefault ) { strncpy( pRetBuffer, pszDefault, nRetBuffer ); pRetBuffer[ nRetBuffer - 1 ] = '\0'; } } } else { save_ini_cache( ret, pszSection, pszEntry, pszDefault, pRetBuffer, nRetBuffer, pszFileName ); } return ret; } } /***************************************************** * GATHER ALL RELEVANT DSN INFORMATION INTO AN hIni *****************************************************/ if ( pszFileName != 0 && pszFileName[0] == '/' ) { #ifdef __OS2__ if ( iniOpen( &hIni, (char*)pszFileName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, (char*)pszFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_COMPONENT_NOT_FOUND, "" ); return -1; } } else { nConfigMode = __get_config_mode(); nBufPos = 0; szFileName[0] = '\0'; switch ( nConfigMode ) { case ODBC_BOTH_DSN: if ( _odbcinst_UserINI( szFileName, TRUE )) { #ifdef __OS2__ if ( iniOpen( &hIni, (char*) szFileName, "#;", '[', ']', '=', TRUE, 1L ) == INI_SUCCESS ) #else if ( iniOpen( &hIni, (char*) szFileName, "#;", '[', ']', '=', TRUE ) == INI_SUCCESS ) #endif { ini_done = 1; } } _odbcinst_SystemINI( szFileName, TRUE ); if ( !ini_done ) { #ifdef __OS2__ if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_COMPONENT_NOT_FOUND, "" ); return -1; } } else { iniAppend( hIni, szFileName ); } break; case ODBC_USER_DSN: _odbcinst_UserINI( szFileName, TRUE ); #ifdef __OS2__ if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_COMPONENT_NOT_FOUND, "" ); return -1; } break; case ODBC_SYSTEM_DSN: _odbcinst_SystemINI( szFileName, TRUE ); #ifdef __OS2__ if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_COMPONENT_NOT_FOUND, "" ); return -1; } break; default: inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "Invalid Config Mode" ); return -1; } } /***************************************************** * EXTRACT SECTIONS *****************************************************/ if ( pszSection == NULL ) { _odbcinst_GetSections( hIni, pRetBuffer, nRetBuffer, &nBufPos ); } /***************************************************** * EXTRACT ENTRIES *****************************************************/ else if ( pszEntry == NULL ) { _odbcinst_GetEntries( hIni, pszSection, pRetBuffer, nRetBuffer, &nBufPos ); } /***************************************************** * EXTRACT AN ENTRY *****************************************************/ else { if ( pszSection == NULL || pszEntry == NULL || pszDefault == NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return -1; } /* TRY TO GET THE ONE ITEM MATCHING Section & Entry */ if ( iniPropertySeek( hIni, (char *)pszSection, (char *)pszEntry, "" ) != INI_SUCCESS ) { /* * (NG) this seems to be ignoring the length of pRetBuffer !!! */ /* strncpy( pRetBuffer, pszDefault, INI_MAX_PROPERTY_VALUE ); */ if ( pRetBuffer && nRetBuffer > 0 && pszDefault ) { strncpy( pRetBuffer, pszDefault, nRetBuffer ); pRetBuffer[ nRetBuffer - 1 ] = '\0'; } } else { iniValue( hIni, szValue ); if ( pRetBuffer ) { strncpy( pRetBuffer, szValue, nRetBuffer ); pRetBuffer[ nRetBuffer - 1 ] = '\0'; } nBufPos = strlen( szValue ); } } iniClose( hIni ); ret = strlen( pRetBuffer ); save_ini_cache( ret, pszSection, pszEntry, pszDefault, pRetBuffer, nRetBuffer, pszFileName ); return ret; }
BOOL SQLWritePrivateProfileString( LPCSTR pszSection, LPCSTR pszEntry, LPCSTR pszString, LPCSTR pszFileName ) { HINI hIni; char szFileName[ODBC_FILENAME_MAX+1]; inst_logClear(); /* SANITY CHECKS */ if ( pszSection == NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return FALSE; } if ( pszSection[0] == '\0' ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return FALSE; } if ( pszFileName == NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return FALSE; } /***************************************************** * SOME MS CODE (ie some drivers) MAY USE THIS FUNCTION TO WRITE ODBCINST INFO SO... *****************************************************/ if ( strstr( pszFileName, "odbcinst" ) || strstr( pszFileName, "ODBCINST" ) ) return _SQLWriteInstalledDrivers( pszSection, pszEntry, pszString ); if ( pszFileName[0] == '/' ) { strcpy( szFileName, pszFileName ); } else { if ( _odbcinst_ConfigModeINI( szFileName ) == FALSE ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_REQUEST_FAILED, "" ); return FALSE; } } #ifdef __OS2__ if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_REQUEST_FAILED, "" ); return FALSE; } /* delete section */ if ( pszEntry == NULL ) { if ( iniObjectSeek( hIni, (char *)pszSection ) == INI_SUCCESS ) iniObjectDelete( hIni ); } /* delete entry */ else if ( pszString == NULL ) { if ( iniPropertySeek( hIni, (char *)pszSection, (char *)pszEntry, "" ) == INI_SUCCESS ) { iniPropertyDelete( hIni ); } } else { /* add section */ if ( iniObjectSeek( hIni, (char *)pszSection ) != INI_SUCCESS ) iniObjectInsert( hIni, (char *)pszSection ); /* update entry */ if ( iniPropertySeek( hIni, (char *)pszSection, (char *)pszEntry, "" ) == INI_SUCCESS ) { iniObjectSeek( hIni, (char *)pszSection ); /* * Get the correct property to update */ iniPropertySeek( hIni, (char *)pszSection, (char *)pszEntry, "" ); iniPropertyUpdate( hIni, (char *)pszEntry, (char *)pszString ); } /* add entry */ else { iniObjectSeek( hIni, (char *)pszSection ); iniPropertyInsert( hIni, (char *)pszEntry, (char *)pszString ); } } if ( iniCommit( hIni ) != INI_SUCCESS ) { iniClose( hIni ); inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_REQUEST_FAILED, "" ); return FALSE; } iniClose( hIni ); return TRUE; }
/*! * \brief UI to manage most ODBC system information. * * This calls into the UI plugin library to do our work for us. The caller can provide * the name (base name) of the library or let us determine which library to use. * See \sa _getUIPluginName for details on how the choice is made. * * \param hWnd Input. Parent window handle. This is HWND as per the ODBC * specification but in unixODBC we use a generic window * handle. Caller must cast a HODBCINSTWND to HWND at call. * * \return BOOL * * \sa ODBCINSTWND */ BOOL SQLManageDataSources( HWND hWnd ) { HODBCINSTWND hODBCInstWnd = (HODBCINSTWND)hWnd; char szName[FILENAME_MAX]; char szNameAndExtension[FILENAME_MAX]; char szPathAndName[FILENAME_MAX]; void * hDLL; BOOL (*pSQLManageDataSources)(HWND); inst_logClear(); /* ODBC specification states that hWnd is mandatory. */ if ( !hWnd ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_HWND, "No hWnd" ); return FALSE; } /* initialize libtool */ if ( lt_dlinit() ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "lt_dlinit() failed" ); return FALSE; } /* get plugin name */ _appendUIPluginExtension( szNameAndExtension, _getUIPluginName( szName, hODBCInstWnd->szUI ) ); /* lets try loading the plugin using an implicit path */ hDLL = lt_dlopen( szNameAndExtension ); if ( hDLL ) { /* change the name (SQLManageDataSources to ODBCManageDataSources) to prevent us from calling ourself */ pSQLManageDataSources = (BOOL (*)(HWND))lt_dlsym( hDLL, "ODBCManageDataSources" ); if ( pSQLManageDataSources ) return pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); else inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); } else { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_WARNING, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); /* try with explicit path */ _prependUIPluginPath( szPathAndName, szNameAndExtension ); hDLL = lt_dlopen( szPathAndName ); if ( hDLL ) { /* change the name (SQLManageDataSources to ODBCManageDataSources) to prevent us from calling ourself */ /* its only safe to use hWnd if szUI was specified by the caller */ pSQLManageDataSources = (BOOL (*)(HWND))lt_dlsym( hDLL, "ODBCManageDataSources" ); if ( pSQLManageDataSources ) return pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); else inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); } else inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); } /* report failure to caller */ inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "Failed to load/use a UI plugin." ); return FALSE; }
BOOL SQLReadFileDSN( LPCSTR pszFileName, LPCSTR pszAppName, LPCSTR pszKeyName, LPSTR pszString, WORD nString, WORD *pnString ) { HINI hIni; int nBufPos = 0; char szValue[INI_MAX_PROPERTY_VALUE+1]; char szFileName[ODBC_FILENAME_MAX+1]; inst_logClear(); /* SANITY CHECKS */ if ( pszString == NULL || nString < 1 ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_BUFF_LEN, "" ); return FALSE; } if ( pszFileName == NULL && pszAppName == NULL && pszKeyName == NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return FALSE; } if ( pszAppName == NULL && pszKeyName != NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_REQUEST_TYPE, "" ); return FALSE; } if ( pszFileName && strlen( pszFileName ) > ODBC_FILENAME_MAX ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_PATH, "" ); return FALSE; } *pszString = '\0'; /***************************************************** * GATHER ALL RELEVANT DSN INFORMATION INTO AN hIni *****************************************************/ if ( pszFileName && pszFileName[0] == '/' ) { strcpy( szFileName, pszFileName ); if ( strlen( szFileName ) < 4 || strcmp( szFileName + strlen( szFileName ) - 4, ".dsn" )) { strcat( szFileName, ".dsn" ); } /* on OS/2 the file DSN is a text file */ #ifdef __OS2__ if ( iniOpen( &hIni, (char*)szFileName, "#;", '[', ']', '=', TRUE, 0L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, (char*)szFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_PATH, "" ); return FALSE; } } else if ( pszFileName ) { char szPath[ODBC_FILENAME_MAX+1]; *szPath = '\0'; _odbcinst_FileINI( szPath ); sprintf( szFileName, "%s/%s", szPath, pszFileName ); if ( strlen( szFileName ) < 4 || strcmp( szFileName + strlen( szFileName ) - 4, ".dsn" )) { strcat( szFileName, ".dsn" ); } /* on OS/2 the file DSN is a text file */ #ifdef __OS2__ if ( iniOpen( &hIni, (char*) szFileName, "#;", '[', ']', '=', TRUE, 0L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, (char*) szFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_PATH, "" ); return FALSE; } } if ( pszAppName == NULL && pszKeyName == NULL ) { GetSections( hIni, pszString, nString ); } else if ( pszAppName != NULL && pszKeyName == NULL ) { GetEntries( hIni, pszAppName, pszString, nString ); } else { /* TRY TO GET THE ONE ITEM MATCHING Section & Entry */ if ( iniPropertySeek( hIni, (char *)pszAppName, (char *)pszKeyName, "" ) != INI_SUCCESS ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_REQUEST_FAILED, "" ); return FALSE; } else { iniValue( hIni, szValue ); strncpy( pszString, szValue, nString ); pszString[ nString - 1 ] = '\0'; nBufPos = strlen( szValue ); } } if ( pszFileName ) { iniClose( hIni ); } if ( pnString ) { *pnString = strlen( pszString ); } return TRUE; }
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 SQLRemoveDefaultDataSource( void ) { inst_logClear(); return SQLConfigDataSource (NULL, ODBC_REMOVE_DEFAULT_DSN, NULL, NULL); }