User: obo Date: 2008-02-26 15:25:45+0000 Modified: dba/connectivity/source/drivers/adabas/BDriver.cxx
Log: INTEGRATION: CWS eoladabas_DEV300 (1.22.196); FILE MERGED 2008/01/23 13:33:52 oj 1.22.196.1: #149980# add adabas creation File Changes: Directory: /dba/connectivity/source/drivers/adabas/ =================================================== File [changed]: BDriver.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/adabas/BDriver.cxx?r1=1.22&r2=1.23 Delta lines: +1274 -8 ---------------------- --- BDriver.cxx 2006-09-17 02:06:06+0000 1.22 +++ BDriver.cxx 2008-02-26 15:25:42+0000 1.23 @@ -35,6 +35,9 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" +#ifndef _UNOTOOLS_TEMPFILE_HXX +#include <unotools/tempfile.hxx> +#endif #ifndef _CONNECTIVITY_ADABAS_BDRIVER_HXX_ #include "adabas/BDriver.hxx" #endif @@ -50,12 +53,49 @@ #ifndef _CONNECTIVITY_OTOOLS_HXX_ #include "odbc/OTools.hxx" #endif -#ifndef _DBHELPER_DBEXCEPTION_HXX_ #include "connectivity/dbexception.hxx" -#endif +#include "TConnection.hxx" + #ifndef CONNECTIVITY_DIAGNOSE_EX_H #include "diagnose_ex.h" #endif +#ifndef _VOS_PROCESS_HXX_ +#include <vos/process.hxx> +#endif +#ifndef _OSL_PROCESS_H_ +#include <osl/process.h> +#endif + +#ifndef _UNOTOOLS_UCBHELPER_HXX +#include <unotools/ucbhelper.hxx> +#endif +#ifndef _UNTOOLS_UCBSTREAMHELPER_HXX +#include <unotools/ucbstreamhelper.hxx> +#endif +#ifndef _UNOTOOLS_LOCALFILEHELPER_HXX +#include <unotools/localfilehelper.hxx> +#endif + +#include <memory> +#include <sys/stat.h> + +#if defined(MAC) +const char sNewLine = '\015'; +#elif defined(UNX) +const char sNewLine = '\012'; +#else +const char sNewLine[] = "\015\012"; // \015\012 and not \n +#endif +#define ADABAS_DB_11 "11.02.00" +#define ADABAS_KERNEL_11 "11.02" +#define ADABAS_DB_12 "12.01.00" +#define ADABAS_KERNEL_12 "12.01" +#define CURRENT_DB_VERSION "13.01.00" +#define CURRENT_KERNEL_VERSION "13.01" + +#define OPROCESS_ADABAS (OProcess::TOption_Hidden | OProcess::TOption_Wait | OProcess::TOption_SearchPath) +#define OPROCESS_ADABAS_DBG (OProcess::TOption_Wait | OProcess::TOption_SearchPath) + using namespace connectivity; namespace connectivity @@ -131,19 +171,109 @@ using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; +using namespace utl; +using namespace osl; +using namespace vos; +using namespace ::dbtools; sal_Bool LoadFunctions(oslModule pODBCso); sal_Bool LoadLibrary_ADABAS(::rtl::OUString &_rPath); + // -------------------------------------------------------------------------------- +void ODriver::fillInfo(const Sequence< PropertyValue >& info, TDatabaseStruct& _rDBInfo) +{ + const PropertyValue* pIter = info.getConstArray(); + const PropertyValue* pEnd = pIter + info.getLength(); + for(;pIter != pEnd;++pIter) + { + if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DatabaseName")))) + { + pIter->Value >>= _rDBInfo.sDBName; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlUser")))) + { + pIter->Value >>= _rDBInfo.sControlUser; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlPassword")))) + { + pIter->Value >>= _rDBInfo.sControlPassword; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataCacheSizeIncrement")))) + pIter->Value >>= _rDBInfo.nDataIncrement; + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShutdownDatabase")))) + pIter->Value >>= _rDBInfo.bShutDown; + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("User")))) + { + pIter->Value >>= _rDBInfo.sSysUser; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Password")))) + { + pIter->Value >>= _rDBInfo.sSysPassword; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DomainPassword")))) + { + pIter->Value >>= _rDBInfo.sDomainPassword; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CacheSize")))) + { + pIter->Value >>= _rDBInfo.sCacheSize; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RestoreDatabase")))) + { + pIter->Value >>= _rDBInfo.bRestoreDatabase; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Backup")))) + { + pIter->Value >>= _rDBInfo.sBackupFile; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataDevSpace")))) + { + pIter->Value >>= _rDBInfo.sDataDevName; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SYSDEVSPACE")))) + { + pIter->Value >>= _rDBInfo.sSysDevSpace; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TRANSACTION_LOG")))) + { + pIter->Value >>= _rDBInfo.sTransLogName; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataDevSize")))) + { + pIter->Value >>= _rDBInfo.nDataSize; + } + else if(pIter->Name.equalsIgnoreAsciiCase(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LogDevSize")))) + { + pIter->Value >>= _rDBInfo.nLogSize; + } + } +} + // -------------------------------------------------------------------------------- ODriver::ODriver(const Reference< XMultiServiceFactory >& _rxFactory) : ODBCDriver(_rxFactory) { + osl_incrementInterlockedCount(&m_refCount); + fillEnvironmentVariables(); + Reference< XComponent > xComponent(m_xORB, UNO_QUERY); + if (xComponent.is()) + { + Reference< ::com::sun::star::lang::XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY); + xComponent->addEventListener(xEvtL); + } + osl_decrementInterlockedCount(&m_refCount); } //------------------------------------------------------------------------------ void ODriver::disposing() { ::osl::MutexGuard aGuard(m_aMutex); ODriver_BASE::disposing(); + Reference< XComponent > xComponent(m_xORB, UNO_QUERY); + if (xComponent.is()) + { + Reference< XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY); + xComponent->removeEventListener(xEvtL); + } + m_xORB.clear(); } // static ServiceInfo @@ -169,7 +299,7 @@ //------------------------------------------------------------------ sal_Bool SAL_CALL ODriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException) { - Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); + const Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); const ::rtl::OUString* pSupported = aSupported.getConstArray(); const ::rtl::OUString* pEnd = pSupported + aSupported.getLength(); for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported) @@ -186,19 +316,78 @@ Any SAL_CALL ODriver::queryInterface( const Type & rType ) throw(RuntimeException) { Any aRet = ::cppu::queryInterface(rType, static_cast<XDataDefinitionSupplier*>(this)); - return aRet.hasValue() ? aRet : ODriver_BASE::queryInterface(rType); + if ( !aRet.hasValue() ) + aRet = ODriver_BASE::queryInterface(rType); + return aRet.hasValue() ? aRet : ODriver_BASE2::queryInterface(rType); } //------------------------------------------------------------------ Reference< XInterface > SAL_CALL ODriver_CreateInstance(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFac) throw( Exception ) { return *(new ODriver(_rxFac)); } +// ----------------------------------------------------------------------------- +void SAL_CALL ODriver::disposing( const EventObject& Source ) throw(RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + if(m_xORB.is() && Reference< XMultiServiceFactory >(Source.Source,UNO_QUERY) == m_xORB) + { + TDatabaseMap::iterator aIter = m_aDatabaseMap.begin(); + for(;aIter != m_aDatabaseMap.end();++aIter) + { + if(aIter->second.bShutDown) + { + ::rtl::OUString sName; + if(getDBName(aIter->first,sName)) + { + XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SHUTDOWN QUICK")),sName,aIter->second.sControlUser,aIter->second.sControlPassword); + X_STOP(sName); + } + } + } + m_xORB = NULL; + } +} // -------------------------------------------------------------------------------- Reference< XConnection > SAL_CALL ODriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException) { if ( ! acceptsURL(url) ) return NULL; + ::osl::MutexGuard aGuard( m_aMutex ); + if (ODriver_BASE::rBHelper.bDisposed) + throw DisposedException(); + + TDatabaseStruct aDBInfo; + aDBInfo.bShutDown = sal_False; + fillInfo(info,aDBInfo); + aDBInfo.sControlUser = aDBInfo.sControlUser.toAsciiUpperCase(); + aDBInfo.sControlPassword = aDBInfo.sControlPassword.toAsciiUpperCase(); + aDBInfo.sSysUser = aDBInfo.sSysUser.toAsciiUpperCase(); + aDBInfo.sSysPassword = aDBInfo.sSysPassword.toAsciiUpperCase(); + + + TDatabaseMap::iterator aFind = m_aDatabaseMap.find(url); + if(aFind == m_aDatabaseMap.end()) // only when not found yet + m_aDatabaseMap[url] = aDBInfo; + else + { + if(aFind->second.bShutDown != aDBInfo.bShutDown) + aFind->second.bShutDown &= aDBInfo.bShutDown; + } + + ::rtl::OUString sName; + if(aDBInfo.sControlPassword.getLength() && aDBInfo.sControlUser.getLength() && getDBName(url,sName)) + { + // check if we have to add a new data dev space + checkAndInsertNewDevSpace(sName,aDBInfo); + + convertOldVersion(sName,aDBInfo); + // check if we must restart the database + checkAndRestart(sName,aDBInfo); + } + + if(!m_pDriverHandle) { ::rtl::OUString aPath; @@ -218,12 +407,21 @@ return xCon; } - +// ----------------------------------------------------------------------------- +sal_Bool ODriver::getDBName(const ::rtl::OUString& _rName,::rtl::OUString& sDBName) const +{ + sDBName = ::rtl::OUString(); + ::rtl::OUString sName = _rName.copy(12); + sal_Int32 nPos = sName.indexOf(':'); + if(nPos != -1 && nPos < 1) + sDBName = sName.copy(1); + return (nPos != -1 && nPos < 1); +} // -------------------------------------------------------------------------------- sal_Bool SAL_CALL ODriver::acceptsURL( const ::rtl::OUString& url ) throw(SQLException, RuntimeException) { - return (!url.compareTo(::rtl::OUString::createFromAscii("sdbc:adabas:"),12)); + return (!url.compareTo(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:adabas:")),12)); } // -------------------------------------------------------------------------------- Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& /*info*/) throw(SQLException, RuntimeException) @@ -233,13 +431,41 @@ ::std::vector< DriverPropertyInfo > aDriverInfo; aDriverInfo.push_back(DriverPropertyInfo( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShutdownDatabase")) + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Shut down service when closing.")) + ,sal_False + ,::rtl::OUString() + ,Sequence< ::rtl::OUString >()) + ); + aDriverInfo.push_back(DriverPropertyInfo( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlUser")) + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Control user name.")) + ,sal_False + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0")) + ,Sequence< ::rtl::OUString >()) + ); + aDriverInfo.push_back(DriverPropertyInfo( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlPassword")) + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Control password.")) + ,sal_False + ,::rtl::OUString() + ,Sequence< ::rtl::OUString >()) + ); + aDriverInfo.push_back(DriverPropertyInfo( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataCacheSizeIncrement")) + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Data increment (MB).")) + ,sal_False + ,::rtl::OUString() + ,Sequence< ::rtl::OUString >()) + ); + aDriverInfo.push_back(DriverPropertyInfo( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet")) ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet of the database.")) ,sal_False ,::rtl::OUString() ,Sequence< ::rtl::OUString >()) ); - return Sequence< DriverPropertyInfo >(&(aDriverInfo[0]),aDriverInfo.size()); + return Sequence< DriverPropertyInfo >(&aDriverInfo[0],aDriverInfo.size()); } ::dbtools::throwGenericSQLException(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid URL!")) ,*this); @@ -255,7 +481,52 @@ { return 0; } -// -------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// XCreateCatalog +void SAL_CALL ODriver::createCatalog( const Sequence< PropertyValue >& info ) throw(SQLException, ElementExistException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if (ODriver_BASE::rBHelper.bDisposed) + throw DisposedException(); + + try + { + TDatabaseStruct aDBInfo; + fillInfo(info,aDBInfo); + static char envName[] = "DBSERVICE=0"; + putenv( envName ); + + m_sDbRunDir = m_sDbWorkURL + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/wrk/")) + aDBInfo.sDBName; + String sTemp; + LocalFileHelper::ConvertURLToPhysicalName(m_sDbRunDir,sTemp); + m_sDbRunDir = sTemp; + + createNeededDirs(aDBInfo.sDBName); + if(CreateFiles(aDBInfo)) + throw SQLException(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Could not create the database files")),*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000")),1000,Any()); + + createDb(aDBInfo); + } + catch( SQLException&) + { + throw; + } + catch(Exception&) + { + throw SQLException(); + } + +} +// ----------------------------------------------------------------------------- +// XDropCatalog +void SAL_CALL ODriver::dropCatalog( const ::rtl::OUString& /*catalogName*/, const Sequence< PropertyValue >& /*info*/ ) throw(SQLException, NoSuchElementException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if (ODriver_BASE::rBHelper.bDisposed) + throw DisposedException(); + + ::dbtools::throwFeatureNotImplementedException( "!XDropCatalog::dropCatalog", *this ); +} //----------------------------------------------------------------------------- // ODBC Environment (gemeinsam fuer alle Connections): SQLHANDLE ODriver::EnvironmentHandle(::rtl::OUString &_rPath) @@ -556,9 +827,1004 @@ return pFunction; } // ----------------------------------------------------------------------------- +void ODriver::createNeededDirs(const ::rtl::OUString& sDBName) +{ + ::rtl::OUString sDbWork,sDBConfig,sTemp; + + if(m_sDbWork.getLength()) + { + sDbWork = m_sDbWorkURL; + if(!UCBContentHelper::IsFolder(m_sDbWorkURL)) + UCBContentHelper::MakeFolder(m_sDbWorkURL); + + sDbWork += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); + sDbWork += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("wrk")); + if(!UCBContentHelper::IsFolder(sDbWork)) + UCBContentHelper::MakeFolder(sDbWork); + + sDbWork += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); + + sTemp = sDbWork; + sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("config")); + if(!UCBContentHelper::IsFolder(sTemp)) + UCBContentHelper::MakeFolder(sTemp); + + sTemp = sDbWork; + sTemp += sDBName; + if(!UCBContentHelper::IsFolder(sTemp)) + UCBContentHelper::MakeFolder(sTemp); + } + + if(m_sDbConfig.getLength()) + { + sDBConfig = m_sDbConfigURL; + if(!UCBContentHelper::IsFolder(sDBConfig)) + UCBContentHelper::MakeFolder(sDBConfig); + + sDBConfig += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); + sTemp = sDBConfig; + sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("config")); + if(!UCBContentHelper::IsFolder(sTemp)) + UCBContentHelper::MakeFolder(sTemp); + + sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); + sTemp += sDBName; + if(UCBContentHelper::Exists(sTemp)) + UCBContentHelper::Kill(sTemp); + +#if !(defined(WIN) || defined(WNT)) + sTemp = sDBConfig; + sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("diag")); + if(!UCBContentHelper::IsFolder(sTemp)) + UCBContentHelper::MakeFolder(sTemp); + + sTemp = sDBConfig; + sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ipc")); + if(!UCBContentHelper::IsFolder(sTemp)) + UCBContentHelper::MakeFolder(sTemp); + + sTemp = sDBConfig; + sTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("spool")); + if(!UCBContentHelper::IsFolder(sTemp)) + UCBContentHelper::MakeFolder(sTemp); +#endif + } +} +// ----------------------------------------------------------------------------- +void ODriver::clearDatabase(const ::rtl::OUString& sDBName) +{ // stop the database + ::rtl::OUString sCommand; +#if defined(WIN) || defined(WNT) + ::rtl::OUString sStop = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("stop")); + OArgumentList aArgs(2,&sDBName,&sStop); + sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_cons.exe")); +#else + OArgumentList aArgs(1,&sDBName); + sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_clear")); +#endif + + OProcess aApp( sCommand,m_sDbWorkURL); +#if OSL_DEBUG_LEVEL > 0 + OProcess::TProcessError eError = +#endif + aApp.execute( (OProcess::TProcessOption) OPROCESS_ADABAS, aArgs ); + OSL_ENSURE( eError == OProcess::E_None, "ODriver::clearDatabase: calling the executable failed!" ); +} +// ----------------------------------------------------------------------------- +void ODriver::createDb( const TDatabaseStruct& _aInfo) +{ + + clearDatabase(_aInfo.sDBName); + + X_PARAM(_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword,String::CreateFromAscii("BINIT")); + + String sTemp; + LocalFileHelper::ConvertURLToPhysicalName(_aInfo.sSysDevSpace,sTemp); + + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SYSDEVSPACE")),sTemp); + + sTemp.Erase(); + LocalFileHelper::ConvertURLToPhysicalName(_aInfo.sTransLogName,sTemp); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TRANSACTION_LOG")),sTemp); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXUSERTASKS")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("3"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXDEVSPACES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("7"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXDATADEVSPACES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("5"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXDATAPAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("25599"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXBACKUPDEVS")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MAXSERVERDB")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATA_CACHE_PAGES")),_aInfo.sCacheSize); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CONV_CACHE_PAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("23"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PROC_DATA_PAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("40"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RUNDIRECTORY")),m_sDbRunDir); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("KERNELTRACESIZE")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("100"))); + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LOG_QUEUE_PAGES")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("10"))); + +#if !(defined(WIN) || defined(WNT)) + PutParam(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OPMSG1")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/dev/null"))); +#endif + + X_PARAM(_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BCHECK"))); + + X_START(_aInfo.sDBName); + + // SHOW_STATE() + // %m_sDbRoot%\bin\xutil -d %_aInfo.sDBName% -u %CONUSR%,%CONPWD% -b %INITCMD% + ::rtl::OUString aBatch2 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-b ")); + +// if(!bBsp && INITCMD.Len() >= 40) +// { +// DirEntry aTmp(INITCMD); +// aTmp.CopyTo(aInitFile, FSYS_ACTION_COPYFILE); +// INITCMD = aInitFile.GetFull(); +// } + // generate the init file for the database + String sInitFile = getDatabaseInitFile(_aInfo); + + LocalFileHelper::ConvertURLToPhysicalName(sInitFile,sTemp); + aBatch2 += sTemp; + XUTIL(aBatch2,_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sInitFile)) + UCBContentHelper::Kill(sInitFile); +#endif + + // install system tables + installSystemTables(_aInfo); + // now we have to make our SYSDBA user "NOT EXCLUSIVE" + { + String sExt; + sExt.AssignAscii(".sql"); + + String sWorkUrl(m_sDbWorkURL); + ::utl::TempFile aInitFile(String::CreateFromAscii("Init"),&sExt,&sWorkUrl); + aInitFile.EnableKillingFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(aInitFile.GetURL(),STREAM_WRITE) ); + (*pFileStream) << "ALTER USER \"" + << ::rtl::OString(_aInfo.sSysUser,_aInfo.sSysUser.getLength(),gsl_getSystemTextEncoding()) + << "\" NOT EXCLUSIVE " + << sNewLine; + pFileStream->Flush(); + } + { // just to get sure that the tempfile still lives + sTemp.Erase(); + LocalFileHelper::ConvertURLToPhysicalName(aInitFile.GetURL(),sTemp); + LoadBatch(_aInfo.sDBName,_aInfo.sSysUser,_aInfo.sSysPassword,sTemp); + } + } +} + + +//------------------------------------------------------------------------------------------------- +int ODriver::X_PARAM(const ::rtl::OUString& _DBNAME, + const ::rtl::OUString& _USR, + const ::rtl::OUString& _PWD, + const ::rtl::OUString& _CMD) +{ + // %XPARAM% -u %CONUSR%,%CONPWD% BINIT + String sCommandFile = generateInitFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + (*pFileStream) << "x_param" +#if defined(WIN) || defined(WNT) + << ".exe" +#endif + << " -d " + << ::rtl::OString(_DBNAME,_DBNAME.getLength(),gsl_getSystemTextEncoding()) + << " -u " + << ::rtl::OString(_USR,_USR.getLength(),gsl_getSystemTextEncoding()) + << "," + << ::rtl::OString(_PWD,_PWD.getLength(),gsl_getSystemTextEncoding()) + << " " + << ::rtl::OString(_CMD,_CMD.getLength(),gsl_getSystemTextEncoding()) +#if (defined(WIN) || defined(WNT)) +#if (OSL_DEBUG_LEVEL > 1) || defined(DBG_UTIL) + << " >> %DBWORK%\\create.log 2>&1" +#endif +#else +#if (OSL_DEBUG_LEVEL > 1) || defined(DBG_UTIL) + << " >> /tmp/kstart.log" +#else + << " > /dev/null" +#endif +#endif + << " " + << sNewLine + << sNewLine; + + pFileStream->Flush(); + } + + OProcess aApp(sCommandFile ,m_sDbWorkURL); +#if OSL_DEBUG_LEVEL > 0 + OProcess::TProcessError eError = +#endif + aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); + OSL_ENSURE( eError == OProcess::E_None, "ODriver::X_PARAM: calling the executable failed!" ); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif + + return 0; +} +// ----------------------------------------------------------------------------- +sal_Int32 ODriver::CreateFiles(const TDatabaseStruct& _aInfo) +{ + int nRet = CreateFile(_aInfo.sSysDevSpace,_aInfo.nDataSize/50) ? 0 : -9; + if(!nRet) + nRet = CreateFile(_aInfo.sTransLogName,_aInfo.nLogSize) ? 0 : -10; + if(!nRet) + nRet = CreateFile(_aInfo.sDataDevName,_aInfo.nDataSize) ? 0 : -11; + + return nRet; + +} +// ----------------------------------------------------------------------------- +void ODriver::PutParam(const ::rtl::OUString& sDBName, + const ::rtl::OUString& rWhat, + const ::rtl::OUString& rHow) +{ + OArgumentList aArgs(3,&sDBName,&rWhat,&rHow); + ::rtl::OUString sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("putparam")); +#if defined(WIN) || defined(WNT) + sCommand += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".exe")); +#endif + + OProcess aApp(sCommand,m_sDbWorkURL); +#if OSL_DEBUG_LEVEL > 0 + OProcess::TProcessError eError = +#endif + aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS,aArgs ); + OSL_ENSURE( eError == OProcess::E_None, "ODriver::PutParam: calling the executable failed!" ); +} +// ----------------------------------------------------------------------------- +sal_Bool ODriver::CreateFile(const ::rtl::OUString &_FileName, + sal_Int32 _nSize) +{ +OSL_TRACE("CreateFile %d",_nSize); + sal_Bool bOK = sal_True; + try + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(_FileName,STREAM_WRITE)); + if( !pFileStream.get()) + { + ::rtl::OUString sMsg = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Could not create the database file: '")); + sMsg += _FileName; + sMsg += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("'. Not enough space available!")) ; + throw SQLException(sMsg,*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000")),1000,Any()); + } + (*pFileStream).SetFiller('\0'); + sal_Int32 nNewSize = 0; + sal_Int32 nCount = _nSize /2; + for(sal_Int32 i=0; bOK && i < nCount; ++i) + { + nNewSize += 8192;//4096; + bOK = (*pFileStream).SetStreamSize(nNewSize); + pFileStream->Flush(); + } + + bOK = bOK && static_cast<sal_Int32>(pFileStream->Seek(STREAM_SEEK_TO_END)) == nNewSize; + } + catch(Exception&) + { + OSL_TRACE("Exception"); + } + if(!bOK) + { + ::rtl::OUString sMsg = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Could not create the database file: '")); + sMsg += _FileName; + sMsg += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("'. Not enough space available!")) ; + throw SQLException(sMsg,*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HY0000")),1000,Any()); + } + + return bOK; + // dd if=/dev/zero bs=4k of=$DEV_NAME count=$2 +} +// ----------------------------------------------------------------------------- +int ODriver::X_START(const ::rtl::OUString& sDBName) +{ + ::rtl::OUString sCommand; +#if defined(WIN) || defined(WNT) + + ::rtl::OUString sArg1 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-d")); + ::rtl::OUString sArg3 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-NoDBService")); + ::rtl::OUString sArg4 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-NoDBWindow")); + + OArgumentList aArgs(4,&sArg1,&sDBName,&sArg3,&sArg4); + sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("strt.exe")); +#else + OArgumentList aArgs(1,&sDBName); + sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_start")); +#endif + + OProcess aApp( sCommand ,m_sDbWorkURL); + OProcess::TProcessError eError = aApp.execute((OProcess::TProcessOption)OPROCESS_ADABAS,aArgs); + + if(eError == OProcess::E_NotFound) + { + ::rtl::OUString sMsg = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Program ")); + sMsg += sCommand; + sMsg += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" not found!")); + SQLException aNext(sMsg,*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("01000")),1000,Any()); + ::rtl::OUString sMsg2(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Could not start database: "))); + sMsg2 += sDBName; + throw SQLException(sMsg2,*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("01000")),1000,makeAny(aNext)); + } + OSL_ASSERT(eError == OProcess::E_None); + + OProcess::TProcessInfo aInfo; + if(aApp.getInfo(OProcess::TData_ExitCode,&aInfo) == OProcess::E_None && aInfo.Code) + return aInfo.Code; + + return 0; +} +// ----------------------------------------------------------------------------- +int ODriver::X_STOP(const ::rtl::OUString& sDBName) +{ + ::rtl::OUString sCommand; +#if defined(WIN) || defined(WNT) + + ::rtl::OUString sArg1 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-d")); + ::rtl::OUString sArg2 = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-NoDBService")); + + OArgumentList aArgs(3,&sArg1,&sDBName,&sArg2); + sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("stp.exe")); +#else + OArgumentList aArgs(1,&sDBName); + sCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("x_stop")); +#endif + OProcess aApp( sCommand ,m_sDbWorkURL); + + OProcess::TProcessError eError = aApp.execute((OProcess::TProcessOption)OPROCESS_ADABAS,aArgs); + + + OSL_ASSERT(eError == OProcess::E_None); + if(eError != OProcess::E_None) + return 1; + OProcess::TProcessInfo aInfo; + if(aApp.getInfo(OProcess::TData_ExitCode,&aInfo) == OProcess::E_None && aInfo.Code) + return aInfo.Code; + + return 0; +} +// ----------------------------------------------------------------------------- +void ODriver::XUTIL(const ::rtl::OUString& _rParam, + const ::rtl::OUString& _DBNAME, + const ::rtl::OUString& _USRNAME, + const ::rtl::OUString& _USRPWD) +{ + String sWorkUrl(m_sDbWorkURL); + String sExt = String::CreateFromAscii(".log"); + ::utl::TempFile aCmdFile(String::CreateFromAscii("xutil"),&sExt,&sWorkUrl); + aCmdFile.EnableKillingFile(); + + String sPhysicalPath; + LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); + + String sCommandFile = generateInitFile(); + + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + (*pFileStream) << +#if defined(WIN) || defined(WNT) + "xutil.exe" +#else + "utility" +#endif + << " -u " + << ::rtl::OString(_USRNAME,_USRNAME.getLength(),gsl_getSystemTextEncoding()) + << "," + << ::rtl::OString(_USRPWD,_USRPWD.getLength(),gsl_getSystemTextEncoding()) + << " -d " + << ::rtl::OString(_DBNAME,_DBNAME.getLength(),gsl_getSystemTextEncoding()) + << " " + << ::rtl::OString(_rParam,_rParam.getLength(),gsl_getSystemTextEncoding()) + << " > " + << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) + << " 2>&1" + << sNewLine; + pFileStream->Flush(); + } + + OProcess aApp(sCommandFile ,m_sDbWorkURL); +#if OSL_DEBUG_LEVEL > 0 + OProcess::TProcessError eError = +#endif + aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); + OSL_ENSURE( eError == OProcess::E_None, "ODriver::XUTIL: calling the executable failed!" ); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif +} +// ----------------------------------------------------------------------------- +void ODriver::LoadBatch(const ::rtl::OUString& sDBName, + const ::rtl::OUString& _rUSR, + const ::rtl::OUString& _rPWD, + const ::rtl::OUString& _rBatch) +{ + OSL_ENSURE(_rBatch.getLength(),"No batch file given!"); + String sWorkUrl(m_sDbWorkURL); + String sExt = String::CreateFromAscii(".log"); + ::utl::TempFile aCmdFile(String::CreateFromAscii("LoadBatch"),&sExt,&sWorkUrl); +#if OSL_DEBUG_LEVEL < 2 + aCmdFile.EnableKillingFile(); +#endif + + String sPhysicalPath; + LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); + + String sCommandFile = generateInitFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + (*pFileStream) << "xload" +#if defined(WIN) || defined(WNT) + << ".exe" +#endif + << " -d " + << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) + << " -u " + << ::rtl::OString(_rUSR,_rUSR.getLength(),gsl_getSystemTextEncoding()) + << "," + << ::rtl::OString(_rPWD,_rPWD.getLength(),gsl_getSystemTextEncoding()); + + if ( !isKernelVersion(CURRENT_DB_VERSION) ) + (*pFileStream) << " -S adabas -b "; + else + (*pFileStream) << " -S NATIVE -b "; + + (*pFileStream) << ::rtl::OString(_rBatch,_rBatch.getLength(),gsl_getSystemTextEncoding()) + << " > " + << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) + << " 2>&1" + << sNewLine; + + pFileStream->Flush(); + } + + OProcess aApp(sCommandFile ,m_sDbWorkURL); +#if OSL_DEBUG_LEVEL > 0 + OProcess::TProcessError eError = +#endif + aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); + OSL_ENSURE( eError == OProcess::E_None, "ODriver::LoadBatch: calling the executable failed!" ); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif +} +// ----------------------------------------------------------------------------- +void ODriver::fillEnvironmentVariables() +{ + // read the environment vars + struct env_data + { + const sal_Char* pAsciiEnvName; + ::rtl::OUString* pValue; + ::rtl::OUString* pValueURL; + } EnvData[] = { + { "DBWORK", &m_sDbWork, &m_sDbWorkURL }, + { "DBCONFIG", &m_sDbConfig, &m_sDbConfigURL }, + { "DBROOT", &m_sDbRoot, &m_sDbRootURL } + }; + + for ( size_t i = 0; i < sizeof( EnvData ) / sizeof( EnvData[0] ); ++i ) + { + ::rtl::OUString sVarName = ::rtl::OUString::createFromAscii( EnvData[i].pAsciiEnvName ); + ::rtl::OUString sEnvValue; + if(osl_getEnvironment( sVarName.pData, &sEnvValue.pData ) == osl_Process_E_None ) + { + *EnvData[i].pValue = sEnvValue; + String sURL; + LocalFileHelper::ConvertPhysicalNameToURL( *EnvData[i].pValue, sURL ); + *EnvData[i].pValueURL = sURL; + } + } + + m_sDelimit = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); +} +// ----------------------------------------------------------------------------- +::rtl::OUString ODriver::generateInitFile() const +{ + String sExt; +#if !(defined(WIN) || defined(WNT)) + sExt = String::CreateFromAscii(".sh"); +#else + sExt = String::CreateFromAscii(".bat"); +#endif + + String sWorkUrl(m_sDbWorkURL); + ::utl::TempFile aCmdFile(String::CreateFromAscii("Init"),&sExt,&sWorkUrl); +#if !(defined(WIN) || defined(WNT)) + String sPhysicalPath; + LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); + chmod(ByteString(sPhysicalPath,gsl_getSystemTextEncoding()).GetBuffer(),S_IRUSR|S_IWUSR|S_IXUSR); +#endif + +#if !(defined(WIN) || defined(WNT)) + SvStream* pFileStream = aCmdFile.GetStream(STREAM_WRITE); + (*pFileStream) << "#!/bin/sh" + << sNewLine + << "cd \"$DBWORK\"" + << sNewLine + << sNewLine; + pFileStream->Flush(); +#endif + + return aCmdFile.GetURL(); +} +// ----------------------------------------------------------------------------- +::rtl::OUString ODriver::getDatabaseInitFile( const TDatabaseStruct& _aDBInfo) +{ + String sExt; + sExt.AssignAscii(".ins"); + + + String sWorkUrl(m_sDbWorkURL); + ::utl::TempFile aInitFile(String::CreateFromAscii("Init"),&sExt,&sWorkUrl); + { + SvStream* pFileStream = aInitFile.GetStream(STREAM_WRITE); + (*pFileStream) << "* @(#)init.cmd 6.1.1 1994-11-10\n"; + (*pFileStream) << "init config\n"; + (*pFileStream) << "* default code:\n"; + (*pFileStream) << "ascii\n"; + (*pFileStream) << "* date time format\n"; + (*pFileStream) << "internal\n"; + (*pFileStream) << "* command timeout:\n"; + (*pFileStream) << "900\n"; + (*pFileStream) << "* lock timeout:\n"; + (*pFileStream) << "360\n"; + (*pFileStream) << "* request timeout:\n"; + (*pFileStream) << "180\n"; + (*pFileStream) << "* log mode:\n"; + (*pFileStream) << "demo\n"; + (*pFileStream) << "* log segment size:\n"; + (*pFileStream) << "0\n"; + (*pFileStream) << "* no of archive logs:\n"; + (*pFileStream) << "0\n"; + (*pFileStream) << "* no of data devspaces:\n"; + (*pFileStream) << "1\n"; + (*pFileStream) << "* mirror devspaces:\n"; + (*pFileStream) << "n\n"; + (*pFileStream) << "if $rc <> 0 then stop\n"; + (*pFileStream) << "*--- device description ---\n"; + (*pFileStream) << "* sys devspace name:\n"; + { + String sTemp; + LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sSysDevSpace,sTemp); + (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); + } + (*pFileStream) << "\n* log devspace size:\n"; + (*pFileStream) << ::rtl::OString::valueOf(_aDBInfo.nLogSize); + (*pFileStream) << "\n* log devspace name:\n"; + { + String sTemp; + LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sTransLogName,sTemp); + (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); + } + (*pFileStream) << "\n* data devspace size:\n"; + (*pFileStream) << ::rtl::OString::valueOf(_aDBInfo.nDataSize); + (*pFileStream) << "\n* data devspace name:\n"; + { + String sTemp; + LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sDataDevName,sTemp); + (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); } + + (*pFileStream) << "\n* END INIT CONFIG\n"; + (*pFileStream) << "if $rc <> 0 then stop\n"; + if(_aDBInfo.bRestoreDatabase) + { + (*pFileStream) << "RESTORE DATA QUICK FROM '"; + { + String sTemp; + LocalFileHelper::ConvertURLToPhysicalName(_aDBInfo.sBackupFile,sTemp); + (*pFileStream) << ::rtl::OString(sTemp.GetBuffer(),sTemp.Len(),gsl_getSystemTextEncoding()); + } + (*pFileStream) << "' BLOCKSIZE 8\n"; + (*pFileStream) << "if $rc <> 0 then stop\n"; + (*pFileStream) << "RESTART\n"; + + } + else + { + (*pFileStream) << "ACTIVATE SERVERDB SYSDBA \""; + (*pFileStream) << ::rtl::OString(_aDBInfo.sSysUser,_aDBInfo.sSysUser.getLength(),gsl_getSystemTextEncoding()); + (*pFileStream) << "\" PASSWORD \""; + (*pFileStream) << ::rtl::OString(_aDBInfo.sSysPassword,_aDBInfo.sSysPassword.getLength(),gsl_getSystemTextEncoding()); + (*pFileStream) << "\"\n"; + } + (*pFileStream) << "if $rc <> 0 then stop\n"; + (*pFileStream) << "exit\n"; + } + return aInitFile.GetURL(); } // ----------------------------------------------------------------------------- +void ODriver::X_CONS(const ::rtl::OUString& sDBName,const ::rtl::OString& _ACTION,const ::rtl::OUString& _FILENAME) +{ + String sPhysicalPath; + LocalFileHelper::ConvertURLToPhysicalName(_FILENAME,sPhysicalPath); + + String sCommandFile = generateInitFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + + (*pFileStream) << "x_cons" +#if defined(WIN) || defined(WNT) + << ".exe" +#endif + << " " + << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) + << " SHOW " + << _ACTION + << " > " + << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) + << sNewLine; + pFileStream->Flush(); + } + + OProcess aApp(sCommandFile ,m_sDbWorkURL); + aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif +} +// ----------------------------------------------------------------------------- +void ODriver::checkAndRestart(const ::rtl::OUString& sDBName,const TDatabaseStruct& _rDbInfo) +{ + String sWorkUrl(m_sDbWorkURL); + String sExt = String::CreateFromAscii(".st"); + ::utl::TempFile aCmdFile(String::CreateFromAscii("State"),&sExt,&sWorkUrl); + aCmdFile.EnableKillingFile(); + + X_CONS(sDBName,"STATE",aCmdFile.GetURL()); + SvStream* pFileStream = aCmdFile.GetStream(STREAM_SHARE_DENYALL); + if ( pFileStream ) + { + ByteString sStateLine; + sal_Bool bRead = sal_True; + sal_Int32 nStart = 2; + while(bRead && !pFileStream->IsEof()) + { + String aLine; + bRead = pFileStream->ReadLine(sStateLine); + if(bRead) + { + if(sStateLine.Search("WARM") != STRING_NOTFOUND) + { // nothing to do + nStart = 0; + break; + } + else if(sStateLine.Search("COLD") != STRING_NOTFOUND) + { + nStart = 1; + break; + } + } + } + switch(nStart) + { + case 2: + clearDatabase(sDBName); + X_START(sDBName); + // don't break here + case 1: + XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RESTART")),sDBName,_rDbInfo.sControlUser,_rDbInfo.sControlPassword); + case 0: + break; + } + } +} +// ----------------------------------------------------------------------------- +sal_Bool ODriver::isVersion(const ::rtl::OUString& sDBName, const char* _pVersion) +{ + String sWorkUrl(m_sDbWorkURL); + String sExt = String::CreateFromAscii(".st"); + ::utl::TempFile aCmdFile(String::CreateFromAscii("DevSpaces"),&sExt,&sWorkUrl); + aCmdFile.EnableKillingFile(); + + String sPhysicalPath; + LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); + + String sCommandFile = generateInitFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + + (*pFileStream) << "getparam" +#if defined(WIN) || defined(WNT) + << ".exe" +#endif + << " " + << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) + << " KERNELVERSION > " + << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) + << sNewLine; + } + + OProcess aApp(sCommandFile ,m_sDbWorkURL); + aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif + SvStream* pFileStream = aCmdFile.GetStream(STREAM_STD_READWRITE); + ByteString sStateLine; + sal_Bool bRead = sal_True; + sal_Bool bIsVersion = sal_False; + while ( pFileStream && bRead && !pFileStream->IsEof() ) + { + bRead = pFileStream->ReadLine(sStateLine); + if ( bRead ) + { + bIsVersion = sStateLine.GetToken(1,' ').Equals(_pVersion) != 0; + break; + } + } + return bIsVersion; +} +// ----------------------------------------------------------------------------- +void ODriver::checkAndInsertNewDevSpace(const ::rtl::OUString& sDBName, + const TDatabaseStruct& _rDBInfo) +{ + // %DBROOT%\pgm\getparam %2 DATA_CACHE_PAGES > %3 + String sWorkUrl(m_sDbWorkURL); + String sExt = String::CreateFromAscii(".st"); + ::utl::TempFile aCmdFile(String::CreateFromAscii("DevSpaces"),&sExt,&sWorkUrl); + aCmdFile.EnableKillingFile(); + + String sPhysicalPath; + LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); + + String sCommandFile = generateInitFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + + (*pFileStream) << "getparam" +#if defined(WIN) || defined(WNT) + << ".exe" +#endif + << " " + << ::rtl::OString(sDBName,sDBName.getLength(),gsl_getSystemTextEncoding()) + << " DATA_CACHE_PAGES > " + << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) + << sNewLine; + } + + OProcess aApp(sCommandFile ,m_sDbWorkURL); + aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif + SvStream* pFileStream = aCmdFile.GetStream(STREAM_STD_READWRITE); + ByteString sStateLine; + sal_Bool bRead = sal_True; + sal_Int32 nDataPages = 0; + while(pFileStream && bRead && !pFileStream->IsEof()) + { + bRead = pFileStream->ReadLine(sStateLine); + if(bRead) + { + nDataPages = sStateLine.ToInt32(); + if(nDataPages && nDataPages < 100) + { + // the space isn't big enough anymore so we increment it + PutParam(sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATA_CACHE_PAGES")),::rtl::OUString::valueOf(nDataPages)); + X_PARAM(sDBName,_rDBInfo.sControlUser,_rDBInfo.sControlPassword,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BCHECK"))); + } + } + } +} +// ----------------------------------------------------------------------------- +sal_Bool ODriver::isKernelVersion(const char* _pVersion) +{ + ::utl::TempFile aCmdFile(String::CreateFromAscii("KernelVersion")); + aCmdFile.EnableKillingFile(); + + String sPhysicalPath; + LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath); + + String sCommandFile = generateInitFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + + (*pFileStream) << "dbversion" + << " > " + << ::rtl::OString(sPhysicalPath.GetBuffer(),sPhysicalPath.Len(),gsl_getSystemTextEncoding()) + << sNewLine; + } + + OProcess aApp(sCommandFile ,m_sDbWorkURL); + aApp.execute( (OProcess::TProcessOption)OPROCESS_ADABAS); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif + SvStream* pFileStream = aCmdFile.GetStream(STREAM_STD_READWRITE); + ByteString sStateLine; + sal_Bool bRead = sal_True; + sal_Bool bIsVersion = sal_True; + while ( pFileStream && bRead && !pFileStream->IsEof() ) + { + bRead = pFileStream->ReadLine(sStateLine); + if ( bRead ) + { + // convert a 11.02.00 to a 12.01.30 version + bIsVersion = sStateLine.GetToken(0).Equals(_pVersion) != 0; + break; + } + } + return bIsVersion; +} +// ----------------------------------------------------------------------------- +void ODriver::installSystemTables( const TDatabaseStruct& _aInfo) +{ +#if defined(WIN) || defined(WNT) + // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% -b %m_sDbRoot%\env\TERMCHAR.ind + ::rtl::OUString aBatch = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-b ")); + ::rtl::OUString sTemp2 = m_sDbRootURL + m_sDelimit + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) + + m_sDelimit + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TERMCHAR.ind")); + String sTemp; + sal_Bool bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); + aBatch += sTemp; + + XUTIL(aBatch,_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); + + // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% DIAGNOSE TRIGGER OFF + XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DIAGNOSE TRIGGER OFF")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); + // xload -d %_DBNAME% -u %_SYSDBA_USER%,%_SYSDBA_PWD% -S NATIVE -b %m_sDbRoot%\env\DBS.ins %_DOMAINPWD% + { + sTemp2 = m_sDbRootURL + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) + + m_sDelimit + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DBS.ins")); + sTemp.Erase(); + bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); + OSL_ENSURE(bOk,"File could be converted into file system path!"); + sTemp.AppendAscii(" "); + sTemp += String(_aInfo.sDomainPassword); + + LoadBatch(_aInfo.sDBName,_aInfo.sSysUser,_aInfo.sSysPassword,sTemp); + } + // xload -d %_DBNAME% -u DOMAIN,%_DOMAINPWD% -S NATIVE -b %m_sDbRoot%\env\XDD.ins + { + sTemp2 = m_sDbRootURL + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) + + m_sDelimit + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("XDD.ins")); + sTemp.Erase(); + bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); + OSL_ENSURE(bOk,"File could be converted into file system path!"); + + LoadBatch(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOMAIN")),_aInfo.sDomainPassword,sTemp); + } + // xload -d %_DBNAME% -u %_SYSDBA_USER%,%_SYSDBA_PWD% -S NATIVE -b %m_sDbRoot%\env\QP.ins + { + sTemp2 = m_sDbRootURL + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) + + m_sDelimit + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("QP.ins")); + sTemp.Erase(); + bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); + OSL_ENSURE(bOk,"File could be converted into file system path!"); + LoadBatch(_aInfo.sDBName,_aInfo.sSysUser,_aInfo.sSysPassword,sTemp); + } + // xload -d %_DBNAME% -u DOMAIN,%_DOMAINPWD% -S NATIVE -b %m_sDbRoot%\env\SPROC.ins + { + sTemp2 = m_sDbRootURL + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")) + + m_sDelimit + + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SPROC.ins")); + sTemp.Erase(); + bOk = LocalFileHelper::ConvertURLToPhysicalName(sTemp2,sTemp); + OSL_ENSURE(bOk,"File could be converted into file system path!"); + + LoadBatch(_aInfo.sDBName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOMAIN")),_aInfo.sDomainPassword,sTemp); + } + + // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% DIAGNOSE TRIGGER ON + XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DIAGNOSE TRIGGER ON")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); + // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% SET NOLOG OFF + XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SET NOLOG OFF")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); + // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% SHUTDOWN QUICK + XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SHUTDOWN QUICK")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); + // xutil -d %_DBNAME% -u %_CONTROL_USER%,%_CONTROL_PWD% RESTART + XUTIL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RESTART")),_aInfo.sDBName,_aInfo.sControlUser,_aInfo.sControlPassword); + +#else // UNX + String sCommandFile = generateInitFile(); + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READWRITE)); + pFileStream->Seek(STREAM_SEEK_TO_END); + (*pFileStream) << "x_dbinst" + << " -d " + << ::rtl::OString(_aInfo.sDBName,_aInfo.sDBName.getLength(),gsl_getSystemTextEncoding()) + << " -u " + << ::rtl::OString(_aInfo.sSysUser,_aInfo.sSysUser.getLength(),gsl_getSystemTextEncoding()) + << "," + << ::rtl::OString(_aInfo.sSysPassword,_aInfo.sSysPassword.getLength(),gsl_getSystemTextEncoding()) + << " -w " + << ::rtl::OString(_aInfo.sDomainPassword,_aInfo.sDomainPassword.getLength(),gsl_getSystemTextEncoding()) + << " -b "; + + if ( isKernelVersion(ADABAS_KERNEL_11) ) + (*pFileStream) << "-i all"; + (*pFileStream) +#if (OSL_DEBUG_LEVEL > 1) || defined(DBG_UTIL) + << " >> /tmp/kstart.log" +#else + << " > /dev/null" +#endif + << sNewLine + << sNewLine; + pFileStream->Flush(); + } + // now execute the command + OProcess aApp(sCommandFile ,m_sDbWorkURL); + aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait)); +#if OSL_DEBUG_LEVEL < 2 + if(UCBContentHelper::Exists(sCommandFile)) + UCBContentHelper::Kill(sCommandFile); +#endif + +#endif //WNT,UNX +} +// ----------------------------------------------------------------------------- +void ODriver::convertOldVersion(const ::rtl::OUString& sDBName,const TDatabaseStruct& _rDbInfo) +{ + // first we have to check if this databse is a old version and we have to update the system tables + if ( !isVersion(sDBName,CURRENT_DB_VERSION) && isKernelVersion(CURRENT_DB_VERSION) ) + { + if ( !_rDbInfo.sControlUser.getLength() + || !_rDbInfo.sControlPassword.getLength()) + { + throw SQLException(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The current database need to be converted. Please insert control user and password.")),*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")),1000,Any()); + } + String sCommandFile = m_sDbWorkURL; + sCommandFile += String::CreateFromAscii("/xparam.prt"); + if ( UCBContentHelper::Exists(sCommandFile) ) + UCBContentHelper::Kill(sCommandFile); + X_PARAM(sDBName,_rDbInfo.sControlUser,_rDbInfo.sControlPassword,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BCHECK"))); + + if ( UCBContentHelper::Exists(sCommandFile) ) + { + { + ::std::auto_ptr<SvStream> pFileStream( UcbStreamHelper::CreateStream(sCommandFile,STREAM_STD_READ) ); + ByteString sStateLine; + sal_Bool bRead = sal_True; + static ByteString s_ErrorId("-21100"); + while ( pFileStream.get() && bRead && !pFileStream->IsEof() ) + { + bRead = pFileStream->ReadLine(sStateLine); + if ( bRead && s_ErrorId == sStateLine.GetToken(0,' ') ) + { + UCBContentHelper::Kill(sCommandFile); + ::rtl::OUString sError(::rtl::OUString::createFromAscii(sStateLine.GetBuffer())); + throw SQLException(sError,*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")),1000,Any()); + } + } + } + + UCBContentHelper::Kill(sCommandFile); + } + } +} +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- + } // namespace adabas +}// namespace connectivity +// ----------------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
