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