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