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