/************************************************************************* * * $RCSfile: UITools.cxx,v $ * * $Revision: 1.9 $ * * last change: $Author: oj $ $Date: 2001-06-29 11:56:55 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library 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 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an AS IS basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifndef DBAUI_TOOLS_HXX #include "UITools.hxx" #endif #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC #include "dbustrings.hrc" #endif #ifndef _CONNECTIVITY_DBTOOLS_HXX_ #include #endif #ifndef _COMPHELPER_EXTRACT_HXX_ #include #endif #ifndef _COM_SUN_STAR_SDB_XCOMPLETEDCONNECTION_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDBCX_XKEYSSUPPLIER_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_ #include #endif #ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_ #include #endif #ifndef _COM_SUN_STAR_UI_DIALOGS_XEXECUTABLEDIALOG_HPP_ #include #endif #ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ #include #endif #ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_ #include #endif #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ #include #endif #ifndef _TOOLKIT_AWT_VCLXWINDOW_HXX_ #include #endif #ifndef _VCL_STDTEXT_HXX #include #endif #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSETINFO_HPP_ #include #endif #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ #include #endif #ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ #include #endif #ifndef DBAUI_TYPEINFO_HXX #include "TypeInfo.hxx" #endif // ......................................................................... namespace dbaui { // ......................................................................... using namespace ::dbtools; using namespace ::comphelper; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::task; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::sdb; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::util; using namespace ::com::sun::star::ui::dialogs; // ----------------------------------------------------------------------------- void composeTableName( const Reference< XDatabaseMetaData >& _rxMetaData, const Reference< XPropertySet >& _rxTable, ::rtl::OUString& _rComposedName, sal_Bool _bQuote) { OSL_ENSURE(_rxTable.is(),"Table can not be null!"); if(_rxTable.is()) { Reference< XPropertySetInfo > xInfo = _rxTable->getPropertySetInfo(); if(xInfo->hasPropertyByName(PROPERTY_CATALOGNAME) && xInfo->hasPropertyByName(PROPERTY_SCHEMANAME) && xInfo->hasPropertyByName(PROPERTY_NAME)) { ::rtl::OUString aCatalog,aSchema,aTable; _rxTable->getPropertyValue(PROPERTY_CATALOGNAME)>>= aCatalog; _rxTable->getPropertyValue(PROPERTY_SCHEMANAME) >>= aSchema; _rxTable->getPropertyValue(PROPERTY_NAME) >>= aTable; ::dbtools::composeTableName(_rxMetaData,aCatalog,aSchema,aTable,_rComposedName,_bQuote); } } } // ----------------------------------------------------------------------------- SQLExceptionInfo createConnection( const ::rtl::OUString& _rsDataSourceName, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _xDatabaseContext, const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rMF, ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener>& _rEvtLst, ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _rOUTConnection ) { Any aValue; try { aValue = _xDatabaseContext->getByName(_rsDataSourceName); } catch(Exception&) { } SQLExceptionInfo aInfo; Reference xProp; aValue >>= xProp; if (!xProp.is()) { OSL_ENSURE(0,"createConnection: coult not retrieve the data source!"); return aInfo; } ::rtl::OUString sPwd, sUser; sal_Bool bPwdReq = sal_False; try { xProp->getPropertyValue(PROPERTY_PASSWORD) >>= sPwd; bPwdReq = ::cppu::any2bool(xProp->getPropertyValue(PROPERTY_ISPASSWORDREQUIRED)); xProp->getPropertyValue(PROPERTY_USER) >>= sUser; } catch(Exception&) { OSL_ENSURE(0,"createConnection: error while retrieving data source properties!"); } try { if(bPwdReq && !sPwd.getLength()) { // password required, but empty -> connect using an interaction handler Reference xConnectionCompletion(xProp, UNO_QUERY); if (!xConnectionCompletion.is()) { OSL_ENSURE(0,"createConnection: missing an interface ... need an error message here!"); } else { // instantiate the default SDB interaction handler Reference< XInteractionHandler > xHandler(_rMF->createInstance(SERVICE_SDB_INTERACTION_HANDLER), UNO_QUERY); if (!xHandler.is()) { OSL_ENSURE(sal_False, "createConnection: could not instantiate an interaction handler!"); // ShowServiceNotAvailableError(NULL, String(SERVICE_SDB_INTERACTION_HANDLER), sal_True); // TODO: a real parent! } else _rOUTConnection = xConnectionCompletion->connectWithCompletion(xHandler); } } else { Reference xDataSource(xProp,UNO_QUERY); _rOUTConnection = xDataSource->getConnection(sUser, sPwd); } // be notified when connection is in disposing Reference< XComponent > xComponent(_rOUTConnection, UNO_QUERY); if (xComponent.is() && _rEvtLst.is()) xComponent->addEventListener(_rEvtLst); } catch(SQLContext& e) { aInfo = SQLExceptionInfo(e); } catch(SQLWarning& e) { aInfo = SQLExceptionInfo(e); } catch(SQLException& e) { aInfo = SQLExceptionInfo(e); } catch(Exception&) { OSL_ENSURE(0,"SbaTableQueryBrowser::OnExpandEntry: could not connect - unknown exception!"); } // showError(aInfo); return aInfo; } // ----------------------------------------------------------------------------- void showError(const SQLExceptionInfo& _rInfo,Window* _pParent,const Reference< XMultiServiceFactory >& _xFactory) { OSL_ENSURE(_pParent,"showError: Parent window must be NOT NULL!"); ::dbtools::showError(_rInfo,VCLUnoHelper::GetInterface(_pParent),_xFactory); } // ----------------------------------------------------------------------------- ::std::vector< Reference > getKeyColumns(const Reference& _rxTable, sal_Int32 _nKeyType) { // use keys and indexes for excat postioning // first the keys Reference xKeySup(_rxTable,UNO_QUERY); Reference xKeys; if(xKeySup.is()) xKeys = xKeySup->getKeys(); ::std::vector< Reference > vRet; if(xKeys.is()) { Reference xProp; for(sal_Int32 i=0;i< xKeys->getCount();++i) { xKeys->getByIndex(i) >>= xProp; sal_Int32 nKeyType = 0; xProp->getPropertyValue(PROPERTY_TYPE) >>= nKeyType; if(_nKeyType == nKeyType) { Reference xKeyColsSup(xProp,UNO_QUERY); OSL_ENSURE(xKeyColsSup.is(),"Columnsupplier is null!"); vRet.push_back(xKeyColsSup->getColumns()); } } } return vRet; } const OTypeInfo* getTypeInfoFromType(const OTypeInfoMap& _rTypeInfo, sal_Int32 _nType, const ::rtl::OUString& _sTypeName, sal_Int32 _nPrecision, sal_Int32 _nScale, sal_Bool& _brForceToType) { const OTypeInfo* pTypeInfo = NULL; _brForceToType = sal_False; // search for type ::std::pair aPair = _rTypeInfo.equal_range(_nType); OTypeInfoMap::const_iterator aIter = aPair.first; if(aIter != _rTypeInfo.end()) // compare with end is correct here { for(;aIter != aPair.second;++aIter) { // search the best matching type #ifdef DBG_UTIL ::rtl::OUString sDBTypeName = aIter->second->aTypeName; sal_Int32 nDBTypePrecision = aIter->second->nPrecision; sal_Int32 nDBTypeScale = aIter->second->nMaximumScale; #endif if ( ( !_sTypeName.getLength() || (aIter->second->aTypeName == _sTypeName) ) && (aIter->second->nPrecision >= _nPrecision) && (aIter->second->nMaximumScale >= _nScale) ) break; } if (aIter == aPair.second) { for(aIter = aPair.first; aIter != aPair.second; ++aIter) { // search the best matching type (now comparing the local names) if ( (aIter->second->aLocalTypeName == _sTypeName) && (aIter->second->nPrecision >= _nPrecision) && (aIter->second->nMaximumScale >= _nScale) ) { OSL_ENSURE(sal_False, ( ::rtl::OString("getTypeInfoFromType: assuming column type ") += ::rtl::OString(aIter->second->aTypeName.getStr(), aIter->second->aTypeName.getLength(), gsl_getSystemTextEncoding()) += ::rtl::OString("\" (expected type name ") += ::rtl::OString(_sTypeName.getStr(), _sTypeName.getLength(), gsl_getSystemTextEncoding()) += ::rtl::OString(" matches the type's local name).")).getStr()); break; } } } if (aIter == aPair.second) { // no match for the names, no match for the local names // -> drop the precision and the scale restriction, accept any type with the property // type id (nType) OSL_ENSURE(sal_False, ( ::rtl::OString("getTypeInfoFromType: did not find a matching type") += ::rtl::OString(" (expected type name: ") += ::rtl::OString(_sTypeName.getStr(), _sTypeName.getLength(), gsl_getSystemTextEncoding()) += ::rtl::OString(")! Defaulting to the first matching type.")).getStr()); pTypeInfo = aPair.first->second; _brForceToType = sal_True; } else pTypeInfo = aIter->second; } else OSL_ENSURE(sal_False, "getTypeInfoFromType: no type info found for this type!"); return pTypeInfo; } // ......................................................................... } // .........................................................................