/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" #include "LConnection.hxx" #include "LDatabaseMetaData.hxx" #include "LCatalog.hxx" #include #include #include "LPreparedStatement.hxx" #include "LStatement.hxx" #include #include #include #include #include #include #include "LDebug.hxx" #include "diagnose_ex.h" #include #include #include "resource/common_res.hrc" using namespace connectivity::evoab; using namespace connectivity::file; using namespace vos; typedef connectivity::file::OConnection OConnection_B; //------------------------------------------------------------------------------ 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::lang; ::rtl::OUString implGetExceptionMsg( Exception& e, const ::rtl::OUString& aExceptionType_ ) { ::rtl::OUString aExceptionType = aExceptionType_; if( aExceptionType.getLength() == 0 ) aExceptionType = ::rtl::OUString( ::rtl::OUString::createFromAscii("Unknown" ) ); ::rtl::OUString aTypeLine( ::rtl::OUString::createFromAscii("\nType: " ) ); aTypeLine += aExceptionType; ::rtl::OUString aMessageLine( ::rtl::OUString::createFromAscii("\nMessage: " ) ); aMessageLine += ::rtl::OUString( e.Message ); ::rtl::OUString aMsg(aTypeLine); aMsg += aMessageLine; return aMsg; } // Exception type unknown ::rtl::OUString implGetExceptionMsg( Exception& e ) { ::rtl::OUString aMsg = implGetExceptionMsg( e, ::rtl::OUString() ); return aMsg; } // -------------------------------------------------------------------------------- OEvoabConnection::OEvoabConnection(OEvoabDriver* _pDriver) : OConnection(_pDriver) ,m_bHeaderLine(sal_True) ,m_cFieldDelimiter(',') ,m_cStringDelimiter('"') ,m_cDecimalDelimiter('.') ,m_cThousandDelimiter(' ') { // Initialise m_aColumnAlias. m_aColumnAlias.setAlias(_pDriver->getFactory()); } //----------------------------------------------------------------------------- OEvoabConnection::~OEvoabConnection() { } // XServiceInfo // -------------------------------------------------------------------------------- IMPLEMENT_SERVICE_INFO(OEvoabConnection, "com.sun.star.sdbc.drivers.evoab.Connection", "com.sun.star.sdbc.Connection") //----------------------------------------------------------------------------- void OEvoabConnection::construct(const ::rtl::OUString& url,const Sequence< PropertyValue >& info) throw(SQLException) { osl_incrementInterlockedCount( &m_refCount ); EVO_TRACE_STRING("OEvoabConnection::construct()::url = %s\n", url ); ::rtl::OUString aCLICommand = getDriver()->getEvoab_CLI_EffectiveCommand(); ::rtl::OUString aWorkingDirPath = getDriver()->getWorkingDirPath(); ::rtl::OUString aArg1 = ::rtl::OUString::createFromAscii(OEvoabDriver::getEVOAB_CLI_ARG_LIST_FOLDERS()); ::rtl::OUString aArg2 = ::rtl::OUString::createFromAscii(OEvoabDriver::getEVOAB_CLI_ARG_OUTPUT_FILE_PREFIX()); aArg2 += aWorkingDirPath; aArg2 += getDriver()->getEvoFolderListFileName(); OArgumentList aArgs(2,&aArg1,&aArg2); EVO_TRACE_STRING("OEvoabConnection::construct()::aCLICommand = %s\n", aCLICommand ); EVO_TRACE_STRING("OEvoabConnection::construct()::aWorkingDirPath = %s\n", aWorkingDirPath ); EVO_TRACE_STRING("OEvoabConnection::construct()::aArg1 = %s\n", aArg1 ); EVO_TRACE_STRING("OEvoabConnection::construct()::aArg2 = %s\n", aArg2 ); OProcess aApp( aCLICommand,aWorkingDirPath); OSL_VERIFY_EQUALS( aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait | OProcess::TOption_SearchPath),aArgs), OProcess::E_None, "Error at execute evolution-addressbook-export to get VCards"); Sequence aDriverParam; ::std::vector aParam; aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("EnableSQL92Check"), 0, Any(), PropertyState_DIRECT_VALUE)); ::dbtools::OCharsetMap aLookupIanaName; ::dbtools::OCharsetMap::const_iterator aLookup = aLookupIanaName.find(RTL_TEXTENCODING_UTF8); aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("CharSet"), 0, makeAny((*aLookup).getIanaName()), PropertyState_DIRECT_VALUE)); aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("Extension"), 0, makeAny(getDriver()->getFileExt()), PropertyState_DIRECT_VALUE)); aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("HeaderLine"), 0, makeAny(m_bHeaderLine), PropertyState_DIRECT_VALUE)); aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("FieldDelimiter"), 0, makeAny(::rtl::OUString(&m_cFieldDelimiter,1)), PropertyState_DIRECT_VALUE)); aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("StringDelimiter"), 0, makeAny(::rtl::OUString(&m_cStringDelimiter,1)), PropertyState_DIRECT_VALUE)); aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("DecimalDelimiter"), 0, makeAny(::rtl::OUString(&m_cDecimalDelimiter,1)), PropertyState_DIRECT_VALUE)); aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("ThousandDelimiter"), 0, makeAny(::rtl::OUString(&m_cThousandDelimiter,1)), PropertyState_DIRECT_VALUE)); // build a new parameter sequence from the original parameters, appended by the new parameters from above PropertyValue *pParams = aParam.empty() ? 0 : &aParam[0]; aDriverParam = ::comphelper::concatSequences( info, Sequence< PropertyValue >( pParams, aParam.size() ) ); // transform "sdbc:address:evolution" part of URL to "sdbc:flat:file:///..." // sal_Int32 nLen = url.indexOf(':'); nLen = url.indexOf(':',nLen+1); ::rtl::OUString aAddrbookURI(url.copy(nLen+1)); // Get Scheme nLen = aAddrbookURI.indexOf(':'); ::rtl::OUString aAddrbookScheme; if ( nLen == -1 ) { // There isn't any subschema: - but could be just subschema if ( aAddrbookURI.getLength() > 0 ) { aAddrbookScheme= aAddrbookURI; } else { OSL_TRACE( "No subschema given!!!\n"); throwGenericSQLException(STR_URI_SYNTAX_ERROR ,*this); } } else { aAddrbookScheme = aAddrbookURI.copy(0, nLen); } EVO_TRACE_STRING("OEvoabConnection::construct()::URI = %s\n", aAddrbookURI ); EVO_TRACE_STRING("OEvoabConnection::construct()::Scheme = %s\n", aAddrbookScheme ); // // Now we have a URI convert it to a Evolution CLI flat file URI // // The Mapping being used is: // // * for Evolution // "sdbc:address:evolution:" -> "sdbc:flat:file:///(file path generated) rtl::OUString aEvoFlatURI; if ( aAddrbookScheme.compareToAscii( OEvoabDriver::getSDBC_SCHEME_EVOLUTION() ) == 0 ) { aEvoFlatURI = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "sdbc:flat:" )); } aEvoFlatURI += getDriver()->getWorkingDirURL(); EVO_TRACE_STRING("OEvoabConnection::construct()::m_aEvoFlatURI = %s\n", aEvoFlatURI ); //setURL(aEvoFlatURI); m_aEvoFlatURI = aEvoFlatURI; osl_decrementInterlockedCount( &m_refCount ); OConnection::construct(aEvoFlatURI,aDriverParam); } // -------------------------------------------------------------------------------- Reference< XDatabaseMetaData > SAL_CALL OEvoabConnection::getMetaData( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_B::rBHelper.bDisposed); Reference< XDatabaseMetaData > xMetaData = m_xMetaData; if(!xMetaData.is()) { xMetaData = new OEvoabDatabaseMetaData(this); m_xMetaData = xMetaData; } return xMetaData; } //------------------------------------------------------------------------------ ::com::sun::star::uno::Reference< XTablesSupplier > OEvoabConnection::createCatalog() { ::osl::MutexGuard aGuard( m_aMutex ); Reference< XTablesSupplier > xTab = m_xCatalog; if(!xTab.is()) { OEvoabCatalog *pCat = new OEvoabCatalog(this); xTab = pCat; m_xCatalog = xTab; } return xTab; } // -------------------------------------------------------------------------------- Reference< XStatement > SAL_CALL OEvoabConnection::createStatement( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_B::rBHelper.bDisposed); OEvoabStatement* pStmt = new OEvoabStatement(this); Reference< XStatement > xStmt = pStmt; m_aStatements.push_back(WeakReferenceHelper(*pStmt)); return xStmt; } // -------------------------------------------------------------------------------- Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareStatement( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_B::rBHelper.bDisposed); OEvoabPreparedStatement* pStmt = new OEvoabPreparedStatement(this); Reference< XPreparedStatement > xStmt = pStmt; pStmt->construct(sql); m_aStatements.push_back(WeakReferenceHelper(*pStmt)); return xStmt; } // -------------------------------------------------------------------------------- Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareCall( const ::rtl::OUString& /*sql*/ ) throw(SQLException, RuntimeException) { ::dbtools::throwFeatureNotImplementedException( "XConnection::prepareCall", *this ); return NULL; } // -------------------------------------------------------------------------