/************************************************************** * * 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 #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 #include #include "connectivity/sqliterator.hxx" #include #include 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)2048,aConStr.getLength())); memcpy(szUID, (SDB_ODBC_CHAR*) aUID.getStr(), ::std::min((sal_Int32)20,aUID.getLength())); memcpy(szPWD, (SDB_ODBC_CHAR*) aPWD.getStr(), ::std::min((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)2048,aConStr.getLength()), szUID, (SQLSMALLINT) ::std::min((sal_Int32)20,aUID.getLength()), szPWD, (SQLSMALLINT) ::std::min((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 OAdabasConnection::createSelectColumns(const ::rtl::OUString& _rSql) { ::vos::ORef 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; } // -----------------------------------------------------------------------------