| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_connectivity.hxx" |
| #include <cppuhelper/typeprovider.hxx> |
| #include "adabas/BConnection.hxx" |
| #include "adabas/BDriver.hxx" |
| #include "adabas/BCatalog.hxx" |
| #include "odbc/OFunctions.hxx" |
| #include "odbc/OTools.hxx" |
| #ifndef _CONNECTIVITY_ODBC_ODATABASEMETADATA_HXX_ |
| #include "adabas/BDatabaseMetaData.hxx" |
| #endif |
| #include "adabas/BStatement.hxx" |
| #include "adabas/BPreparedStatement.hxx" |
| #include <com/sun/star/lang/DisposedException.hpp> |
| #include <connectivity/dbcharset.hxx> |
| #include "connectivity/sqliterator.hxx" |
| #include <connectivity/sqlparse.hxx> |
| |
| #include <string.h> |
| |
| using namespace connectivity::adabas; |
| using namespace connectivity; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::sdbcx; |
| using namespace ::com::sun::star::sdbc; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::lang; |
| |
| |
| //------------------------------------------------------------------------------ |
| namespace starlang = ::com::sun::star::lang; |
| // -------------------------------------------------------------------------------- |
| OAdabasConnection::OAdabasConnection(const SQLHANDLE _pDriverHandle, connectivity::odbc::ODBCDriver* _pDriver) |
| : OConnection_BASE2(_pDriverHandle,_pDriver) |
| { |
| m_bUseOldDateFormat = sal_True; |
| } |
| //----------------------------------------------------------------------------- |
| SQLRETURN OAdabasConnection::Construct( const ::rtl::OUString& url,const Sequence< PropertyValue >& info) throw(SQLException) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| |
| m_aConnectionHandle = SQL_NULL_HANDLE; |
| setURL(url); |
| setConnectionInfo(info); |
| |
| // Connection allozieren |
| N3SQLAllocHandle(SQL_HANDLE_DBC,m_pDriverHandleCopy,&m_aConnectionHandle); |
| if(m_aConnectionHandle == SQL_NULL_HANDLE) |
| throw SQLException(); |
| |
| const PropertyValue *pBegin = info.getConstArray(); |
| const PropertyValue *pEnd = pBegin + info.getLength(); |
| ::rtl::OUString sHostName; |
| |
| sal_Int32 nLen = url.indexOf(':'); |
| nLen = url.indexOf(':',nLen+1); |
| ::rtl::OUString aDSN(url.copy(nLen+1)),aUID,aPWD; |
| sal_Int32 nTimeout = 20; |
| for(;pBegin != pEnd;++pBegin) |
| { |
| if ( !pBegin->Name.compareToAscii("Timeout") ) |
| pBegin->Value >>= nTimeout; |
| else if(!pBegin->Name.compareToAscii("user")) |
| pBegin->Value >>= aUID; |
| else if(!pBegin->Name.compareToAscii("password")) |
| pBegin->Value >>= aPWD; |
| else if(!pBegin->Name.compareToAscii("HostName")) |
| pBegin->Value >>= sHostName; |
| else if(0 == pBegin->Name.compareToAscii("CharSet")) |
| { |
| ::rtl::OUString sIanaName; |
| OSL_VERIFY( pBegin->Value >>= sIanaName ); |
| |
| ::dbtools::OCharsetMap aLookupIanaName; |
| ::dbtools::OCharsetMap::const_iterator aLookup = aLookupIanaName.find(sIanaName, ::dbtools::OCharsetMap::IANA()); |
| if (aLookup != aLookupIanaName.end()) |
| m_nTextEncoding = (*aLookup).getEncoding(); |
| else |
| m_nTextEncoding = RTL_TEXTENCODING_DONTKNOW; |
| if(m_nTextEncoding == RTL_TEXTENCODING_DONTKNOW) |
| m_nTextEncoding = osl_getThreadTextEncoding(); |
| } |
| } |
| m_sUser = aUID; |
| |
| if( !sHostName.isEmpty() ) |
| aDSN = sHostName + ::rtl::OUString::createFromAscii(":") + aDSN; |
| SQLRETURN nSQLRETURN = openConnectionWithAuth(aDSN,nTimeout, aUID,aPWD); |
| |
| return nSQLRETURN; |
| } |
| //----------------------------------------------------------------------------- |
| SQLRETURN OAdabasConnection::openConnectionWithAuth(const ::rtl::OUString& aConnectStr,sal_Int32 nTimeOut, const ::rtl::OUString& _uid,const ::rtl::OUString& _pwd) |
| { |
| if (m_aConnectionHandle == SQL_NULL_HANDLE) |
| return -1; |
| |
| SQLRETURN nSQLRETURN = 0; |
| SDB_ODBC_CHAR szDSN[4096]; |
| SDB_ODBC_CHAR szUID[20]; |
| SDB_ODBC_CHAR szPWD[20]; |
| |
| memset(szDSN,'\0',4096); |
| memset(szUID,'\0',20); |
| memset(szPWD,'\0',20); |
| |
| ::rtl::OString aConStr(::rtl::OUStringToOString(aConnectStr,getTextEncoding())); |
| ::rtl::OString aUID(::rtl::OUStringToOString(_uid,getTextEncoding())); |
| ::rtl::OString aPWD(::rtl::OUStringToOString(_pwd,getTextEncoding())); |
| memcpy(szDSN, (SDB_ODBC_CHAR*) aConStr.getStr(), ::std::min<sal_Int32>((sal_Int32)2048,aConStr.getLength())); |
| memcpy(szUID, (SDB_ODBC_CHAR*) aUID.getStr(), ::std::min<sal_Int32>((sal_Int32)20,aUID.getLength())); |
| memcpy(szPWD, (SDB_ODBC_CHAR*) aPWD.getStr(), ::std::min<sal_Int32>((sal_Int32)20,aPWD.getLength())); |
| |
| |
| |
| N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_LOGIN_TIMEOUT,(SQLPOINTER)nTimeOut,SQL_IS_INTEGER); |
| // Verbindung aufbauen |
| |
| nSQLRETURN = N3SQLConnect(m_aConnectionHandle, |
| szDSN, |
| (SQLSMALLINT) ::std::min<sal_Int32>((sal_Int32)2048,aConStr.getLength()), |
| szUID, |
| (SQLSMALLINT) ::std::min<sal_Int32>((sal_Int32)20,aUID.getLength()), |
| szPWD, |
| (SQLSMALLINT) ::std::min<sal_Int32>((sal_Int32)20,aPWD.getLength())); |
| if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA) |
| return nSQLRETURN; |
| |
| m_bClosed = sal_False; |
| |
| // autocoomit ist immer default |
| |
| N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_ON,SQL_IS_INTEGER); |
| |
| return nSQLRETURN; |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OAdabasConnection::disposing() |
| { |
| ::osl::MutexGuard aGuard(m_aMutex); |
| |
| Reference< XTablesSupplier > xTableSupplier(m_xCatalog); |
| ::comphelper::disposeComponent(xTableSupplier); |
| |
| m_xCatalog = WeakReference< XTablesSupplier >(); |
| |
| OConnection_BASE2::disposing(); |
| } |
| //------------------------------------------------------------------------------ |
| Reference< XTablesSupplier > OAdabasConnection::createCatalog() |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| Reference< XTablesSupplier > xTab = m_xCatalog; |
| if(!xTab.is()) |
| { |
| xTab = new OAdabasCatalog(m_aConnectionHandle,this); |
| m_xCatalog = xTab; |
| } |
| return xTab; |
| } |
| // -------------------------------------------------------------------------------- |
| Reference< XDatabaseMetaData > SAL_CALL OAdabasConnection::getMetaData( ) throw(SQLException, RuntimeException) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| checkDisposed(OConnection_BASE2::rBHelper.bDisposed); |
| |
| |
| Reference< XDatabaseMetaData > xMetaData = m_xMetaData; |
| if(!xMetaData.is()) |
| { |
| xMetaData = new OAdabasDatabaseMetaData(m_aConnectionHandle,this); |
| m_xMetaData = xMetaData; |
| } |
| |
| return xMetaData; |
| } |
| // -------------------------------------------------------------------------------- |
| Reference< XStatement > SAL_CALL OAdabasConnection::createStatement( ) throw(SQLException, RuntimeException) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| checkDisposed(OConnection_BASE2::rBHelper.bDisposed); |
| |
| Reference< XStatement > xReturn = new OAdabasStatement(this); |
| m_aStatements.push_back(WeakReferenceHelper(xReturn)); |
| return xReturn; |
| } |
| // -------------------------------------------------------------------------------- |
| Reference< XPreparedStatement > SAL_CALL OAdabasConnection::prepareStatement( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) |
| { |
| ::osl::MutexGuard aGuard( m_aMutex ); |
| checkDisposed(OConnection_BASE2::rBHelper.bDisposed); |
| |
| Reference< XPreparedStatement > xReturn = new OAdabasPreparedStatement(this,sql); |
| m_aStatements.push_back(WeakReferenceHelper(xReturn)); |
| return xReturn; |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Int64 SAL_CALL OAdabasConnection::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw (::com::sun::star::uno::RuntimeException) |
| { |
| return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) |
| ? reinterpret_cast< sal_Int64 >( this ) |
| : OConnection_BASE2::getSomething(rId); |
| } |
| // ----------------------------------------------------------------------------- |
| Sequence< sal_Int8 > OAdabasConnection::getUnoTunnelImplementationId() |
| { |
| static ::cppu::OImplementationId * pId = 0; |
| if (! pId) |
| { |
| ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); |
| if (! pId) |
| { |
| static ::cppu::OImplementationId aId; |
| pId = &aId; |
| } |
| } |
| return pId->getImplementationId(); |
| } |
| // ----------------------------------------------------------------------------- |
| ::connectivity::odbc::OConnection* OAdabasConnection::cloneConnection() |
| { |
| return new OAdabasConnection(m_pDriverHandleCopy,m_pDriver); |
| } |
| // ----------------------------------------------------------------------------- |
| ::vos::ORef<OSQLColumns> OAdabasConnection::createSelectColumns(const ::rtl::OUString& _rSql) |
| { |
| ::vos::ORef<OSQLColumns> aRet; |
| OSQLParser aParser(getDriver()->getORB()); |
| ::rtl::OUString sErrorMessage; |
| OSQLParseNode* pNode = aParser.parseTree(sErrorMessage,_rSql); |
| if(pNode) |
| { |
| Reference< XTablesSupplier> xCata = createCatalog(); |
| OSQLParseTreeIterator aParseIter(this, xCata->getTables(), |
| aParser, pNode); |
| aParseIter.traverseAll(); |
| aRet = aParseIter.getSelectColumns(); |
| } |
| return aRet; |
| } |
| // ----------------------------------------------------------------------------- |
| |
| |
| |