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