1*96de5490SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*96de5490SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*96de5490SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*96de5490SAndrew Rist * distributed with this work for additional information 6*96de5490SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*96de5490SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*96de5490SAndrew Rist * "License"); you may not use this file except in compliance 9*96de5490SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*96de5490SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*96de5490SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*96de5490SAndrew Rist * software distributed under the License is distributed on an 15*96de5490SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*96de5490SAndrew Rist * KIND, either express or implied. See the License for the 17*96de5490SAndrew Rist * specific language governing permissions and limitations 18*96de5490SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*96de5490SAndrew Rist *************************************************************/ 21*96de5490SAndrew Rist 22*96de5490SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_dbaccess.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #ifndef _DBAUI_ODBC_CONFIG_HXX_ 28cdf0e10cSrcweir #include "odbcconfig.hxx" 29cdf0e10cSrcweir #endif 30cdf0e10cSrcweir #include <rtl/bootstrap.hxx> 31cdf0e10cSrcweir #ifndef _RTL_USTRING_HXX_ 32cdf0e10cSrcweir #include <rtl/ustring.hxx> 33cdf0e10cSrcweir #endif 34cdf0e10cSrcweir #ifndef _RTL_USTRBUF_HXX_ 35cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 36cdf0e10cSrcweir #endif 37cdf0e10cSrcweir #ifndef _OSL_DIAGNOSE_H_ 38cdf0e10cSrcweir #include <osl/diagnose.h> 39cdf0e10cSrcweir #endif 40cdf0e10cSrcweir #ifndef _OSL_PROCESS_H_ 41cdf0e10cSrcweir #include <osl/process.h> 42cdf0e10cSrcweir #endif 43cdf0e10cSrcweir #ifndef _THREAD_HXX_ 44cdf0e10cSrcweir #include <osl/thread.hxx> 45cdf0e10cSrcweir #endif 46cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX 47cdf0e10cSrcweir #include <tools/debug.hxx> 48cdf0e10cSrcweir #endif 49cdf0e10cSrcweir #ifndef _SV_SVAPP_HXX 50cdf0e10cSrcweir #include <vcl/svapp.hxx> 51cdf0e10cSrcweir #endif 52cdf0e10cSrcweir 53cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 54cdf0e10cSrcweir 55cdf0e10cSrcweir #if defined(OS2) 56cdf0e10cSrcweir #define ODBC_LIBRARY "ODBC.DLL" 57cdf0e10cSrcweir #define ODBC_UI_LIBRARY "ODBCINST.DLL" 58cdf0e10cSrcweir #endif 59cdf0e10cSrcweir #if defined WNT 60cdf0e10cSrcweir #define ODBC_LIBRARY "ODBC32.DLL" 61cdf0e10cSrcweir #define ODBC_UI_LIBRARY "ODBCCP32.DLL" 62cdf0e10cSrcweir #endif 63cdf0e10cSrcweir #ifdef UNX 64cdf0e10cSrcweir #ifdef MACOSX 65cdf0e10cSrcweir #define ODBC_LIBRARY "libiodbc.dylib" 66cdf0e10cSrcweir #define ODBC_UI_LIBRARY "libiodbcinst.dylib" 67cdf0e10cSrcweir #else 68cdf0e10cSrcweir #define ODBC_LIBRARY_1 "libodbc.so.1" 69cdf0e10cSrcweir #define ODBC_UI_LIBRARY_1 "libodbcinst.so.1" 70cdf0e10cSrcweir #define ODBC_LIBRARY "libodbc.so" 71cdf0e10cSrcweir #define ODBC_UI_LIBRARY "libodbcinst.so" 72cdf0e10cSrcweir #endif 73cdf0e10cSrcweir #endif 74cdf0e10cSrcweir 75cdf0e10cSrcweir // just to go with calling convention of windows 76cdf0e10cSrcweir // so don't touch this 77cdf0e10cSrcweir #if defined(WNT) 78cdf0e10cSrcweir #define SQL_API __stdcall 79cdf0e10cSrcweir // At least under some circumstances, the below #include <odbc/sqlext.h> re- 80cdf0e10cSrcweir // defines SQL_API to an empty string, leading to a compiler warning on MSC; to 81cdf0e10cSrcweir // not break the current behavior, this is worked around by locally disabling 82cdf0e10cSrcweir // that warning: 83cdf0e10cSrcweir #if defined _MSC_VER 84cdf0e10cSrcweir #pragma warning(push) 85cdf0e10cSrcweir #pragma warning(disable: 4005) 86cdf0e10cSrcweir #endif 87cdf0e10cSrcweir #endif // defined(WNT) 88cdf0e10cSrcweir 89cdf0e10cSrcweir #if defined(OS2) 90cdf0e10cSrcweir #define ALLREADY_HAVE_OS2_TYPES 91cdf0e10cSrcweir #define DONT_TD_VOID 92cdf0e10cSrcweir #endif 93cdf0e10cSrcweir 94cdf0e10cSrcweir #ifdef SYSTEM_ODBC_HEADERS 95cdf0e10cSrcweir #include <sqlext.h> 96cdf0e10cSrcweir #else 97cdf0e10cSrcweir #ifndef __SQLEXT_H 98cdf0e10cSrcweir #include <odbc/sqlext.h> 99cdf0e10cSrcweir #endif 100cdf0e10cSrcweir #endif 101cdf0e10cSrcweir 102cdf0e10cSrcweir #if defined(WNT) 103cdf0e10cSrcweir #if defined _MSC_VER 104cdf0e10cSrcweir #pragma warning(pop) 105cdf0e10cSrcweir #endif 106cdf0e10cSrcweir #undef SQL_API 107cdf0e10cSrcweir #define SQL_API __stdcall 108cdf0e10cSrcweir #endif // defined(WNT) 109cdf0e10cSrcweir // from here on you can do what you want to 110cdf0e10cSrcweir 111cdf0e10cSrcweir #if defined(OS2) 112cdf0e10cSrcweir #define SQL_API _System 113cdf0e10cSrcweir #endif // defined(OS2) 114cdf0e10cSrcweir 115cdf0e10cSrcweir #else 116cdf0e10cSrcweir 117cdf0e10cSrcweir #define ODBC_LIBRARY "" 118cdf0e10cSrcweir #define ODBC_UI_LIBRARY "" 119cdf0e10cSrcweir 120cdf0e10cSrcweir #endif // HAVE_ODBC_SUPPORT 121cdf0e10cSrcweir 122cdf0e10cSrcweir //......................................................................... 123cdf0e10cSrcweir namespace dbaui 124cdf0e10cSrcweir { 125cdf0e10cSrcweir //......................................................................... 126cdf0e10cSrcweir 127cdf0e10cSrcweir 128cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 129cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLManageDataSource) (SQLHWND hwndParent); 130cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLAllocHandle) (SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE* OutputHandlePtr); 131cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLFreeHandle) (SQLSMALLINT HandleType, SQLHANDLE Handle); 132cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLSetEnvAttr) (SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength); 133cdf0e10cSrcweir typedef SQLRETURN (SQL_API* TSQLDataSources) (SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, SQLCHAR* ServerName, 134cdf0e10cSrcweir SQLSMALLINT BufferLength1, SQLSMALLINT* NameLength1Ptr, SQLCHAR* Description, SQLSMALLINT BufferLength2, SQLSMALLINT* NameLength2Ptr); 135cdf0e10cSrcweir 136cdf0e10cSrcweir #define NSQLManageDataSource(a) (*(TSQLManageDataSource)(m_pSQLManageDataSource))(a) 137cdf0e10cSrcweir #define NSQLAllocHandle(a,b,c) (*(TSQLAllocHandle)(m_pAllocHandle))(a,b,c) 138cdf0e10cSrcweir #define NSQLFreeHandle(a,b) (*(TSQLFreeHandle)(m_pFreeHandle))(a,b) 139cdf0e10cSrcweir #define NSQLSetEnvAttr(a,b,c,d) (*(TSQLSetEnvAttr)(m_pSetEnvAttr))(a,b,c,d) 140cdf0e10cSrcweir #define NSQLDataSources(a,b,c,d,e,f,g,h) (*(TSQLDataSources)(m_pDataSources))(a,b,c,d,e,f,g,h) 141cdf0e10cSrcweir #endif 142cdf0e10cSrcweir 143cdf0e10cSrcweir //========================================================================= 144cdf0e10cSrcweir //= OOdbcLibWrapper 145cdf0e10cSrcweir //========================================================================= 146cdf0e10cSrcweir DBG_NAME(OOdbcLibWrapper) 147cdf0e10cSrcweir //------------------------------------------------------------------------- 148cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 149cdf0e10cSrcweir OOdbcLibWrapper::OOdbcLibWrapper() 150cdf0e10cSrcweir :m_pOdbcLib(NULL) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir DBG_CTOR(OOdbcLibWrapper,NULL); 153cdf0e10cSrcweir 154cdf0e10cSrcweir } 155cdf0e10cSrcweir #endif 156cdf0e10cSrcweir 157cdf0e10cSrcweir //------------------------------------------------------------------------- 158cdf0e10cSrcweir sal_Bool OOdbcLibWrapper::load(const sal_Char* _pLibPath) 159cdf0e10cSrcweir { 160cdf0e10cSrcweir m_sLibPath = ::rtl::OUString::createFromAscii(_pLibPath); 161cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 162cdf0e10cSrcweir // load the module 163cdf0e10cSrcweir m_pOdbcLib = osl_loadModule(m_sLibPath.pData, SAL_LOADMODULE_NOW); 164cdf0e10cSrcweir return (NULL != m_pOdbcLib); 165cdf0e10cSrcweir #endif 166cdf0e10cSrcweir } 167cdf0e10cSrcweir 168cdf0e10cSrcweir //------------------------------------------------------------------------- 169cdf0e10cSrcweir void OOdbcLibWrapper::unload() 170cdf0e10cSrcweir { 171cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 172cdf0e10cSrcweir if (isLoaded()) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir osl_unloadModule(m_pOdbcLib); 175cdf0e10cSrcweir m_pOdbcLib = NULL; 176cdf0e10cSrcweir } 177cdf0e10cSrcweir #endif 178cdf0e10cSrcweir } 179cdf0e10cSrcweir 180cdf0e10cSrcweir //------------------------------------------------------------------------- 181cdf0e10cSrcweir oslGenericFunction OOdbcLibWrapper::loadSymbol(const sal_Char* _pFunctionName) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir return osl_getFunctionSymbol(m_pOdbcLib, ::rtl::OUString::createFromAscii(_pFunctionName).pData); 184cdf0e10cSrcweir } 185cdf0e10cSrcweir 186cdf0e10cSrcweir //------------------------------------------------------------------------- 187cdf0e10cSrcweir OOdbcLibWrapper::~OOdbcLibWrapper() 188cdf0e10cSrcweir { 189cdf0e10cSrcweir unload(); 190cdf0e10cSrcweir 191cdf0e10cSrcweir DBG_DTOR(OOdbcLibWrapper,NULL); 192cdf0e10cSrcweir } 193cdf0e10cSrcweir 194cdf0e10cSrcweir //========================================================================= 195cdf0e10cSrcweir //= OOdbcEnumeration 196cdf0e10cSrcweir //========================================================================= 197cdf0e10cSrcweir struct OdbcTypesImpl 198cdf0e10cSrcweir { 199cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 200cdf0e10cSrcweir SQLHANDLE hEnvironment; 201cdf0e10cSrcweir OdbcTypesImpl() : hEnvironment(0) { } 202cdf0e10cSrcweir #else 203cdf0e10cSrcweir void* pDummy; 204cdf0e10cSrcweir #endif 205cdf0e10cSrcweir }; 206cdf0e10cSrcweir DBG_NAME(OOdbcEnumeration) 207cdf0e10cSrcweir //------------------------------------------------------------------------- 208cdf0e10cSrcweir OOdbcEnumeration::OOdbcEnumeration() 209cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 210cdf0e10cSrcweir :m_pAllocHandle(NULL) 211cdf0e10cSrcweir ,m_pSetEnvAttr(NULL) 212cdf0e10cSrcweir ,m_pDataSources(NULL) 213cdf0e10cSrcweir ,m_pImpl(new OdbcTypesImpl) 214cdf0e10cSrcweir #endif 215cdf0e10cSrcweir { 216cdf0e10cSrcweir DBG_CTOR(OOdbcEnumeration,NULL); 217cdf0e10cSrcweir 218cdf0e10cSrcweir sal_Bool bLoaded = load(ODBC_LIBRARY); 219cdf0e10cSrcweir #ifdef ODBC_LIBRARY_1 220cdf0e10cSrcweir if ( !bLoaded ) 221cdf0e10cSrcweir bLoaded = load(ODBC_LIBRARY_1); 222cdf0e10cSrcweir #endif 223cdf0e10cSrcweir 224cdf0e10cSrcweir if ( bLoaded ) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 227cdf0e10cSrcweir // load the generic functions 228cdf0e10cSrcweir m_pAllocHandle = loadSymbol("SQLAllocHandle"); 229cdf0e10cSrcweir m_pFreeHandle = loadSymbol("SQLFreeHandle"); 230cdf0e10cSrcweir m_pSetEnvAttr = loadSymbol("SQLSetEnvAttr"); 231cdf0e10cSrcweir m_pDataSources = loadSymbol("SQLDataSources"); 232cdf0e10cSrcweir 233cdf0e10cSrcweir // all or nothing 234cdf0e10cSrcweir if (!m_pAllocHandle || !m_pSetEnvAttr || !m_pDataSources || !m_pFreeHandle) 235cdf0e10cSrcweir { 236cdf0e10cSrcweir unload(); 237cdf0e10cSrcweir m_pAllocHandle = m_pFreeHandle = m_pSetEnvAttr = m_pDataSources = NULL; 238cdf0e10cSrcweir } 239cdf0e10cSrcweir #endif 240cdf0e10cSrcweir } 241cdf0e10cSrcweir } 242cdf0e10cSrcweir 243cdf0e10cSrcweir //------------------------------------------------------------------------- 244cdf0e10cSrcweir OOdbcEnumeration::~OOdbcEnumeration() 245cdf0e10cSrcweir { 246cdf0e10cSrcweir freeEnv(); 247cdf0e10cSrcweir delete m_pImpl; 248cdf0e10cSrcweir 249cdf0e10cSrcweir DBG_DTOR(OOdbcEnumeration,NULL); 250cdf0e10cSrcweir } 251cdf0e10cSrcweir 252cdf0e10cSrcweir //------------------------------------------------------------------------- 253cdf0e10cSrcweir sal_Bool OOdbcEnumeration::allocEnv() 254cdf0e10cSrcweir { 255cdf0e10cSrcweir OSL_ENSURE(isLoaded(), "OOdbcEnumeration::allocEnv: not loaded!"); 256cdf0e10cSrcweir if (!isLoaded()) 257cdf0e10cSrcweir return sal_False; 258cdf0e10cSrcweir 259cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 260cdf0e10cSrcweir if (m_pImpl->hEnvironment) 261cdf0e10cSrcweir // nothing to do 262cdf0e10cSrcweir return sal_True; 263cdf0e10cSrcweir SQLRETURN nResult = NSQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_pImpl->hEnvironment); 264cdf0e10cSrcweir if (SQL_SUCCESS != nResult) 265cdf0e10cSrcweir // can't do anything without environment 266cdf0e10cSrcweir return sal_False; 267cdf0e10cSrcweir 268cdf0e10cSrcweir NSQLSetEnvAttr(m_pImpl->hEnvironment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); 269cdf0e10cSrcweir return sal_True; 270cdf0e10cSrcweir #else 271cdf0e10cSrcweir return sal_False; 272cdf0e10cSrcweir #endif 273cdf0e10cSrcweir } 274cdf0e10cSrcweir 275cdf0e10cSrcweir //------------------------------------------------------------------------- 276cdf0e10cSrcweir void OOdbcEnumeration::freeEnv() 277cdf0e10cSrcweir { 278cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 279cdf0e10cSrcweir if (m_pImpl->hEnvironment) 280cdf0e10cSrcweir NSQLFreeHandle(SQL_HANDLE_ENV, m_pImpl->hEnvironment); 281cdf0e10cSrcweir m_pImpl->hEnvironment = 0; 282cdf0e10cSrcweir #endif 283cdf0e10cSrcweir } 284cdf0e10cSrcweir 285cdf0e10cSrcweir //------------------------------------------------------------------------- 286cdf0e10cSrcweir void OOdbcEnumeration::getDatasourceNames(StringBag& _rNames) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir OSL_ENSURE(isLoaded(), "OOdbcEnumeration::getDatasourceNames: not loaded!"); 289cdf0e10cSrcweir if (!isLoaded()) 290cdf0e10cSrcweir return; 291cdf0e10cSrcweir 292cdf0e10cSrcweir if (!allocEnv()) 293cdf0e10cSrcweir { 294cdf0e10cSrcweir OSL_ENSURE(sal_False, "OOdbcEnumeration::getDatasourceNames: could not allocate an ODBC environment!"); 295cdf0e10cSrcweir return; 296cdf0e10cSrcweir } 297cdf0e10cSrcweir 298cdf0e10cSrcweir #ifdef HAVE_ODBC_SUPPORT 299cdf0e10cSrcweir // now that we have an environment collect the data source names 300cdf0e10cSrcweir UCHAR szDSN[SQL_MAX_DSN_LENGTH+1]; 301cdf0e10cSrcweir SWORD pcbDSN; 302cdf0e10cSrcweir UCHAR szDescription[1024+1]; 303cdf0e10cSrcweir SWORD pcbDescription; 304cdf0e10cSrcweir SQLRETURN nResult = SQL_SUCCESS; 305cdf0e10cSrcweir rtl_TextEncoding nTextEncoding = osl_getThreadTextEncoding(); 306cdf0e10cSrcweir 307cdf0e10cSrcweir for ( nResult = NSQLDataSources(m_pImpl->hEnvironment, SQL_FETCH_FIRST, szDSN, sizeof(szDSN), &pcbDSN, szDescription, sizeof(szDescription)-1, &pcbDescription); 308cdf0e10cSrcweir ; 309cdf0e10cSrcweir nResult = NSQLDataSources(m_pImpl->hEnvironment, SQL_FETCH_NEXT, szDSN, sizeof(szDSN), &pcbDSN, szDescription, sizeof(szDescription)-1, &pcbDescription) 310cdf0e10cSrcweir ) 311cdf0e10cSrcweir { 312cdf0e10cSrcweir if (nResult != SQL_SUCCESS) 313cdf0e10cSrcweir // no further error handling 314cdf0e10cSrcweir break; 315cdf0e10cSrcweir else 316cdf0e10cSrcweir { 317cdf0e10cSrcweir ::rtl::OUString aCurrentDsn(reinterpret_cast<const char*>(szDSN),pcbDSN, nTextEncoding); 318cdf0e10cSrcweir _rNames.insert(aCurrentDsn); 319cdf0e10cSrcweir } 320cdf0e10cSrcweir } 321cdf0e10cSrcweir #endif 322cdf0e10cSrcweir } 323cdf0e10cSrcweir 324cdf0e10cSrcweir #ifdef HAVE_ODBC_ADMINISTRATION 325cdf0e10cSrcweir 326cdf0e10cSrcweir //========================================================================= 327cdf0e10cSrcweir //= ProcessTerminationWait 328cdf0e10cSrcweir //========================================================================= 329cdf0e10cSrcweir class ProcessTerminationWait : public ::osl::Thread 330cdf0e10cSrcweir { 331cdf0e10cSrcweir oslProcess m_hProcessHandle; 332cdf0e10cSrcweir Link m_aFinishHdl; 333cdf0e10cSrcweir 334cdf0e10cSrcweir public: 335cdf0e10cSrcweir ProcessTerminationWait( oslProcess _hProcessHandle, const Link& _rFinishHdl ) 336cdf0e10cSrcweir :m_hProcessHandle( _hProcessHandle ) 337cdf0e10cSrcweir ,m_aFinishHdl( _rFinishHdl ) 338cdf0e10cSrcweir { 339cdf0e10cSrcweir } 340cdf0e10cSrcweir 341cdf0e10cSrcweir protected: 342cdf0e10cSrcweir virtual void SAL_CALL run() 343cdf0e10cSrcweir { 344cdf0e10cSrcweir osl_joinProcess( m_hProcessHandle ); 345cdf0e10cSrcweir osl_freeProcessHandle( m_hProcessHandle ); 346cdf0e10cSrcweir Application::PostUserEvent( m_aFinishHdl ); 347cdf0e10cSrcweir } 348cdf0e10cSrcweir }; 349cdf0e10cSrcweir 350cdf0e10cSrcweir //========================================================================= 351cdf0e10cSrcweir //= OOdbcManagement 352cdf0e10cSrcweir //========================================================================= 353cdf0e10cSrcweir //------------------------------------------------------------------------- 354cdf0e10cSrcweir OOdbcManagement::OOdbcManagement( const Link& _rAsyncFinishCallback ) 355cdf0e10cSrcweir :m_pProcessWait( NULL ) 356cdf0e10cSrcweir ,m_aAsyncFinishCallback( _rAsyncFinishCallback ) 357cdf0e10cSrcweir { 358cdf0e10cSrcweir } 359cdf0e10cSrcweir 360cdf0e10cSrcweir //------------------------------------------------------------------------- 361cdf0e10cSrcweir OOdbcManagement::~OOdbcManagement() 362cdf0e10cSrcweir { 363cdf0e10cSrcweir // wait for our thread to be finished 364cdf0e10cSrcweir if ( m_pProcessWait.get() ) 365cdf0e10cSrcweir m_pProcessWait->join(); 366cdf0e10cSrcweir } 367cdf0e10cSrcweir 368cdf0e10cSrcweir //------------------------------------------------------------------------- 369cdf0e10cSrcweir bool OOdbcManagement::manageDataSources_async() 370cdf0e10cSrcweir { 371cdf0e10cSrcweir OSL_PRECOND( !isRunning(), "OOdbcManagement::manageDataSources_async: still running from the previous call!" ); 372cdf0e10cSrcweir if ( isRunning() ) 373cdf0e10cSrcweir return false; 374cdf0e10cSrcweir 375cdf0e10cSrcweir // this is done in an external process, due to #i78733# 376cdf0e10cSrcweir // (and note this whole functionality is supported on Windows only, ATM) 377cdf0e10cSrcweir ::rtl::OUString sExecutableName( RTL_CONSTASCII_USTRINGPARAM( "$OOO_BASE_DIR/program/odbcconfig.exe" ) ); 378cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros( sExecutableName ); //TODO: detect failure 379cdf0e10cSrcweir oslProcess hProcessHandle(0); 380cdf0e10cSrcweir oslProcessError eError = osl_executeProcess( sExecutableName.pData, NULL, 0, 0, NULL, NULL, NULL, 0, &hProcessHandle ); 381cdf0e10cSrcweir if ( eError != osl_Process_E_None ) 382cdf0e10cSrcweir return false; 383cdf0e10cSrcweir 384cdf0e10cSrcweir m_pProcessWait.reset( new ProcessTerminationWait( hProcessHandle, m_aAsyncFinishCallback ) ); 385cdf0e10cSrcweir m_pProcessWait->create(); 386cdf0e10cSrcweir return true; 387cdf0e10cSrcweir } 388cdf0e10cSrcweir 389cdf0e10cSrcweir //------------------------------------------------------------------------- 390cdf0e10cSrcweir bool OOdbcManagement::isRunning() const 391cdf0e10cSrcweir { 392cdf0e10cSrcweir return ( m_pProcessWait.get() && m_pProcessWait->isRunning() ); 393cdf0e10cSrcweir } 394cdf0e10cSrcweir 395cdf0e10cSrcweir #endif // HAVE_ODBC_ADMINISTRATION 396cdf0e10cSrcweir 397cdf0e10cSrcweir //......................................................................... 398cdf0e10cSrcweir } // namespace dbaui 399cdf0e10cSrcweir //......................................................................... 400