summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/adabas/BDriver.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/drivers/adabas/BDriver.cxx')
-rw-r--r--connectivity/source/drivers/adabas/BDriver.cxx1819
1 files changed, 1819 insertions, 0 deletions
diff --git a/connectivity/source/drivers/adabas/BDriver.cxx b/connectivity/source/drivers/adabas/BDriver.cxx
new file mode 100644
index 000000000000..fc92ebb38b0c
--- /dev/null
+++ b/connectivity/source/drivers/adabas/BDriver.cxx
@@ -0,0 +1,1819 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+#include <unotools/tempfile.hxx>
+#include "adabas/BDriver.hxx"
+#include "adabas/BConnection.hxx"
+#include "odbc/OFunctions.hxx"
+#include <com/sun/star/lang/DisposedException.hpp>
+#include "odbc/OTools.hxx"
+#include "connectivity/dbexception.hxx"
+#include "TConnection.hxx"
+#include "diagnose_ex.h"
+#include <vos/process.hxx>
+#include <osl/process.h>
+#include <unotools/ucbhelper.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <unotools/localfilehelper.hxx>
+#include "resource/adabas_res.hrc"
+#include "resource/sharedresources.hxx"
+
+
+#include <memory>
+#include <sys/stat.h>
+
+#if 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
+{
+ namespace adabas
+ {
+ // extern declaration of the function pointer
+ extern T3SQLAllocHandle pODBC3SQLAllocHandle;
+ extern T3SQLConnect pODBC3SQLConnect;
+ extern T3SQLDriverConnect pODBC3SQLDriverConnect;
+ extern T3SQLBrowseConnect pODBC3SQLBrowseConnect;
+ extern T3SQLDataSources pODBC3SQLDataSources;
+ extern T3SQLDrivers pODBC3SQLDrivers;
+ extern T3SQLGetInfo pODBC3SQLGetInfo;
+ extern T3SQLGetFunctions pODBC3SQLGetFunctions;
+ extern T3SQLGetTypeInfo pODBC3SQLGetTypeInfo;
+ extern T3SQLSetConnectAttr pODBC3SQLSetConnectAttr;
+ extern T3SQLGetConnectAttr pODBC3SQLGetConnectAttr;
+ extern T3SQLSetEnvAttr pODBC3SQLSetEnvAttr;
+ extern T3SQLGetEnvAttr pODBC3SQLGetEnvAttr;
+ extern T3SQLSetStmtAttr pODBC3SQLSetStmtAttr;
+ extern T3SQLGetStmtAttr pODBC3SQLGetStmtAttr;
+ //extern T3SQLSetDescField pODBC3SQLSetDescField;
+ //extern T3SQLGetDescField pODBC3SQLGetDescField;
+ //extern T3SQLGetDescRec pODBC3SQLGetDescRec;
+ //extern T3SQLSetDescRec pODBC3SQLSetDescRec;
+ extern T3SQLPrepare pODBC3SQLPrepare;
+ extern T3SQLBindParameter pODBC3SQLBindParameter;
+ //extern T3SQLGetCursorName pODBC3SQLGetCursorName;
+ extern T3SQLSetCursorName pODBC3SQLSetCursorName;
+ extern T3SQLExecute pODBC3SQLExecute;
+ extern T3SQLExecDirect pODBC3SQLExecDirect;
+ //extern T3SQLNativeSql pODBC3SQLNativeSql;
+ extern T3SQLDescribeParam pODBC3SQLDescribeParam;
+ extern T3SQLNumParams pODBC3SQLNumParams;
+ extern T3SQLParamData pODBC3SQLParamData;
+ extern T3SQLPutData pODBC3SQLPutData;
+ extern T3SQLRowCount pODBC3SQLRowCount;
+ extern T3SQLNumResultCols pODBC3SQLNumResultCols;
+ extern T3SQLDescribeCol pODBC3SQLDescribeCol;
+ extern T3SQLColAttribute pODBC3SQLColAttribute;
+ extern T3SQLBindCol pODBC3SQLBindCol;
+ extern T3SQLFetch pODBC3SQLFetch;
+ extern T3SQLFetchScroll pODBC3SQLFetchScroll;
+ extern T3SQLGetData pODBC3SQLGetData;
+ extern T3SQLSetPos pODBC3SQLSetPos;
+ extern T3SQLBulkOperations pODBC3SQLBulkOperations;
+ extern T3SQLMoreResults pODBC3SQLMoreResults;
+ //extern T3SQLGetDiagField pODBC3SQLGetDiagField;
+ extern T3SQLGetDiagRec pODBC3SQLGetDiagRec;
+ extern T3SQLColumnPrivileges pODBC3SQLColumnPrivileges;
+ extern T3SQLColumns pODBC3SQLColumns;
+ extern T3SQLForeignKeys pODBC3SQLForeignKeys;
+ extern T3SQLPrimaryKeys pODBC3SQLPrimaryKeys;
+ extern T3SQLProcedureColumns pODBC3SQLProcedureColumns;
+ extern T3SQLProcedures pODBC3SQLProcedures;
+ extern T3SQLSpecialColumns pODBC3SQLSpecialColumns;
+ extern T3SQLStatistics pODBC3SQLStatistics;
+ extern T3SQLTablePrivileges pODBC3SQLTablePrivileges;
+ extern T3SQLTables pODBC3SQLTables;
+ extern T3SQLFreeStmt pODBC3SQLFreeStmt;
+ extern T3SQLCloseCursor pODBC3SQLCloseCursor;
+ extern T3SQLCancel pODBC3SQLCancel;
+ extern T3SQLEndTran pODBC3SQLEndTran;
+ extern T3SQLDisconnect pODBC3SQLDisconnect;
+ extern T3SQLFreeHandle pODBC3SQLFreeHandle;
+ extern T3SQLGetCursorName pODBC3SQLGetCursorName;
+ extern T3SQLNativeSql pODBC3SQLNativeSql;
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+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
+//------------------------------------------------------------------------------
+rtl::OUString ODriver::getImplementationName_Static( ) throw(RuntimeException)
+{
+ return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.sdbcx.adabas.ODriver"));
+}
+//------------------------------------------------------------------------------
+Sequence< ::rtl::OUString > ODriver::getSupportedServiceNames_Static( ) throw (RuntimeException)
+{
+ Sequence< ::rtl::OUString > aSNS( 2 );
+ aSNS[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbc.Driver"));
+ aSNS[1] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbcx.Driver"));
+ return aSNS;
+}
+//------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODriver::getImplementationName( ) throw(RuntimeException)
+{
+ return getImplementationName_Static();
+}
+
+//------------------------------------------------------------------
+sal_Bool SAL_CALL ODriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
+{
+ 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)
+ ;
+
+ return pSupported != pEnd;
+}
+//------------------------------------------------------------------
+Sequence< ::rtl::OUString > SAL_CALL ODriver::getSupportedServiceNames( ) throw(RuntimeException)
+{
+ return getSupportedServiceNames_Static();
+}
+//------------------------------------------------------------------
+Any SAL_CALL ODriver::queryInterface( const Type & rType ) throw(RuntimeException)
+{
+ Any aRet = ::cppu::queryInterface(rType, static_cast<XDataDefinitionSupplier*>(this));
+ 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.clear();
+ }
+}
+// --------------------------------------------------------------------------------
+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;
+ if(!EnvironmentHandle(aPath))
+ throw SQLException(aPath,*this,::rtl::OUString(),1000,Any());
+ }
+ OAdabasConnection* pCon = new OAdabasConnection(m_pDriverHandle,this);
+ Reference< XConnection > xCon = pCon;
+ SQLRETURN nSQLRETURN = pCon->Construct(url,info);
+
+ if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA)
+ {
+ odbc::OTools::ThrowException(pCon,nSQLRETURN,pCon->getConnection(),SQL_HANDLE_DBC,*this);
+ }
+
+ m_xConnections.push_back(WeakReferenceHelper(*pCon));
+
+ 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(RTL_CONSTASCII_USTRINGPARAM("sdbc:adabas:")),12));
+}
+// --------------------------------------------------------------------------------
+Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& /*info*/) throw(SQLException, RuntimeException)
+{
+ if ( acceptsURL(url) )
+ {
+ ::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());
+ }
+
+ SharedResources aResources;
+ const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR);
+ ::dbtools::throwGenericSQLException(sMessage ,*this);
+ return Sequence< DriverPropertyInfo >();
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODriver::getMajorVersion( ) throw(RuntimeException)
+{
+ return 1;
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODriver::getMinorVersion( ) throw(RuntimeException)
+{
+ 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);
+
+ ::rtl::OUString envVar(RTL_CONSTASCII_USTRINGPARAM("DBSERVICE"));
+ ::rtl::OUString envData(RTL_CONSTASCII_USTRINGPARAM("0"));
+ osl_setEnvironment(envVar.pData, envData.pData);
+
+ 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))
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_NO_DISK_SPACE,
+ "$filename$",aDBInfo.sDBName
+ ) );
+ ::dbtools::throwGenericSQLException(sError,*this);
+ } // if(CreateFiles(aDBInfo))
+
+ 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)
+{
+ // Ist (fuer diese Instanz) bereits ein Environment erzeugt worden?
+ if (!m_pDriverHandle)
+ {
+ SQLHANDLE h = SQL_NULL_HANDLE;
+ // Environment allozieren
+
+ // ODBC-DLL jetzt laden:
+ if (! LoadLibrary_ADABAS(_rPath))
+ return SQL_NULL_HANDLE;
+
+ if (N3SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&h) != SQL_SUCCESS)
+ return SQL_NULL_HANDLE;
+
+ // In globaler Struktur merken ...
+ m_pDriverHandle = h;
+ SQLRETURN nError = N3SQLSetEnvAttr(h, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
+ OSL_UNUSED( nError );
+ //N3SQLSetEnvAttr(h, SQL_ATTR_CONNECTION_POOLING,(SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER);
+ }
+
+ return m_pDriverHandle;
+}
+// --------------------------------------------------------------------------------
+// XDataDefinitionSupplier
+Reference< XTablesSupplier > SAL_CALL ODriver::getDataDefinitionByConnection( const Reference< ::com::sun::star::sdbc::XConnection >& connection ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (ODriver_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ Reference< XTablesSupplier > xTab;
+ Reference< ::com::sun::star::lang::XUnoTunnel> xTunnel(connection,UNO_QUERY);
+ if ( xTunnel.is() )
+ {
+
+ OAdabasConnection* pConnection = NULL;
+ OAdabasConnection* pSearchConnection = reinterpret_cast< OAdabasConnection* >( xTunnel->getSomething(OAdabasConnection::getUnoTunnelImplementationId()) );
+ for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i)
+ {
+ if ( (OAdabasConnection*) Reference< XConnection >::query(i->get().get()).get() == pSearchConnection )
+ {
+ pConnection = pSearchConnection;
+ break;
+ }
+ }
+
+
+ if ( pConnection )
+ xTab = pConnection->createCatalog();
+ }
+ return xTab;
+}
+
+// --------------------------------------------------------------------------------
+Reference< XTablesSupplier > SAL_CALL ODriver::getDataDefinitionByURL( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
+{
+ if ( ! acceptsURL(url) )
+ {
+ SharedResources aResources;
+ const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR);
+ ::dbtools::throwGenericSQLException(sMessage ,*this);
+ } // if ( ! acceptsURL(url) )
+
+ return getDataDefinitionByConnection(connect(url,info));
+}
+// -----------------------------------------------------------------------------
+void SAL_CALL ODriver::acquire() throw()
+{
+ ODriver_BASE::acquire();
+}
+// -----------------------------------------------------------------------------
+void SAL_CALL ODriver::release() throw()
+{
+ ODriver_BASE::release();
+}
+ODriver::~ODriver()
+{
+}
+// -----------------------------------------------------------------------------
+oslGenericFunction ODriver::getOdbcFunction(sal_Int32 _nIndex) const
+{
+ oslGenericFunction pFunction = NULL;
+ switch(_nIndex)
+ {
+ case ODBC3SQLAllocHandle:
+ pFunction = (oslGenericFunction)pODBC3SQLAllocHandle;;
+ break;
+ case ODBC3SQLConnect:
+ pFunction = (oslGenericFunction)pODBC3SQLConnect;
+ break;
+ case ODBC3SQLDriverConnect:
+ pFunction = (oslGenericFunction)pODBC3SQLDriverConnect;
+ break;
+ case ODBC3SQLBrowseConnect:
+ pFunction = (oslGenericFunction)pODBC3SQLBrowseConnect;
+ break;
+ case ODBC3SQLDataSources:
+ pFunction = (oslGenericFunction)pODBC3SQLDataSources;
+ break;
+ case ODBC3SQLDrivers:
+ pFunction = (oslGenericFunction)pODBC3SQLDrivers;
+ break;
+ case ODBC3SQLGetInfo:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetInfo;
+ break;
+ case ODBC3SQLGetFunctions:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetFunctions;
+ break;
+ case ODBC3SQLGetTypeInfo:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetTypeInfo;
+ break;
+ case ODBC3SQLSetConnectAttr:
+
+ pFunction = (oslGenericFunction)pODBC3SQLSetConnectAttr;
+ break;
+ case ODBC3SQLGetConnectAttr:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetConnectAttr;
+ break;
+ case ODBC3SQLSetEnvAttr:
+
+ pFunction = (oslGenericFunction)pODBC3SQLSetEnvAttr;
+ break;
+ case ODBC3SQLGetEnvAttr:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetEnvAttr;
+ break;
+ case ODBC3SQLSetStmtAttr:
+
+ pFunction = (oslGenericFunction)pODBC3SQLSetStmtAttr;
+ break;
+ case ODBC3SQLGetStmtAttr:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetStmtAttr;
+ break;
+ case ODBC3SQLPrepare:
+
+ pFunction = (oslGenericFunction)pODBC3SQLPrepare;
+ break;
+ case ODBC3SQLBindParameter:
+
+ pFunction = (oslGenericFunction)pODBC3SQLBindParameter;
+ break;
+ case ODBC3SQLSetCursorName:
+
+ pFunction = (oslGenericFunction)pODBC3SQLSetCursorName;
+ break;
+ case ODBC3SQLExecute:
+
+ pFunction = (oslGenericFunction)pODBC3SQLExecute;
+ break;
+ case ODBC3SQLExecDirect:
+
+ pFunction = (oslGenericFunction)pODBC3SQLExecDirect;
+ break;
+ case ODBC3SQLDescribeParam:
+
+ pFunction = (oslGenericFunction)pODBC3SQLDescribeParam;
+ break;
+ case ODBC3SQLNumParams:
+
+ pFunction = (oslGenericFunction)pODBC3SQLNumParams;
+ break;
+ case ODBC3SQLParamData:
+
+ pFunction = (oslGenericFunction)pODBC3SQLParamData;
+ break;
+ case ODBC3SQLPutData:
+
+ pFunction = (oslGenericFunction)pODBC3SQLPutData;
+ break;
+ case ODBC3SQLRowCount:
+
+ pFunction = (oslGenericFunction)pODBC3SQLRowCount;
+ break;
+ case ODBC3SQLNumResultCols:
+
+ pFunction = (oslGenericFunction)pODBC3SQLNumResultCols;
+ break;
+ case ODBC3SQLDescribeCol:
+
+ pFunction = (oslGenericFunction)pODBC3SQLDescribeCol;
+ break;
+ case ODBC3SQLColAttribute:
+
+ pFunction = (oslGenericFunction)pODBC3SQLColAttribute;
+ break;
+ case ODBC3SQLBindCol:
+
+ pFunction = (oslGenericFunction)pODBC3SQLBindCol;
+ break;
+ case ODBC3SQLFetch:
+
+ pFunction = (oslGenericFunction)pODBC3SQLFetch;
+ break;
+ case ODBC3SQLFetchScroll:
+
+ pFunction = (oslGenericFunction)pODBC3SQLFetchScroll;
+ break;
+ case ODBC3SQLGetData:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetData;
+ break;
+ case ODBC3SQLSetPos:
+
+ pFunction = (oslGenericFunction)pODBC3SQLSetPos;
+ break;
+ case ODBC3SQLBulkOperations:
+
+ pFunction = (oslGenericFunction)pODBC3SQLBulkOperations;
+ break;
+ case ODBC3SQLMoreResults:
+
+ pFunction = (oslGenericFunction)pODBC3SQLMoreResults;
+ break;
+ case ODBC3SQLGetDiagRec:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetDiagRec;
+ break;
+ case ODBC3SQLColumnPrivileges:
+
+ pFunction = (oslGenericFunction)pODBC3SQLColumnPrivileges;
+ break;
+ case ODBC3SQLColumns:
+
+ pFunction = (oslGenericFunction)pODBC3SQLColumns;
+ break;
+ case ODBC3SQLForeignKeys:
+
+ pFunction = (oslGenericFunction)pODBC3SQLForeignKeys;
+ break;
+ case ODBC3SQLPrimaryKeys:
+
+ pFunction = (oslGenericFunction)pODBC3SQLPrimaryKeys;
+ break;
+ case ODBC3SQLProcedureColumns:
+
+ pFunction = (oslGenericFunction)pODBC3SQLProcedureColumns;
+ break;
+ case ODBC3SQLProcedures:
+
+ pFunction = (oslGenericFunction)pODBC3SQLProcedures;
+ break;
+ case ODBC3SQLSpecialColumns:
+
+ pFunction = (oslGenericFunction)pODBC3SQLSpecialColumns;
+ break;
+ case ODBC3SQLStatistics:
+
+ pFunction = (oslGenericFunction)pODBC3SQLStatistics;
+ break;
+ case ODBC3SQLTablePrivileges:
+
+ pFunction = (oslGenericFunction)pODBC3SQLTablePrivileges;
+ break;
+ case ODBC3SQLTables:
+
+ pFunction = (oslGenericFunction)pODBC3SQLTables;
+ break;
+ case ODBC3SQLFreeStmt:
+
+ pFunction = (oslGenericFunction)pODBC3SQLFreeStmt;
+ break;
+ case ODBC3SQLCloseCursor:
+
+ pFunction = (oslGenericFunction)pODBC3SQLCloseCursor;
+ break;
+ case ODBC3SQLCancel:
+
+ pFunction = (oslGenericFunction)pODBC3SQLCancel;
+ break;
+ case ODBC3SQLEndTran:
+
+ pFunction = (oslGenericFunction)pODBC3SQLEndTran;
+ break;
+ case ODBC3SQLDisconnect:
+
+ pFunction = (oslGenericFunction)pODBC3SQLDisconnect;
+ break;
+ case ODBC3SQLFreeHandle:
+
+ pFunction = (oslGenericFunction)pODBC3SQLFreeHandle;
+ break;
+ case ODBC3SQLGetCursorName:
+
+ pFunction = (oslGenericFunction)pODBC3SQLGetCursorName;
+ break;
+ case ODBC3SQLNativeSql:
+
+ pFunction = (oslGenericFunction)pODBC3SQLNativeSql;
+ break;
+ default:
+ OSL_ENSURE(0,"Function unknown!");
+ }
+ 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(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(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(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(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(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(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())
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_NO_DISK_SPACE,
+ "$filename$",_FileName
+ ) );
+ ::dbtools::throwGenericSQLException(sError,*this);
+ }
+ (*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)
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_NO_DISK_SPACE,
+ "$filename$",_FileName
+ ) );
+ ::dbtools::throwGenericSQLException(sError,*this);
+ }
+
+ 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(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)
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_COMMAND_NOT_FOUND,
+ "$databasename$",sDBName,
+ "$progname$",sCommand
+ ) );
+ ::dbtools::throwGenericSQLException(sError,*this);
+ }
+ 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(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(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(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(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(WNT)
+ String sPhysicalPath;
+ LocalFileHelper::ConvertURLToPhysicalName(aCmdFile.GetURL(),sPhysicalPath);
+ chmod(ByteString(sPhysicalPath,gsl_getSystemTextEncoding()).GetBuffer(),S_IRUSR|S_IWUSR|S_IXUSR);
+#endif
+
+#if !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(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(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(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(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())
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceString(STR_DATABASE_NEEDS_CONVERTING) );
+ ::dbtools::throwGenericSQLException(sError,*this);
+ }
+ 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
+// -----------------------------------------------------------------------------
+
+
+
+