1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_connectivity.hxx" 30 #include <unotools/tempfile.hxx> 31 #include "adabas/BDriver.hxx" 32 #include "adabas/BConnection.hxx" 33 #include "odbc/OFunctions.hxx" 34 #include <com/sun/star/lang/DisposedException.hpp> 35 #include "odbc/OTools.hxx" 36 #include "connectivity/dbexception.hxx" 37 #include "TConnection.hxx" 38 #include "diagnose_ex.h" 39 #include <vos/process.hxx> 40 #include <osl/process.h> 41 #include <unotools/ucbhelper.hxx> 42 #include <unotools/ucbstreamhelper.hxx> 43 #include <unotools/localfilehelper.hxx> 44 #include "resource/adabas_res.hrc" 45 #include "resource/sharedresources.hxx" 46 47 48 #include <memory> 49 #include <sys/stat.h> 50 51 #if defined(UNX) 52 const char sNewLine = '\012'; 53 #else 54 const char sNewLine[] = "\015\012"; // \015\012 and not \n 55 #endif 56 #define ADABAS_DB_11 "11.02.00" 57 #define ADABAS_KERNEL_11 "11.02" 58 #define ADABAS_DB_12 "12.01.00" 59 #define ADABAS_KERNEL_12 "12.01" 60 #define CURRENT_DB_VERSION "13.01.00" 61 #define CURRENT_KERNEL_VERSION "13.01" 62 63 #define OPROCESS_ADABAS (OProcess::TOption_Hidden | OProcess::TOption_Wait | OProcess::TOption_SearchPath) 64 #define OPROCESS_ADABAS_DBG (OProcess::TOption_Wait | OProcess::TOption_SearchPath) 65 66 67 using namespace connectivity; 68 namespace connectivity 69 { 70 namespace adabas 71 { 72 // extern declaration of the function pointer 73 extern T3SQLAllocHandle pODBC3SQLAllocHandle; 74 extern T3SQLConnect pODBC3SQLConnect; 75 extern T3SQLDriverConnect pODBC3SQLDriverConnect; 76 extern T3SQLBrowseConnect pODBC3SQLBrowseConnect; 77 extern T3SQLDataSources pODBC3SQLDataSources; 78 extern T3SQLDrivers pODBC3SQLDrivers; 79 extern T3SQLGetInfo pODBC3SQLGetInfo; 80 extern T3SQLGetFunctions pODBC3SQLGetFunctions; 81 extern T3SQLGetTypeInfo pODBC3SQLGetTypeInfo; 82 extern T3SQLSetConnectAttr pODBC3SQLSetConnectAttr; 83 extern T3SQLGetConnectAttr pODBC3SQLGetConnectAttr; 84 extern T3SQLSetEnvAttr pODBC3SQLSetEnvAttr; 85 extern T3SQLGetEnvAttr pODBC3SQLGetEnvAttr; 86 extern T3SQLSetStmtAttr pODBC3SQLSetStmtAttr; 87 extern T3SQLGetStmtAttr pODBC3SQLGetStmtAttr; 88 //extern T3SQLSetDescField pODBC3SQLSetDescField; 89 //extern T3SQLGetDescField pODBC3SQLGetDescField; 90 //extern T3SQLGetDescRec pODBC3SQLGetDescRec; 91 //extern T3SQLSetDescRec pODBC3SQLSetDescRec; 92 extern T3SQLPrepare pODBC3SQLPrepare; 93 extern T3SQLBindParameter pODBC3SQLBindParameter; 94 //extern T3SQLGetCursorName pODBC3SQLGetCursorName; 95 extern T3SQLSetCursorName pODBC3SQLSetCursorName; 96 extern T3SQLExecute pODBC3SQLExecute; 97 extern T3SQLExecDirect pODBC3SQLExecDirect; 98 //extern T3SQLNativeSql pODBC3SQLNativeSql; 99 extern T3SQLDescribeParam pODBC3SQLDescribeParam; 100 extern T3SQLNumParams pODBC3SQLNumParams; 101 extern T3SQLParamData pODBC3SQLParamData; 102 extern T3SQLPutData pODBC3SQLPutData; 103 extern T3SQLRowCount pODBC3SQLRowCount; 104 extern T3SQLNumResultCols pODBC3SQLNumResultCols; 105 extern T3SQLDescribeCol pODBC3SQLDescribeCol; 106 extern T3SQLColAttribute pODBC3SQLColAttribute; 107 extern T3SQLBindCol pODBC3SQLBindCol; 108 extern T3SQLFetch pODBC3SQLFetch; 109 extern T3SQLFetchScroll pODBC3SQLFetchScroll; 110 extern T3SQLGetData pODBC3SQLGetData; 111 extern T3SQLSetPos pODBC3SQLSetPos; 112 extern T3SQLBulkOperations pODBC3SQLBulkOperations; 113 extern T3SQLMoreResults pODBC3SQLMoreResults; 114 //extern T3SQLGetDiagField pODBC3SQLGetDiagField; 115 extern T3SQLGetDiagRec pODBC3SQLGetDiagRec; 116 extern T3SQLColumnPrivileges pODBC3SQLColumnPrivileges; 117 extern T3SQLColumns pODBC3SQLColumns; 118 extern T3SQLForeignKeys pODBC3SQLForeignKeys; 119 extern T3SQLPrimaryKeys pODBC3SQLPrimaryKeys; 120 extern T3SQLProcedureColumns pODBC3SQLProcedureColumns; 121 extern T3SQLProcedures pODBC3SQLProcedures; 122 extern T3SQLSpecialColumns pODBC3SQLSpecialColumns; 123 extern T3SQLStatistics pODBC3SQLStatistics; 124 extern T3SQLTablePrivileges pODBC3SQLTablePrivileges; 125 extern T3SQLTables pODBC3SQLTables; 126 extern T3SQLFreeStmt pODBC3SQLFreeStmt; 127 extern T3SQLCloseCursor pODBC3SQLCloseCursor; 128 extern T3SQLCancel pODBC3SQLCancel; 129 extern T3SQLEndTran pODBC3SQLEndTran; 130 extern T3SQLDisconnect pODBC3SQLDisconnect; 131 extern T3SQLFreeHandle pODBC3SQLFreeHandle; 132 extern T3SQLGetCursorName pODBC3SQLGetCursorName; 133 extern T3SQLNativeSql pODBC3SQLNativeSql; 134 135 using namespace ::com::sun::star::uno; 136 using namespace ::com::sun::star::beans; 137 using namespace ::com::sun::star::sdbcx; 138 using namespace ::com::sun::star::sdbc; 139 using namespace ::com::sun::star::container; 140 using namespace ::com::sun::star::lang; 141 using namespace utl; 142 using namespace osl; 143 using namespace vos; 144 using namespace ::dbtools; 145 146 sal_Bool LoadFunctions(oslModule pODBCso); 147 sal_Bool LoadLibrary_ADABAS(::rtl::OUString &_rPath); 148 // -------------------------------------------------------------------------------- 149 void ODriver::fillInfo(const Sequence< PropertyValue >& info, TDatabaseStruct& _rDBInfo) 150 { 151 const PropertyValue* pIter = info.getConstArray(); 152 const PropertyValue* pEnd = pIter + info.getLength(); 153 for(;pIter != pEnd;++pIter) 154 { 155 if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DatabaseName")))) 156 { 157 pIter->Value >>= _rDBInfo.sDBName; 158 } 159 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlUser")))) 160 { 161 pIter->Value >>= _rDBInfo.sControlUser; 162 } 163 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlPassword")))) 164 { 165 pIter->Value >>= _rDBInfo.sControlPassword; 166 } 167 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataCacheSizeIncrement")))) 168 pIter->Value >>= _rDBInfo.nDataIncrement; 169 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShutdownDatabase")))) 170 pIter->Value >>= _rDBInfo.bShutDown; 171 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("User")))) 172 { 173 pIter->Value >>= _rDBInfo.sSysUser; 174 } 175 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Password")))) 176 { 177 pIter->Value >>= _rDBInfo.sSysPassword; 178 } 179 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DomainPassword")))) 180 { 181 pIter->Value >>= _rDBInfo.sDomainPassword; 182 } 183 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CacheSize")))) 184 { 185 pIter->Value >>= _rDBInfo.sCacheSize; 186 } 187 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RestoreDatabase")))) 188 { 189 pIter->Value >>= _rDBInfo.bRestoreDatabase; 190 } 191 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Backup")))) 192 { 193 pIter->Value >>= _rDBInfo.sBackupFile; 194 } 195 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataDevSpace")))) 196 { 197 pIter->Value >>= _rDBInfo.sDataDevName; 198 } 199 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SYSDEVSPACE")))) 200 { 201 pIter->Value >>= _rDBInfo.sSysDevSpace; 202 } 203 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TRANSACTION_LOG")))) 204 { 205 pIter->Value >>= _rDBInfo.sTransLogName; 206 } 207 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataDevSize")))) 208 { 209 pIter->Value >>= _rDBInfo.nDataSize; 210 } 211 else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LogDevSize")))) 212 { 213 pIter->Value >>= _rDBInfo.nLogSize; 214 } 215 } 216 } 217 218 219 // -------------------------------------------------------------------------------- 220 ODriver::ODriver(const Reference< XMultiServiceFactory >& _rxFactory) : ODBCDriver(_rxFactory) 221 { 222 osl_incrementInterlockedCount(&m_refCount); 223 fillEnvironmentVariables(); 224 Reference< XComponent > xComponent(m_xORB, UNO_QUERY); 225 if (xComponent.is()) 226 { 227 Reference< ::com::sun::star::lang::XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY); 228 xComponent->addEventListener(xEvtL); 229 } 230 osl_decrementInterlockedCount(&m_refCount); 231 } 232 //------------------------------------------------------------------------------ 233 void ODriver::disposing() 234 { 235 ::osl::MutexGuard aGuard(m_aMutex); 236 ODriver_BASE::disposing(); 237 Reference< XComponent > xComponent(m_xORB, UNO_QUERY); 238 if (xComponent.is()) 239 { 240 Reference< XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY); 241 xComponent->removeEventListener(xEvtL); 242 } 243 m_xORB.clear(); 244 } 245 246 // static ServiceInfo 247 //------------------------------------------------------------------------------ 248 rtl::OUString ODriver::getImplementationName_Static( ) throw(RuntimeException) 249 { 250 return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.sdbcx.adabas.ODriver")); 251 } 252 //------------------------------------------------------------------------------ 253 Sequence< ::rtl::OUString > ODriver::getSupportedServiceNames_Static( ) throw (RuntimeException) 254 { 255 Sequence< ::rtl::OUString > aSNS( 2 ); 256 aSNS[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbc.Driver")); 257 aSNS[1] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbcx.Driver")); 258 return aSNS; 259 } 260 //------------------------------------------------------------------ 261 ::rtl::OUString SAL_CALL ODriver::getImplementationName( ) throw(RuntimeException) 262 { 263 return getImplementationName_Static(); 264 } 265 266 //------------------------------------------------------------------ 267 sal_Bool SAL_CALL ODriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException) 268 { 269 const Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); 270 const ::rtl::OUString* pSupported = aSupported.getConstArray(); 271 const ::rtl::OUString* pEnd = pSupported + aSupported.getLength(); 272 for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported) 273 ; 274 275 return pSupported != pEnd; 276 } 277 //------------------------------------------------------------------ 278 Sequence< ::rtl::OUString > SAL_CALL ODriver::getSupportedServiceNames( ) throw(RuntimeException) 279 { 280 return getSupportedServiceNames_Static(); 281 } 282 //------------------------------------------------------------------ 283 Any SAL_CALL ODriver::queryInterface( const Type & rType ) throw(RuntimeException) 284 { 285 Any aRet = ::cppu::queryInterface(rType, static_cast<XDataDefinitionSupplier*>(this)); 286 if ( !aRet.hasValue() ) 287 aRet = ODriver_BASE::queryInterface(rType); 288 return aRet.hasValue() ? aRet : ODriver_BASE2::queryInterface(rType); 289 } 290 //------------------------------------------------------------------ 291 Reference< XInterface > SAL_CALL ODriver_CreateInstance(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFac) throw( Exception ) 292 { 293 return *(new ODriver(_rxFac)); 294 } 295 // ----------------------------------------------------------------------------- 296 void SAL_CALL ODriver::disposing( const EventObject& Source ) throw(RuntimeException) 297 { 298 ::osl::MutexGuard aGuard( m_aMutex ); 299 300 if(m_xORB.is() && Reference< XMultiServiceFactory >(Source.Source,UNO_QUERY) == m_xORB) 301 { 302 TDatabaseMap::iterator aIter = m_aDatabaseMap.begin(); 303 for(;aIter != m_aDatabaseMap.end();++aIter) 304 { 305 if(aIter->second.bShutDown) 306 { 307 ::rtl::OUString sName; 308 if(getDBName(aIter->first,sName)) 309 { 310 XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SHUTDOWN QUICK")),sName,aIter->second.sControlUser,aIter->second.sControlPassword); 311 X_STOP(sName); 312 } 313 } 314 } 315 m_xORB.clear(); 316 } 317 } 318 // -------------------------------------------------------------------------------- 319 Reference< XConnection > SAL_CALL ODriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException) 320 { 321 if ( ! acceptsURL(url) ) 322 return NULL; 323 324 ::osl::MutexGuard aGuard( m_aMutex ); 325 if (ODriver_BASE::rBHelper.bDisposed) 326 throw DisposedException(); 327 328 TDatabaseStruct aDBInfo; 329 aDBInfo.bShutDown = sal_False; 330 fillInfo(info,aDBInfo); 331 aDBInfo.sControlUser = aDBInfo.sControlUser.toAsciiUpperCase(); 332 aDBInfo.sControlPassword = aDBInfo.sControlPassword.toAsciiUpperCase(); 333 aDBInfo.sSysUser = aDBInfo.sSysUser.toAsciiUpperCase(); 334 aDBInfo.sSysPassword = aDBInfo.sSysPassword.toAsciiUpperCase(); 335 336 337 TDatabaseMap::iterator aFind = m_aDatabaseMap.find(url); 338 if(aFind == m_aDatabaseMap.end()) // only when not found yet 339 m_aDatabaseMap[url] = aDBInfo; 340 else 341 { 342 if(aFind->second.bShutDown != aDBInfo.bShutDown) 343 aFind->second.bShutDown &= aDBInfo.bShutDown; 344 } 345 346 ::rtl::OUString sName; 347 if(aDBInfo.sControlPassword.getLength() && aDBInfo.sControlUser.getLength() && getDBName(url,sName)) 348 { 349 // check if we have to add a new data dev space 350 checkAndInsertNewDevSpace(sName,aDBInfo); 351 352 convertOldVersion(sName,aDBInfo); 353 // check if we must restart the database 354 checkAndRestart(sName,aDBInfo); 355 } 356 357 358 if(!m_pDriverHandle) 359 { 360 ::rtl::OUString aPath; 361 if(!EnvironmentHandle(aPath)) 362 throw SQLException(aPath,*this,::rtl::OUString(),1000,Any()); 363 } 364 OAdabasConnection* pCon = new OAdabasConnection(m_pDriverHandle,this); 365 Reference< XConnection > xCon = pCon; 366 SQLRETURN nSQLRETURN = pCon->Construct(url,info); 367 368 if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA) 369 { 370 odbc::OTools::ThrowException(pCon,nSQLRETURN,pCon->getConnection(),SQL_HANDLE_DBC,*this); 371 } 372 373 m_xConnections.push_back(WeakReferenceHelper(*pCon)); 374 375 return xCon; 376 } 377 // ----------------------------------------------------------------------------- 378 sal_Bool ODriver::getDBName(const ::rtl::OUString& _rName,::rtl::OUString& sDBName) const 379 { 380 sDBName = ::rtl::OUString(); 381 ::rtl::OUString sName = _rName.copy(12); 382 sal_Int32 nPos = sName.indexOf(':'); 383 if(nPos != -1 && nPos < 1) 384 sDBName = sName.copy(1); 385 return (nPos != -1 && nPos < 1); 386 } 387 // -------------------------------------------------------------------------------- 388 sal_Bool SAL_CALL ODriver::acceptsURL( const ::rtl::OUString& url ) 389 throw(SQLException, RuntimeException) 390 { 391 return (!url.compareTo(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:adabas:")),12)); 392 } 393 // -------------------------------------------------------------------------------- 394 Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& /*info*/) throw(SQLException, RuntimeException) 395 { 396 if ( acceptsURL(url) ) 397 { 398 ::std::vector< DriverPropertyInfo > aDriverInfo; 399 400 aDriverInfo.push_back(DriverPropertyInfo( 401 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShutdownDatabase")) 402 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Shut down service when closing.")) 403 ,sal_False 404 ,::rtl::OUString() 405 ,Sequence< ::rtl::OUString >()) 406 ); 407 aDriverInfo.push_back(DriverPropertyInfo( 408 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlUser")) 409 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Control user name.")) 410 ,sal_False 411 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0")) 412 ,Sequence< ::rtl::OUString >()) 413 ); 414 aDriverInfo.push_back(DriverPropertyInfo( 415 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlPassword")) 416 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Control password.")) 417 ,sal_False 418 ,::rtl::OUString() 419 ,Sequence< ::rtl::OUString >()) 420 ); 421 aDriverInfo.push_back(DriverPropertyInfo( 422 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataCacheSizeIncrement")) 423 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Data increment (MB).")) 424 ,sal_False 425 ,::rtl::OUString() 426 ,Sequence< ::rtl::OUString >()) 427 ); 428 aDriverInfo.push_back(DriverPropertyInfo( 429 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet")) 430 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet of the database.")) 431 ,sal_False 432 ,::rtl::OUString() 433 ,Sequence< ::rtl::OUString >()) 434 ); 435 return Sequence< DriverPropertyInfo >(&aDriverInfo[0],aDriverInfo.size()); 436 } 437 438 SharedResources aResources; 439 const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); 440 ::dbtools::throwGenericSQLException(sMessage ,*this); 441 return Sequence< DriverPropertyInfo >(); 442 } 443 // -------------------------------------------------------------------------------- 444 sal_Int32 SAL_CALL ODriver::getMajorVersion( ) throw(RuntimeException) 445 { 446 return 1; 447 } 448 // -------------------------------------------------------------------------------- 449 sal_Int32 SAL_CALL ODriver::getMinorVersion( ) throw(RuntimeException) 450 { 451 return 0; 452 } 453 // ----------------------------------------------------------------------------- 454 // XCreateCatalog 455 void SAL_CALL ODriver::createCatalog( const Sequence< PropertyValue >& info ) throw(SQLException, ElementExistException, RuntimeException) 456 { 457 ::osl::MutexGuard aGuard( m_aMutex ); 458 if (ODriver_BASE::rBHelper.bDisposed) 459 throw DisposedException(); 460 461 try 462 { 463 TDatabaseStruct aDBInfo; 464 fillInfo(info,aDBInfo); 465 466 ::rtl::OUString envVar(RTL_CONSTASCII_USTRINGPARAM("DBSERVICE")); 467 ::rtl::OUString envData(RTL_CONSTASCII_USTRINGPARAM("0")); 468 osl_setEnvironment(envVar.pData, envData.pData); 469 470 m_sDbRunDir = m_sDbWorkURL + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/wrk/")) + aDBInfo.sDBName; 471 String sTemp; 472 LocalFileHelper::ConvertURLToPhysicalName(m_sDbRunDir,sTemp); 473 m_sDbRunDir = sTemp; 474 475 createNeededDirs(aDBInfo.sDBName); 476 if(CreateFiles(aDBInfo)) 477 { 478 ::connectivity::SharedResources aResources; 479 const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( 480 STR_NO_DISK_SPACE, 481 "$filename$",aDBInfo.sDBName 482 ) ); 483 ::dbtools::throwGenericSQLException(sError,*this); 484 } // if(CreateFiles(aDBInfo)) 485 486 createDb(aDBInfo); 487 } 488 catch( SQLException&) 489 { 490 throw; 491 } 492 catch(Exception&) 493 { 494 throw SQLException(); 495 } 496 497 } 498 // ----------------------------------------------------------------------------- 499 // XDropCatalog 500 void SAL_CALL ODriver::dropCatalog( const ::rtl::OUString& /*catalogName*/, const Sequence< PropertyValue >& /*info*/ ) throw(SQLException, NoSuchElementException, RuntimeException) 501 { 502 ::osl::MutexGuard aGuard( m_aMutex ); 503 if (ODriver_BASE::rBHelper.bDisposed) 504 throw DisposedException(); 505 506 ::dbtools::throwFeatureNotImplementedException( "!XDropCatalog::dropCatalog", *this ); 507 } 508 //----------------------------------------------------------------------------- 509 // ODBC Environment (gemeinsam fuer alle Connections): 510 SQLHANDLE ODriver::EnvironmentHandle(::rtl::OUString &_rPath) 511 { 512 // Ist (fuer diese Instanz) bereits ein Environment erzeugt worden? 513 if (!m_pDriverHandle) 514 { 515 SQLHANDLE h = SQL_NULL_HANDLE; 516 // Environment allozieren 517 518 // ODBC-DLL jetzt laden: 519 if (! LoadLibrary_ADABAS(_rPath)) 520 return SQL_NULL_HANDLE; 521 522 if (N3SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&h) != SQL_SUCCESS) 523 return SQL_NULL_HANDLE; 524 525 // In globaler Struktur merken ... 526 m_pDriverHandle = h; 527 SQLRETURN nError = N3SQLSetEnvAttr(h, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); 528 OSL_UNUSED( nError ); 529 //N3SQLSetEnvAttr(h, SQL_ATTR_CONNECTION_POOLING,(SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER); 530 } 531 532 return m_pDriverHandle; 533 } 534 // -------------------------------------------------------------------------------- 535 // XDataDefinitionSupplier 536 Reference< XTablesSupplier > SAL_CALL ODriver::getDataDefinitionByConnection( const Reference< ::com::sun::star::sdbc::XConnection >& connection ) throw(::com::sun::star::sdbc::SQLException, RuntimeException) 537 { 538 ::osl::MutexGuard aGuard( m_aMutex ); 539 if (ODriver_BASE::rBHelper.bDisposed) 540 throw DisposedException(); 541 542 Reference< XTablesSupplier > xTab; 543 Reference< ::com::sun::star::lang::XUnoTunnel> xTunnel(connection,UNO_QUERY); 544 if ( xTunnel.is() ) 545 { 546 547 OAdabasConnection* pConnection = NULL; 548 OAdabasConnection* pSearchConnection = reinterpret_cast< OAdabasConnection* >( xTunnel->getSomething(OAdabasConnection::getUnoTunnelImplementationId()) ); 549 for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i) 550 { 551 if ( (OAdabasConnection*) Reference< XConnection >::query(i->get().get()).get() == pSearchConnection ) 552 { 553 pConnection = pSearchConnection; 554 break; 555 } 556 } 557 558 559 if ( pConnection ) 560 xTab = pConnection->createCatalog(); 561 } 562 return xTab; 563 } 564 565 // -------------------------------------------------------------------------------- 566 Reference< XTablesSupplier > SAL_CALL ODriver::getDataDefinitionByURL( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, RuntimeException) 567 { 568 if ( ! acceptsURL(url) ) 569 { 570 SharedResources aResources; 571 const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); 572 ::dbtools::throwGenericSQLException(sMessage ,*this); 573 } // if ( ! acceptsURL(url) ) 574 575 return getDataDefinitionByConnection(connect(url,info)); 576 } 577 // ----------------------------------------------------------------------------- 578 void SAL_CALL ODriver::acquire() throw() 579 { 580 ODriver_BASE::acquire(); 581 } 582 // ----------------------------------------------------------------------------- 583 void SAL_CALL ODriver::release() throw() 584 { 585 ODriver_BASE::release(); 586 } 587 ODriver::~ODriver() 588 { 589 } 590 // ----------------------------------------------------------------------------- 591 oslGenericFunction ODriver::getOdbcFunction(sal_Int32 _nIndex) const 592 { 593 oslGenericFunction pFunction = NULL; 594 switch(_nIndex) 595 { 596 case ODBC3SQLAllocHandle: 597 pFunction = (oslGenericFunction)pODBC3SQLAllocHandle;; 598 break; 599 case ODBC3SQLConnect: 600 pFunction = (oslGenericFunction)pODBC3SQLConnect; 601 break; 602 case ODBC3SQLDriverConnect: 603 pFunction = (oslGenericFunction)pODBC3SQLDriverConnect; 604 break; 605 case ODBC3SQLBrowseConnect: 606 pFunction = (oslGenericFunction)pODBC3SQLBrowseConnect; 607 break; 608 case ODBC3SQLDataSources: 609 pFunction = (oslGenericFunction)pODBC3SQLDataSources; 610 break; 611 case ODBC3SQLDrivers: 612 pFunction = (oslGenericFunction)pODBC3SQLDrivers; 613 break; 614 case ODBC3SQLGetInfo: 615 616 pFunction = (oslGenericFunction)pODBC3SQLGetInfo; 617 break; 618 case ODBC3SQLGetFunctions: 619 620 pFunction = (oslGenericFunction)pODBC3SQLGetFunctions; 621 break; 622 case ODBC3SQLGetTypeInfo: 623 624 pFunction = (oslGenericFunction)pODBC3SQLGetTypeInfo; 625 break; 626 case ODBC3SQLSetConnectAttr: 627 628 pFunction = (oslGenericFunction)pODBC3SQLSetConnectAttr; 629 break; 630 case ODBC3SQLGetConnectAttr: 631 632 pFunction = (oslGenericFunction)pODBC3SQLGetConnectAttr; 633 break; 634 case ODBC3SQLSetEnvAttr: 635 636 pFunction = (oslGenericFunction)pODBC3SQLSetEnvAttr; 637 break; 638 case ODBC3SQLGetEnvAttr: 639 640 pFunction = (oslGenericFunction)pODBC3SQLGetEnvAttr; 641 break; 642 case ODBC3SQLSetStmtAttr: 643 644 pFunction = (oslGenericFunction)pODBC3SQLSetStmtAttr; 645 break; 646 case ODBC3SQLGetStmtAttr: 647 648 pFunction = (oslGenericFunction)pODBC3SQLGetStmtAttr; 649 break; 650 case ODBC3SQLPrepare: 651 652 pFunction = (oslGenericFunction)pODBC3SQLPrepare; 653 break; 654 case ODBC3SQLBindParameter: 655 656 pFunction = (oslGenericFunction)pODBC3SQLBindParameter; 657 break; 658 case ODBC3SQLSetCursorName: 659 660 pFunction = (oslGenericFunction)pODBC3SQLSetCursorName; 661 break; 662 case ODBC3SQLExecute: 663 664 pFunction = (oslGenericFunction)pODBC3SQLExecute; 665 break; 666 case ODBC3SQLExecDirect: 667 668 pFunction = (oslGenericFunction)pODBC3SQLExecDirect; 669 break; 670 case ODBC3SQLDescribeParam: 671 672 pFunction = (oslGenericFunction)pODBC3SQLDescribeParam; 673 break; 674 case ODBC3SQLNumParams: 675 676 pFunction = (oslGenericFunction)pODBC3SQLNumParams; 677 break; 678 case ODBC3SQLParamData: 679 680 pFunction = (oslGenericFunction)pODBC3SQLParamData; 681 break; 682 case ODBC3SQLPutData: 683 684 pFunction = (oslGenericFunction)pODBC3SQLPutData; 685 break; 686 case ODBC3SQLRowCount: 687 688 pFunction = (oslGenericFunction)pODBC3SQLRowCount; 689 break; 690 case ODBC3SQLNumResultCols: 691 692 pFunction = (oslGenericFunction)pODBC3SQLNumResultCols; 693 break; 694 case ODBC3SQLDescribeCol: 695 696 pFunction = (oslGenericFunction)pODBC3SQLDescribeCol; 697 break; 698 case ODBC3SQLColAttribute: 699 700 pFunction = (oslGenericFunction)pODBC3SQLColAttribute; 701 break; 702 case ODBC3SQLBindCol: 703 704 pFunction = (oslGenericFunction)pODBC3SQLBindCol; 705 break; 706 case ODBC3SQLFetch: 707 708 pFunction = (oslGenericFunction)pODBC3SQLFetch; 709 break; 710 case ODBC3SQLFetchScroll: 711 712 pFunction = (oslGenericFunction)pODBC3SQLFetchScroll; 713 break; 714 case ODBC3SQLGetData: 715 716 pFunction = (oslGenericFunction)pODBC3SQLGetData; 717 break; 718 case ODBC3SQLSetPos: 719 720 pFunction = (oslGenericFunction)pODBC3SQLSetPos; 721 break; 722 case ODBC3SQLBulkOperations: 723 724 pFunction = (oslGenericFunction)pODBC3SQLBulkOperations; 725 break; 726 case ODBC3SQLMoreResults: 727 728 pFunction = (oslGenericFunction)pODBC3SQLMoreResults; 729 break; 730 case ODBC3SQLGetDiagRec: 731 732 pFunction = (oslGenericFunction)pODBC3SQLGetDiagRec; 733 break; 734 case ODBC3SQLColumnPrivileges: 735 736 pFunction = (oslGenericFunction)pODBC3SQLColumnPrivileges; 737 break; 738 case ODBC3SQLColumns: 739 740 pFunction = (oslGenericFunction)pODBC3SQLColumns; 741 break; 742 case ODBC3SQLForeignKeys: 743 744 pFunction = (oslGenericFunction)pODBC3SQLForeignKeys; 745 break; 746 case ODBC3SQLPrimaryKeys: 747 748 pFunction = (oslGenericFunction)pODBC3SQLPrimaryKeys; 749 break; 750 case ODBC3SQLProcedureColumns: 751 752 pFunction = (oslGenericFunction)pODBC3SQLProcedureColumns; 753 break; 754 case ODBC3SQLProcedures: 755 756 pFunction = (oslGenericFunction)pODBC3SQLProcedures; 757 break; 758 case ODBC3SQLSpecialColumns: 759 760 pFunction = (oslGenericFunction)pODBC3SQLSpecialColumns; 761 break; 762 case ODBC3SQLStatistics: 763 764 pFunction = (oslGenericFunction)pODBC3SQLStatistics; 765 break; 766 case ODBC3SQLTablePrivileges: 767 768 pFunction = (oslGenericFunction)pODBC3SQLTablePrivileges; 769 break; 770 case ODBC3SQLTables: 771 772 pFunction = (oslGenericFunction)pODBC3SQLTables; 773 break; 774 case ODBC3SQLFreeStmt: 775 776 pFunction = (oslGenericFunction)pODBC3SQLFreeStmt; 777 break; 778 case ODBC3SQLCloseCursor: 779 780 pFunction = (oslGenericFunction)pODBC3SQLCloseCursor; 781 break; 782 case ODBC3SQLCancel: 783 784 pFunction = (oslGenericFunction)pODBC3SQLCancel; 785 break; 786 case ODBC3SQLEndTran: 787 788 pFunction = (oslGenericFunction)pODBC3SQLEndTran; 789 break; 790 case ODBC3SQLDisconnect: 791 792 pFunction = (oslGenericFunction)pODBC3SQLDisconnect; 793 break; 794 case ODBC3SQLFreeHandle: 795 796 pFunction = (oslGenericFunction)pODBC3SQLFreeHandle; 797 break; 798 case ODBC3SQLGetCursorName: 799 800 pFunction = (oslGenericFunction)pODBC3SQLGetCursorName; 801 break; 802 case ODBC3SQLNativeSql: 803 804 pFunction = (oslGenericFunction)pODBC3SQLNativeSql; 805 break; 806 default: 807 OSL_ENSURE(0,"Function unknown!"); 808 } 809 return pFunction; 810 } 811 // ----------------------------------------------------------------------------- 812 void ODriver::createNeededDirs(const ::rtl::OUString& sDBName) 813 { 814 ::rtl::OUString sDbWork,sDBConfig,sTemp; 815 816 if(m_sDbWork.getLength()) 817 { 818 sDbWork = m_sDbWorkURL; 819 if(!UCBContentHelper::IsFolder(m_sDbWorkURL)) 820 UCBContentHelper::MakeFolder(m_sDbWorkURL); 821 822 sDbWork += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); 823 sDbWork += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("wrk")); 824 if(!UCBContentHelper::IsFolder(sDbWork)) 825 UCBContentHelper::MakeFolder(sDbWork); 826 827 sDbWork += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); 828 829 sTemp = sDbWork; 830 sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("config")); 831 if(!UCBContentHelper::IsFolder(sTemp)) 832 UCBContentHelper::MakeFolder(sTemp); 833 834 sTemp = sDbWork; 835 sTemp += sDBName; 836 if(!UCBContentHelper::IsFolder(sTemp)) 837 UCBContentHelper::MakeFolder(sTemp); 838 } 839 840 if(m_sDbConfig.getLength()) 841 { 842 sDBConfig = m_sDbConfigURL; 843 if(!UCBContentHelper::IsFolder(sDBConfig)) 844 UCBContentHelper::MakeFolder(sDBConfig); 845 846 sDBConfig += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); 847 sTemp = sDBConfig; 848 sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("config")); 849 if(!UCBContentHelper::IsFolder(sTemp)) 850 UCBContentHelper::MakeFolder(sTemp); 851 852 sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); 853 sTemp += sDBName; 854 if(UCBContentHelper::Exists(sTemp)) 855 UCBContentHelper::Kill(sTemp); 856 857 #if !(defined(WNT)) 858 sTemp = sDBConfig; 859 sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("diag")); 860 if(!UCBContentHelper::IsFolder(sTemp)) 861 UCBContentHelper::MakeFolder(sTemp); 862 863 sTemp = sDBConfig; 864 sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ipc")); 865 if(!UCBContentHelper::IsFolder(sTemp)) 866 UCBContentHelper::MakeFolder(sTemp); 867 868 sTemp = sDBConfig; 869 sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("spool")); 870 if(!UCBContentHelper::IsFolder(sTemp)) 871 UCBContentHelper::MakeFolder(sTemp); 872 #endif 873 } 874 } 875 // ----------------------------------------------------------------------------- 876 void ODriver::clearDatabase(const ::rtl::OUString& sDBName) 877 { // stop the database 878 ::rtl::OUString sCommand; 879 #if defined(WNT) 880 ::rtl::OUString sStop = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("stop")); 881 OArgumentList aArgs(2,&sDBName,&sStop); 882 sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_cons.exe")); 883 #else 884 OArgumentList aArgs(1,&sDBName); 885 sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_clear")); 886 #endif 887 888 OProcess aApp( sCommand,m_sDbWorkURL); 889 #if OSL_DEBUG_LEVEL > 0 890 OProcess::TProcessError eError = 891 #endif 892 aApp.execute( (OProcess::TProcessOption) OPROCESS_ADABAS, aArgs ); 893 OSL_ENSURE( eError == OProcess::E_None, "ODriver::clearDatabase: calling the executable failed!" ); 894 } 895 // ----------------------------------------------------------------------------- 896 void ODriver::createDb( const TDatabaseStruct& _aInfo) 897 { 898 899 clearDatabase(_aInfo.sDBName); 900 901 X_PARAM(_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword,String::CreateFromAscii("BINIT")); 902 903 String sTemp; 904 LocalFileHelper::ConvertURLToPhysicalName(_aInfo.sSysDevSpace,sTemp); 905 906 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SYSDEVSPACE")),sTemp); 907 908 sTemp.Erase(); 909 LocalFileHelper::ConvertURLToPhysicalName(_aInfo.sTransLogName,sTemp); 910 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TRANSACTION_LOG")),sTemp); 911 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXUSERTASKS")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("3"))); 912 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXDEVSPACES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("7"))); 913 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXDATADEVSPACES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("5"))); 914 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXDATAPAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("25599"))); 915 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXBACKUPDEVS")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1"))); 916 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXSERVERDB")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1"))); 917 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATA_CACHE_PAGES")),_aInfo.sCacheSize); 918 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CONV_CACHE_PAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("23"))); 919 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PROC_DATA_PAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("40"))); 920 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RUNDIRECTORY")),m_sDbRunDir); 921 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("KERNELTRACESIZE")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("100"))); 922 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LOG_QUEUE_PAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("10"))); 923 924 #if !defined(WNT) 925 PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OPMSG1")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/dev/null"))); 926 #endif 927 928 X_PARAM(_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BCHECK"))); 929 930 X_START(_aInfo.sDBName); 931 932 // SHOW_STATE() 933 // %m_sDbRoot%\bin\xutil -d %_aInfo.sDBName% -u %CONUSR%,%CONPWD% -b %INITCMD% 934 ::rtl::OUString aBatch2 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-b ")); 935 936 // if(!bBsp && INITCMD.Len() >= 40) 937 // { 938 // DirEntry aTmp(INITCMD); 939 // aTmp.CopyTo(aInitFile, FSYS_ACTION_COPYFILE); 940 // INITCMD = aInitFile.GetFull(); 941 // } 942 // generate the init file for the database 943 String sInitFile = getDatabaseInitFile(_aInfo); 944 945 LocalFileHelper::ConvertURLToPhysicalName(sInitFile,sTemp); 946 aBatch2 += sTemp; 947 XUTIL(aBatch2,_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); 948 #if OSL_DEBUG_LEVEL < 2 949 if(UCBContentHelper::Exists(sInitFile)) 950 UCBContentHelper::Kill(sInitFile); 951 #endif 952 953 // install system tables 954 installSystemTables(_aInfo); 955 // now we have to make our SYSDBA user "NOT EXCLUSIVE" 956 { 957 String sExt; 958 sExt.AssignAscii(".sql"); 959 960 String sWorkUrl(m_sDbWorkURL); 961 ::utl::TempFile aInitFile(String::CreateFromAscii("Init"),&sExt,&sWorkUrl); 962 aInitFile.EnableKillingFile(); 963 { 964 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(aInitFile.GetURL(),STREAM_WRITE) ); 965 (*pFileStream) << "ALTER USER \"" 966 << ::rtl::OString(_aInfo.sSysUser,_aInfo.sSysUser.getLength(),gsl_getSystemTextEncoding()) 967 << "\" NOT EXCLUSIVE " 968 << sNewLine; 969 pFileStream->Flush(); 970 } 971 { // just to get sure that the tempfile still lives 972 sTemp.Erase(); 973 LocalFileHelper::ConvertURLToPhysicalName(aInitFile.GetURL(),sTemp); 974 LoadBatch(_aInfo.sDBName,_aInfo.sSysUser,_aInfo.sSysPassword,sTemp); 975 } 976 } 977 } 978 979 980 //------------------------------------------------------------------------------------------------- 981 int ODriver::X_PARAM(const ::rtl::OUString& _DBNAME, 982 const ::rtl::OUString& _USR, 983 const ::rtl::OUString& _PWD, 984 const ::rtl::OUString& _CMD) 985 { 986 // %XPARAM% -u %CONUSR%,%CONPWD% BINIT 987 String sCommandFile = generateInitFile(); 988 { 989 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 990 pFileStream->Seek(STREAM_SEEK_TO_END); 991 (*pFileStream) << "x_param" 992 #if defined(WNT) 993 << ".exe" 994 #endif 995 << " -d " 996 << ::rtl::OString(_DBNAME,_DBNAME.getLength(),gsl_getSystemTextEncoding()) 997 << " -u " 998 << ::rtl::OString(_USR,_USR.getLength(),gsl_getSystemTextEncoding()) 999 << "," 1000 << ::rtl::OString(_PWD,_PWD.getLength(),gsl_getSystemTextEncoding()) 1001 << " " 1002 << ::rtl::OString(_CMD,_CMD.getLength(),gsl_getSystemTextEncoding()) 1003 #if defined(WNT) 1004 #if (OSL_DEBUG_LEVEL > 1) || defined(DBG_UTIL) 1005 << " >> %DBWORK%\\create.log 2>&1" 1006 #endif 1007 #else 1008 #if (OSL_DEBUG_LEVEL > 1) || defined(DBG_UTIL) 1009 << " >> /tmp/kstart.log" 1010 #else 1011 << " > /dev/null" 1012 #endif 1013 #endif 1014 << " " 1015 << sNewLine 1016 << sNewLine; 1017 1018 pFileStream->Flush(); 1019 } 1020 1021 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1022 #if OSL_DEBUG_LEVEL > 0 1023 OProcess::TProcessError eError = 1024 #endif 1025 aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); 1026 OSL_ENSURE( eError == OProcess::E_None, "ODriver::X_PARAM: calling the executable failed!" ); 1027 #if OSL_DEBUG_LEVEL < 2 1028 if(UCBContentHelper::Exists(sCommandFile)) 1029 UCBContentHelper::Kill(sCommandFile); 1030 #endif 1031 1032 return 0; 1033 } 1034 // ----------------------------------------------------------------------------- 1035 sal_Int32 ODriver::CreateFiles(const TDatabaseStruct& _aInfo) 1036 { 1037 int nRet = CreateFile(_aInfo.sSysDevSpace,_aInfo.nDataSize/50) ? 0 : -9; 1038 if(!nRet) 1039 nRet = CreateFile(_aInfo.sTransLogName,_aInfo.nLogSize) ? 0 : -10; 1040 if(!nRet) 1041 nRet = CreateFile(_aInfo.sDataDevName,_aInfo.nDataSize) ? 0 : -11; 1042 1043 return nRet; 1044 1045 } 1046 // ----------------------------------------------------------------------------- 1047 void ODriver::PutParam(const ::rtl::OUString& sDBName, 1048 const ::rtl::OUString& rWhat, 1049 const ::rtl::OUString& rHow) 1050 { 1051 OArgumentList aArgs(3,&sDBName,&rWhat,&rHow); 1052 ::rtl::OUString sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("putparam")); 1053 #if defined(WNT) 1054 sCommand += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".exe")); 1055 #endif 1056 1057 OProcess aApp(sCommand,m_sDbWorkURL); 1058 #if OSL_DEBUG_LEVEL > 0 1059 OProcess::TProcessError eError = 1060 #endif 1061 aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS,aArgs ); 1062 OSL_ENSURE( eError == OProcess::E_None, "ODriver::PutParam: calling the executable failed!" ); 1063 } 1064 // ----------------------------------------------------------------------------- 1065 sal_Bool ODriver::CreateFile(const ::rtl::OUString &_FileName, 1066 sal_Int32 _nSize) 1067 { 1068 OSL_TRACE("CreateFile %d",_nSize); 1069 sal_Bool bOK = sal_True; 1070 try 1071 { 1072 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(_FileName,STREAM_WRITE)); 1073 if( !pFileStream.get()) 1074 { 1075 ::connectivity::SharedResources aResources; 1076 const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( 1077 STR_NO_DISK_SPACE, 1078 "$filename$",_FileName 1079 ) ); 1080 ::dbtools::throwGenericSQLException(sError,*this); 1081 } 1082 (*pFileStream).SetFiller('\0'); 1083 sal_Int32 nNewSize = 0; 1084 sal_Int32 nCount = _nSize /2; 1085 for(sal_Int32 i=0; bOK && i < nCount; ++i) 1086 { 1087 nNewSize += 8192;//4096; 1088 bOK = (*pFileStream).SetStreamSize(nNewSize); 1089 pFileStream->Flush(); 1090 } 1091 1092 bOK = bOK && static_cast<sal_Int32>(pFileStream->Seek(STREAM_SEEK_TO_END)) == nNewSize; 1093 } 1094 catch(Exception&) 1095 { 1096 OSL_TRACE("Exception"); 1097 } 1098 if(!bOK) 1099 { 1100 ::connectivity::SharedResources aResources; 1101 const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( 1102 STR_NO_DISK_SPACE, 1103 "$filename$",_FileName 1104 ) ); 1105 ::dbtools::throwGenericSQLException(sError,*this); 1106 } 1107 1108 return bOK; 1109 // dd if=/dev/zero bs=4k of=$DEV_NAME count=$2 1110 } 1111 // ----------------------------------------------------------------------------- 1112 int ODriver::X_START(const ::rtl::OUString& sDBName) 1113 { 1114 ::rtl::OUString sCommand; 1115 #if defined(WNT) 1116 1117 ::rtl::OUString sArg1 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-d")); 1118 ::rtl::OUString sArg3 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-NoDBService")); 1119 ::rtl::OUString sArg4 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-NoDBWindow")); 1120 1121 OArgumentList aArgs(4,&sArg1,&sDBName,&sArg3,&sArg4); 1122 sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("strt.exe")); 1123 #else 1124 OArgumentList aArgs(1,&sDBName); 1125 sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_start")); 1126 #endif 1127 1128 OProcess aApp( sCommand ,m_sDbWorkURL); 1129 OProcess::TProcessError eError = aApp.execute((OProcess::TProcessOption)OPROCESS_ADABAS,aArgs); 1130 1131 if(eError == OProcess::E_NotFound) 1132 { 1133 ::connectivity::SharedResources aResources; 1134 const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( 1135 STR_COMMAND_NOT_FOUND, 1136 "$databasename$",sDBName, 1137 "$progname$",sCommand 1138 ) ); 1139 ::dbtools::throwGenericSQLException(sError,*this); 1140 } 1141 OSL_ASSERT(eError == OProcess::E_None); 1142 1143 OProcess::TProcessInfo aInfo; 1144 if(aApp.getInfo(OProcess::TData_ExitCode,&aInfo) == OProcess::E_None && aInfo.Code) 1145 return aInfo.Code; 1146 1147 return 0; 1148 } 1149 // ----------------------------------------------------------------------------- 1150 int ODriver::X_STOP(const ::rtl::OUString& sDBName) 1151 { 1152 ::rtl::OUString sCommand; 1153 #if defined(WNT) 1154 1155 ::rtl::OUString sArg1 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-d")); 1156 ::rtl::OUString sArg2 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-NoDBService")); 1157 1158 OArgumentList aArgs(3,&sArg1,&sDBName,&sArg2); 1159 sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("stp.exe")); 1160 #else 1161 OArgumentList aArgs(1,&sDBName); 1162 sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_stop")); 1163 #endif 1164 OProcess aApp( sCommand ,m_sDbWorkURL); 1165 1166 OProcess::TProcessError eError = aApp.execute((OProcess::TProcessOption)OPROCESS_ADABAS,aArgs); 1167 1168 1169 OSL_ASSERT(eError == OProcess::E_None); 1170 if(eError != OProcess::E_None) 1171 return 1; 1172 OProcess::TProcessInfo aInfo; 1173 if(aApp.getInfo(OProcess::TData_ExitCode,&aInfo) == OProcess::E_None && aInfo.Code) 1174 return aInfo.Code; 1175 1176 return 0; 1177 } 1178 // ----------------------------------------------------------------------------- 1179 void ODriver::XUTIL(const ::rtl::OUString& _rParam, 1180 const ::rtl::OUString& _DBNAME, 1181 const ::rtl::OUString& _USRNAME, 1182 const ::rtl::OUString& _USRPWD) 1183 { 1184 String sWorkUrl(m_sDbWorkURL); 1185 String sExt = String::CreateFromAscii(".log"); 1186 ::utl::TempFile aCmdFile(String::CreateFromAscii("xutil"),&sExt,&sWorkUrl); 1187 aCmdFile.EnableKillingFile(); 1188 1189 String sPhysicalPath; 1190 LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); 1191 1192 String sCommandFile = generateInitFile(); 1193 1194 { 1195 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 1196 pFileStream->Seek(STREAM_SEEK_TO_END); 1197 (*pFileStream) << 1198 #if defined(WNT) 1199 "xutil.exe" 1200 #else 1201 "utility" 1202 #endif 1203 << " -u " 1204 << ::rtl::OString(_USRNAME,_USRNAME.getLength(),gsl_getSystemTextEncoding()) 1205 << "," 1206 << ::rtl::OString(_USRPWD,_USRPWD.getLength(),gsl_getSystemTextEncoding()) 1207 << " -d " 1208 << ::rtl::OString(_DBNAME,_DBNAME.getLength(),gsl_getSystemTextEncoding()) 1209 << " " 1210 << ::rtl::OString(_rParam,_rParam.getLength(),gsl_getSystemTextEncoding()) 1211 << " > " 1212 << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) 1213 << " 2>&1" 1214 << sNewLine; 1215 pFileStream->Flush(); 1216 } 1217 1218 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1219 #if OSL_DEBUG_LEVEL > 0 1220 OProcess::TProcessError eError = 1221 #endif 1222 aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); 1223 OSL_ENSURE( eError == OProcess::E_None, "ODriver::XUTIL: calling the executable failed!" ); 1224 #if OSL_DEBUG_LEVEL < 2 1225 if(UCBContentHelper::Exists(sCommandFile)) 1226 UCBContentHelper::Kill(sCommandFile); 1227 #endif 1228 } 1229 // ----------------------------------------------------------------------------- 1230 void ODriver::LoadBatch(const ::rtl::OUString& sDBName, 1231 const ::rtl::OUString& _rUSR, 1232 const ::rtl::OUString& _rPWD, 1233 const ::rtl::OUString& _rBatch) 1234 { 1235 OSL_ENSURE(_rBatch.getLength(),"No batch file given!"); 1236 String sWorkUrl(m_sDbWorkURL); 1237 String sExt = String::CreateFromAscii(".log"); 1238 ::utl::TempFile aCmdFile(String::CreateFromAscii("LoadBatch"),&sExt,&sWorkUrl); 1239 #if OSL_DEBUG_LEVEL < 2 1240 aCmdFile.EnableKillingFile(); 1241 #endif 1242 1243 String sPhysicalPath; 1244 LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); 1245 1246 String sCommandFile = generateInitFile(); 1247 { 1248 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 1249 pFileStream->Seek(STREAM_SEEK_TO_END); 1250 (*pFileStream) << "xload" 1251 #if defined(WNT) 1252 << ".exe" 1253 #endif 1254 << " -d " 1255 << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) 1256 << " -u " 1257 << ::rtl::OString(_rUSR,_rUSR.getLength(),gsl_getSystemTextEncoding()) 1258 << "," 1259 << ::rtl::OString(_rPWD,_rPWD.getLength(),gsl_getSystemTextEncoding()); 1260 1261 if ( !isKernelVersion(CURRENT_DB_VERSION) ) 1262 (*pFileStream) << " -S adabas -b "; 1263 else 1264 (*pFileStream) << " -S NATIVE -b "; 1265 1266 (*pFileStream) << ::rtl::OString(_rBatch,_rBatch.getLength(),gsl_getSystemTextEncoding()) 1267 << " > " 1268 << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) 1269 << " 2>&1" 1270 << sNewLine; 1271 1272 pFileStream->Flush(); 1273 } 1274 1275 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1276 #if OSL_DEBUG_LEVEL > 0 1277 OProcess::TProcessError eError = 1278 #endif 1279 aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); 1280 OSL_ENSURE( eError == OProcess::E_None, "ODriver::LoadBatch: calling the executable failed!" ); 1281 #if OSL_DEBUG_LEVEL < 2 1282 if(UCBContentHelper::Exists(sCommandFile)) 1283 UCBContentHelper::Kill(sCommandFile); 1284 #endif 1285 } 1286 // ----------------------------------------------------------------------------- 1287 void ODriver::fillEnvironmentVariables() 1288 { 1289 // read the environment vars 1290 struct env_data 1291 { 1292 const sal_Char* pAsciiEnvName; 1293 ::rtl::OUString* pValue; 1294 ::rtl::OUString* pValueURL; 1295 } EnvData[] = { 1296 { "DBWORK", &m_sDbWork, &m_sDbWorkURL }, 1297 { "DBCONFIG", &m_sDbConfig, &m_sDbConfigURL }, 1298 { "DBROOT", &m_sDbRoot, &m_sDbRootURL } 1299 }; 1300 1301 for ( size_t i = 0; i < sizeof( EnvData ) / sizeof( EnvData[0] ); ++i ) 1302 { 1303 ::rtl::OUString sVarName = ::rtl::OUString::createFromAscii( EnvData[i].pAsciiEnvName ); 1304 ::rtl::OUString sEnvValue; 1305 if(osl_getEnvironment( sVarName.pData, &sEnvValue.pData ) == osl_Process_E_None ) 1306 { 1307 *EnvData[i].pValue = sEnvValue; 1308 String sURL; 1309 LocalFileHelper::ConvertPhysicalNameToURL( *EnvData[i].pValue, sURL ); 1310 *EnvData[i].pValueURL = sURL; 1311 } 1312 } 1313 1314 m_sDelimit = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); 1315 } 1316 // ----------------------------------------------------------------------------- 1317 ::rtl::OUString ODriver::generateInitFile() const 1318 { 1319 String sExt; 1320 #if !defined(WNT) 1321 sExt = String::CreateFromAscii(".sh"); 1322 #else 1323 sExt = String::CreateFromAscii(".bat"); 1324 #endif 1325 1326 String sWorkUrl(m_sDbWorkURL); 1327 ::utl::TempFile aCmdFile(String::CreateFromAscii("Init"),&sExt,&sWorkUrl); 1328 #if !defined(WNT) 1329 String sPhysicalPath; 1330 LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); 1331 chmod(ByteString(sPhysicalPath,gsl_getSystemTextEncoding()).GetBuffer(),S_IRUSR|S_IWUSR|S_IXUSR); 1332 #endif 1333 1334 #if !defined(WNT) 1335 SvStream* pFileStream = aCmdFile.GetStream(STREAM_WRITE); 1336 (*pFileStream) << "#!/bin/sh" 1337 << sNewLine 1338 << "cd \"$DBWORK\"" 1339 << sNewLine 1340 << sNewLine; 1341 pFileStream->Flush(); 1342 #endif 1343 1344 return aCmdFile.GetURL(); 1345 } 1346 // ----------------------------------------------------------------------------- 1347 ::rtl::OUString ODriver::getDatabaseInitFile( const TDatabaseStruct& _aDBInfo) 1348 { 1349 String sExt; 1350 sExt.AssignAscii(".ins"); 1351 1352 1353 String sWorkUrl(m_sDbWorkURL); 1354 ::utl::TempFile aInitFile(String::CreateFromAscii("Init"),&sExt,&sWorkUrl); 1355 { 1356 SvStream* pFileStream = aInitFile.GetStream(STREAM_WRITE); 1357 (*pFileStream) << "* @(#)init.cmd 6.1.1 1994-11-10\n"; 1358 (*pFileStream) << "init config\n"; 1359 (*pFileStream) << "* default code:\n"; 1360 (*pFileStream) << "ascii\n"; 1361 (*pFileStream) << "* date time format\n"; 1362 (*pFileStream) << "internal\n"; 1363 (*pFileStream) << "* command timeout:\n"; 1364 (*pFileStream) << "900\n"; 1365 (*pFileStream) << "* lock timeout:\n"; 1366 (*pFileStream) << "360\n"; 1367 (*pFileStream) << "* request timeout:\n"; 1368 (*pFileStream) << "180\n"; 1369 (*pFileStream) << "* log mode:\n"; 1370 (*pFileStream) << "demo\n"; 1371 (*pFileStream) << "* log segment size:\n"; 1372 (*pFileStream) << "0\n"; 1373 (*pFileStream) << "* no of archive logs:\n"; 1374 (*pFileStream) << "0\n"; 1375 (*pFileStream) << "* no of data devspaces:\n"; 1376 (*pFileStream) << "1\n"; 1377 (*pFileStream) << "* mirror devspaces:\n"; 1378 (*pFileStream) << "n\n"; 1379 (*pFileStream) << "if $rc <> 0 then stop\n"; 1380 (*pFileStream) << "*--- device description ---\n"; 1381 (*pFileStream) << "* sys devspace name:\n"; 1382 { 1383 String sTemp; 1384 LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sSysDevSpace,sTemp); 1385 (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); 1386 } 1387 (*pFileStream) << "\n* log devspace size:\n"; 1388 (*pFileStream) << ::rtl::OString::valueOf(_aDBInfo.nLogSize); 1389 (*pFileStream) << "\n* log devspace name:\n"; 1390 { 1391 String sTemp; 1392 LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sTransLogName,sTemp); 1393 (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); 1394 } 1395 (*pFileStream) << "\n* data devspace size:\n"; 1396 (*pFileStream) << ::rtl::OString::valueOf(_aDBInfo.nDataSize); 1397 (*pFileStream) << "\n* data devspace name:\n"; 1398 { 1399 String sTemp; 1400 LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sDataDevName,sTemp); 1401 (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); 1402 } 1403 1404 (*pFileStream) << "\n* END INIT CONFIG\n"; 1405 (*pFileStream) << "if $rc <> 0 then stop\n"; 1406 if(_aDBInfo.bRestoreDatabase) 1407 { 1408 (*pFileStream) << "RESTORE DATA QUICK FROM '"; 1409 { 1410 String sTemp; 1411 LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sBackupFile,sTemp); 1412 (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); 1413 } 1414 (*pFileStream) << "' BLOCKSIZE 8\n"; 1415 (*pFileStream) << "if $rc <> 0 then stop\n"; 1416 (*pFileStream) << "RESTART\n"; 1417 1418 } 1419 else 1420 { 1421 (*pFileStream) << "ACTIVATE SERVERDB SYSDBA \""; 1422 (*pFileStream) << ::rtl::OString(_aDBInfo.sSysUser,_aDBInfo.sSysUser.getLength(),gsl_getSystemTextEncoding()); 1423 (*pFileStream) << "\" PASSWORD \""; 1424 (*pFileStream) << ::rtl::OString(_aDBInfo.sSysPassword,_aDBInfo.sSysPassword.getLength(),gsl_getSystemTextEncoding()); 1425 (*pFileStream) << "\"\n"; 1426 } 1427 (*pFileStream) << "if $rc <> 0 then stop\n"; 1428 (*pFileStream) << "exit\n"; 1429 } 1430 return aInitFile.GetURL(); 1431 } 1432 // ----------------------------------------------------------------------------- 1433 void ODriver::X_CONS(const ::rtl::OUString& sDBName,const ::rtl::OString& _ACTION,const ::rtl::OUString& _FILENAME) 1434 { 1435 String sPhysicalPath; 1436 LocalFileHelper::ConvertURLToPhysicalName(_FILENAME,sPhysicalPath); 1437 1438 String sCommandFile = generateInitFile(); 1439 { 1440 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 1441 pFileStream->Seek(STREAM_SEEK_TO_END); 1442 1443 (*pFileStream) << "x_cons" 1444 #if defined(WNT) 1445 << ".exe" 1446 #endif 1447 << " " 1448 << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) 1449 << " SHOW " 1450 << _ACTION 1451 << " > " 1452 << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) 1453 << sNewLine; 1454 pFileStream->Flush(); 1455 } 1456 1457 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1458 aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); 1459 #if OSL_DEBUG_LEVEL < 2 1460 if(UCBContentHelper::Exists(sCommandFile)) 1461 UCBContentHelper::Kill(sCommandFile); 1462 #endif 1463 } 1464 // ----------------------------------------------------------------------------- 1465 void ODriver::checkAndRestart(const ::rtl::OUString& sDBName,const TDatabaseStruct& _rDbInfo) 1466 { 1467 String sWorkUrl(m_sDbWorkURL); 1468 String sExt = String::CreateFromAscii(".st"); 1469 ::utl::TempFile aCmdFile(String::CreateFromAscii("State"),&sExt,&sWorkUrl); 1470 aCmdFile.EnableKillingFile(); 1471 1472 X_CONS(sDBName,"STATE",aCmdFile.GetURL()); 1473 SvStream* pFileStream = aCmdFile.GetStream(STREAM_SHARE_DENYALL); 1474 if ( pFileStream ) 1475 { 1476 ByteString sStateLine; 1477 sal_Bool bRead = sal_True; 1478 sal_Int32 nStart = 2; 1479 while(bRead && !pFileStream->IsEof()) 1480 { 1481 String aLine; 1482 bRead = pFileStream->ReadLine(sStateLine); 1483 if(bRead) 1484 { 1485 if(sStateLine.Search("WARM") != STRING_NOTFOUND) 1486 { // nothing to do 1487 nStart = 0; 1488 break; 1489 } 1490 else if(sStateLine.Search("COLD") != STRING_NOTFOUND) 1491 { 1492 nStart = 1; 1493 break; 1494 } 1495 } 1496 } 1497 switch(nStart) 1498 { 1499 case 2: 1500 clearDatabase(sDBName); 1501 X_START(sDBName); 1502 // don't break here 1503 case 1: 1504 XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RESTART")),sDBName,_rDbInfo.sControlUser,_rDbInfo.sControlPassword); 1505 case 0: 1506 break; 1507 } 1508 } 1509 } 1510 // ----------------------------------------------------------------------------- 1511 sal_Bool ODriver::isVersion(const ::rtl::OUString& sDBName, const char* _pVersion) 1512 { 1513 String sWorkUrl(m_sDbWorkURL); 1514 String sExt = String::CreateFromAscii(".st"); 1515 ::utl::TempFile aCmdFile(String::CreateFromAscii("DevSpaces"),&sExt,&sWorkUrl); 1516 aCmdFile.EnableKillingFile(); 1517 1518 String sPhysicalPath; 1519 LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); 1520 1521 String sCommandFile = generateInitFile(); 1522 { 1523 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 1524 pFileStream->Seek(STREAM_SEEK_TO_END); 1525 1526 (*pFileStream) << "getparam" 1527 #if defined(WNT) 1528 << ".exe" 1529 #endif 1530 << " " 1531 << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) 1532 << " KERNELVERSION > " 1533 << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) 1534 << sNewLine; 1535 } 1536 1537 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1538 aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS); 1539 #if OSL_DEBUG_LEVEL < 2 1540 if(UCBContentHelper::Exists(sCommandFile)) 1541 UCBContentHelper::Kill(sCommandFile); 1542 #endif 1543 SvStream* pFileStream = aCmdFile.GetStream(STREAM_STD_READWRITE); 1544 ByteString sStateLine; 1545 sal_Bool bRead = sal_True; 1546 sal_Bool bIsVersion = sal_False; 1547 while ( pFileStream && bRead && !pFileStream->IsEof() ) 1548 { 1549 bRead = pFileStream->ReadLine(sStateLine); 1550 if ( bRead ) 1551 { 1552 bIsVersion = sStateLine.GetToken(1,' ').Equals(_pVersion) != 0; 1553 break; 1554 } 1555 } 1556 return bIsVersion; 1557 } 1558 // ----------------------------------------------------------------------------- 1559 void ODriver::checkAndInsertNewDevSpace(const ::rtl::OUString& sDBName, 1560 const TDatabaseStruct& _rDBInfo) 1561 { 1562 // %DBROOT%\pgm\getparam %2 DATA_CACHE_PAGES > %3 1563 String sWorkUrl(m_sDbWorkURL); 1564 String sExt = String::CreateFromAscii(".st"); 1565 ::utl::TempFile aCmdFile(String::CreateFromAscii("DevSpaces"),&sExt,&sWorkUrl); 1566 aCmdFile.EnableKillingFile(); 1567 1568 String sPhysicalPath; 1569 LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); 1570 1571 String sCommandFile = generateInitFile(); 1572 { 1573 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 1574 pFileStream->Seek(STREAM_SEEK_TO_END); 1575 1576 (*pFileStream) << "getparam" 1577 #if defined(WNT) 1578 << ".exe" 1579 #endif 1580 << " " 1581 << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) 1582 << " DATA_CACHE_PAGES > " 1583 << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) 1584 << sNewLine; 1585 } 1586 1587 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1588 aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS); 1589 #if OSL_DEBUG_LEVEL < 2 1590 if(UCBContentHelper::Exists(sCommandFile)) 1591 UCBContentHelper::Kill(sCommandFile); 1592 #endif 1593 SvStream* pFileStream = aCmdFile.GetStream(STREAM_STD_READWRITE); 1594 ByteString sStateLine; 1595 sal_Bool bRead = sal_True; 1596 sal_Int32 nDataPages = 0; 1597 while(pFileStream && bRead && !pFileStream->IsEof()) 1598 { 1599 bRead = pFileStream->ReadLine(sStateLine); 1600 if(bRead) 1601 { 1602 nDataPages = sStateLine.ToInt32(); 1603 if(nDataPages && nDataPages < 100) 1604 { 1605 // the space isn't big enough anymore so we increment it 1606 PutParam(sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATA_CACHE_PAGES")),::rtl::OUString::valueOf(nDataPages)); 1607 X_PARAM(sDBName,_rDBInfo.sControlUser,_rDBInfo.sControlPassword,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BCHECK"))); 1608 } 1609 } 1610 } 1611 } 1612 // ----------------------------------------------------------------------------- 1613 sal_Bool ODriver::isKernelVersion(const char* _pVersion) 1614 { 1615 ::utl::TempFile aCmdFile(String::CreateFromAscii("KernelVersion")); 1616 aCmdFile.EnableKillingFile(); 1617 1618 String sPhysicalPath; 1619 LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); 1620 1621 String sCommandFile = generateInitFile(); 1622 { 1623 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 1624 pFileStream->Seek(STREAM_SEEK_TO_END); 1625 1626 (*pFileStream) << "dbversion" 1627 << " > " 1628 << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) 1629 << sNewLine; 1630 } 1631 1632 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1633 aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS); 1634 #if OSL_DEBUG_LEVEL < 2 1635 if(UCBContentHelper::Exists(sCommandFile)) 1636 UCBContentHelper::Kill(sCommandFile); 1637 #endif 1638 SvStream* pFileStream = aCmdFile.GetStream(STREAM_STD_READWRITE); 1639 ByteString sStateLine; 1640 sal_Bool bRead = sal_True; 1641 sal_Bool bIsVersion = sal_True; 1642 while ( pFileStream && bRead && !pFileStream->IsEof() ) 1643 { 1644 bRead = pFileStream->ReadLine(sStateLine); 1645 if ( bRead ) 1646 { 1647 // convert a 11.02.00 to a 12.01.30 version 1648 bIsVersion = sStateLine.GetToken(0).Equals(_pVersion) != 0; 1649 break; 1650 } 1651 } 1652 return bIsVersion; 1653 } 1654 // ----------------------------------------------------------------------------- 1655 void ODriver::installSystemTables( const TDatabaseStruct& _aInfo) 1656 { 1657 #if defined(WNT) 1658 // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% -b %m_sDbRoot%\env\TERMCHAR.ind 1659 ::rtl::OUString aBatch = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-b ")); 1660 ::rtl::OUString sTemp2 = m_sDbRootURL + m_sDelimit 1661 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) 1662 + m_sDelimit 1663 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TERMCHAR.ind")); 1664 String sTemp; 1665 sal_Bool bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); 1666 aBatch += sTemp; 1667 1668 XUTIL(aBatch,_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); 1669 1670 // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% DIAGNOSE TRIGGER OFF 1671 XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DIAGNOSE TRIGGER OFF")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); 1672 // xload -d %_DBNAME% -u %_SYSDBA_USER%,%_SYSDBA_PWD% -S NATIVE -b %m_sDbRoot%\env\DBS.ins %_DOMAINPWD% 1673 { 1674 sTemp2 = m_sDbRootURL 1675 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) 1676 + m_sDelimit 1677 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DBS.ins")); 1678 sTemp.Erase(); 1679 bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); 1680 OSL_ENSURE(bOk,"File could be converted into file system path!"); 1681 sTemp.AppendAscii(" "); 1682 sTemp += String(_aInfo.sDomainPassword); 1683 1684 LoadBatch(_aInfo.sDBName,_aInfo.sSysUser,_aInfo.sSysPassword,sTemp); 1685 } 1686 // xload -d %_DBNAME% -u DOMAIN,%_DOMAINPWD% -S NATIVE -b %m_sDbRoot%\env\XDD.ins 1687 { 1688 sTemp2 = m_sDbRootURL 1689 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) 1690 + m_sDelimit 1691 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("XDD.ins")); 1692 sTemp.Erase(); 1693 bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); 1694 OSL_ENSURE(bOk,"File could be converted into file system path!"); 1695 1696 LoadBatch(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOMAIN")),_aInfo.sDomainPassword,sTemp); 1697 } 1698 // xload -d %_DBNAME% -u %_SYSDBA_USER%,%_SYSDBA_PWD% -S NATIVE -b %m_sDbRoot%\env\QP.ins 1699 { 1700 sTemp2 = m_sDbRootURL 1701 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) 1702 + m_sDelimit 1703 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("QP.ins")); 1704 sTemp.Erase(); 1705 bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); 1706 OSL_ENSURE(bOk,"File could be converted into file system path!"); 1707 LoadBatch(_aInfo.sDBName,_aInfo.sSysUser,_aInfo.sSysPassword,sTemp); 1708 } 1709 // xload -d %_DBNAME% -u DOMAIN,%_DOMAINPWD% -S NATIVE -b %m_sDbRoot%\env\SPROC.ins 1710 { 1711 sTemp2 = m_sDbRootURL 1712 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) 1713 + m_sDelimit 1714 + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SPROC.ins")); 1715 sTemp.Erase(); 1716 bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); 1717 OSL_ENSURE(bOk,"File could be converted into file system path!"); 1718 1719 LoadBatch(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOMAIN")),_aInfo.sDomainPassword,sTemp); 1720 } 1721 1722 // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% DIAGNOSE TRIGGER ON 1723 XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DIAGNOSE TRIGGER ON")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); 1724 // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% SET NOLOG OFF 1725 XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SET NOLOG OFF")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); 1726 // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% SHUTDOWN QUICK 1727 XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SHUTDOWN QUICK")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); 1728 // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% RESTART 1729 XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RESTART")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); 1730 1731 #else // UNX 1732 String sCommandFile = generateInitFile(); 1733 { 1734 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); 1735 pFileStream->Seek(STREAM_SEEK_TO_END); 1736 (*pFileStream) << "x_dbinst" 1737 << " -d " 1738 << ::rtl::OString(_aInfo.sDBName,_aInfo.sDBName.getLength(),gsl_getSystemTextEncoding()) 1739 << " -u " 1740 << ::rtl::OString(_aInfo.sSysUser,_aInfo.sSysUser.getLength(),gsl_getSystemTextEncoding()) 1741 << "," 1742 << ::rtl::OString(_aInfo.sSysPassword,_aInfo.sSysPassword.getLength(),gsl_getSystemTextEncoding()) 1743 << " -w " 1744 << ::rtl::OString(_aInfo.sDomainPassword,_aInfo.sDomainPassword.getLength(),gsl_getSystemTextEncoding()) 1745 << " -b "; 1746 1747 if ( isKernelVersion(ADABAS_KERNEL_11) ) 1748 (*pFileStream) << "-i all"; 1749 (*pFileStream) 1750 #if (OSL_DEBUG_LEVEL > 1) || defined(DBG_UTIL) 1751 << " >> /tmp/kstart.log" 1752 #else 1753 << " > /dev/null" 1754 #endif 1755 << sNewLine 1756 << sNewLine; 1757 pFileStream->Flush(); 1758 } 1759 // now execute the command 1760 OProcess aApp(sCommandFile ,m_sDbWorkURL); 1761 aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); 1762 #if OSL_DEBUG_LEVEL < 2 1763 if(UCBContentHelper::Exists(sCommandFile)) 1764 UCBContentHelper::Kill(sCommandFile); 1765 #endif 1766 1767 #endif //WNT,UNX 1768 } 1769 // ----------------------------------------------------------------------------- 1770 void ODriver::convertOldVersion(const ::rtl::OUString& sDBName,const TDatabaseStruct& _rDbInfo) 1771 { 1772 // first we have to check if this databse is a old version and we have to update the system tables 1773 if ( !isVersion(sDBName,CURRENT_DB_VERSION) && isKernelVersion(CURRENT_DB_VERSION) ) 1774 { 1775 if ( !_rDbInfo.sControlUser.getLength() 1776 || !_rDbInfo.sControlPassword.getLength()) 1777 { 1778 ::connectivity::SharedResources aResources; 1779 const ::rtl::OUString sError( aResources.getResourceString(STR_DATABASE_NEEDS_CONVERTING) ); 1780 ::dbtools::throwGenericSQLException(sError,*this); 1781 } 1782 String sCommandFile = m_sDbWorkURL; 1783 sCommandFile += String::CreateFromAscii("/xparam.prt"); 1784 if ( UCBContentHelper::Exists(sCommandFile) ) 1785 UCBContentHelper::Kill(sCommandFile); 1786 X_PARAM(sDBName,_rDbInfo.sControlUser,_rDbInfo.sControlPassword,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BCHECK"))); 1787 1788 if ( UCBContentHelper::Exists(sCommandFile) ) 1789 { 1790 { 1791 ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READ) ); 1792 ByteString sStateLine; 1793 sal_Bool bRead = sal_True; 1794 static ByteString s_ErrorId("-21100"); 1795 while ( pFileStream.get() && bRead && !pFileStream->IsEof() ) 1796 { 1797 bRead = pFileStream->ReadLine(sStateLine); 1798 if ( bRead && s_ErrorId == sStateLine.GetToken(0,' ') ) 1799 { 1800 UCBContentHelper::Kill(sCommandFile); 1801 ::rtl::OUString sError(::rtl::OUString::createFromAscii(sStateLine.GetBuffer())); 1802 throw SQLException(sError,*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")),1000,Any()); 1803 } 1804 } 1805 } 1806 1807 UCBContentHelper::Kill(sCommandFile); 1808 } 1809 } 1810 } 1811 // ----------------------------------------------------------------------------- 1812 // ----------------------------------------------------------------------------- 1813 } // namespace adabas 1814 }// namespace connectivity 1815 // ----------------------------------------------------------------------------- 1816 1817 1818 1819 1820