1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #include "dsmeta.hxx" 29 #include <connectivity/DriversConfig.hxx> 30 #include "dsntypes.hxx" 31 #include <comphelper/processfactory.hxx> 32 /** === begin UNO includes === **/ 33 /** === end UNO includes === **/ 34 35 #include <map> 36 37 //........................................................................ 38 namespace dbaui 39 { 40 //........................................................................ 41 42 /** === begin UNO using === **/ 43 using namespace dbaccess; 44 using namespace ::com::sun::star; 45 /** === end UNO using === **/ 46 47 struct FeatureSupport 48 { 49 // authentication mode of the data source 50 AuthenticationMode eAuthentication; 51 52 FeatureSupport() 53 :eAuthentication( AuthUserPwd ) 54 { 55 } 56 57 FeatureSupport( AuthenticationMode _Auth ) 58 :eAuthentication( _Auth ) 59 { 60 } 61 }; 62 63 struct FeatureMapping 64 { 65 /// one of the items from dsitems.hxx 66 ItemID nItemID; 67 const sal_Char* pAsciiFeatureName; 68 }; 69 70 //==================================================================== 71 //= global tables 72 //==================================================================== 73 //-------------------------------------------------------------------- 74 static const FeatureMapping* lcl_getFeatureMappings() 75 { 76 static const FeatureMapping s_aMappings[] = { 77 { DSID_AUTORETRIEVEENABLED, "GeneratedValues" }, 78 { DSID_AUTOINCREMENTVALUE, "GeneratedValues" }, 79 { DSID_AUTORETRIEVEVALUE, "GeneratedValues" }, 80 { DSID_SQL92CHECK, "UseSQL92NamingConstraints" }, 81 { DSID_APPEND_TABLE_ALIAS, "AppendTableAliasInSelect" }, 82 { DSID_AS_BEFORE_CORRNAME, "UseKeywordAsBeforeAlias" }, 83 { DSID_ENABLEOUTERJOIN, "UseBracketedOuterJoinSyntax" }, 84 { DSID_IGNOREDRIVER_PRIV, "IgnoreDriverPrivileges" }, 85 { DSID_PARAMETERNAMESUBST, "ParameterNameSubstitution" }, 86 { DSID_SUPPRESSVERSIONCL, "DisplayVersionColumns" }, 87 { DSID_CATALOG, "UseCatalogInSelect" }, 88 { DSID_SCHEMA, "UseSchemaInSelect" }, 89 { DSID_INDEXAPPENDIX, "UseIndexDirectionKeyword" }, 90 { DSID_DOSLINEENDS, "UseDOSLineEnds" }, 91 { DSID_BOOLEANCOMPARISON, "BooleanComparisonMode" }, 92 { DSID_CHECK_REQUIRED_FIELDS, "FormsCheckRequiredFields" }, 93 { DSID_IGNORECURRENCY, "IgnoreCurrency" }, 94 { DSID_ESCAPE_DATETIME, "EscapeDateTime" }, 95 { DSID_PRIMARY_KEY_SUPPORT, "PrimaryKeySupport" }, 96 { DSID_RESPECTRESULTSETTYPE, "RespectDriverResultSetType" }, 97 { DSID_MAX_ROW_SCAN, "MaxRowScan" }, 98 { 0, NULL } 99 }; 100 return s_aMappings; 101 } 102 103 //-------------------------------------------------------------------- 104 static const FeatureSet& lcl_getFeatureSet( const ::rtl::OUString _rURL ) 105 { 106 typedef ::std::map< ::rtl::OUString, FeatureSet, ::comphelper::UStringLess > FeatureSets; 107 static FeatureSets s_aFeatureSets; 108 if ( s_aFeatureSets.empty() ) 109 { 110 ::connectivity::DriversConfig aDriverConfig( ::comphelper::getProcessServiceFactory() ); 111 const uno::Sequence< ::rtl::OUString > aPatterns = aDriverConfig.getURLs(); 112 for ( const ::rtl::OUString* pattern = aPatterns.getConstArray(); 113 pattern != aPatterns.getConstArray() + aPatterns.getLength(); 114 ++pattern 115 ) 116 { 117 FeatureSet aCurrentSet; 118 const ::comphelper::NamedValueCollection aCurrentFeatures( aDriverConfig.getFeatures( *pattern ).getNamedValues() ); 119 120 const FeatureMapping* pFeatureMapping = lcl_getFeatureMappings(); 121 while ( pFeatureMapping->pAsciiFeatureName ) 122 { 123 if ( aCurrentFeatures.has( pFeatureMapping->pAsciiFeatureName ) ) 124 aCurrentSet.put( pFeatureMapping->nItemID ); 125 ++pFeatureMapping; 126 } 127 128 s_aFeatureSets[ *pattern ] = aCurrentSet; 129 } 130 } 131 132 OSL_ENSURE( s_aFeatureSets.find( _rURL ) != s_aFeatureSets.end(), "invalid URL/pattern!" ); 133 return s_aFeatureSets[ _rURL ]; 134 } 135 136 //-------------------------------------------------------------------- 137 static AuthenticationMode getAuthenticationMode( const ::rtl::OUString& _sURL ) 138 { 139 DECLARE_STL_USTRINGACCESS_MAP( FeatureSupport, Supported); 140 static Supported s_aSupport; 141 if ( s_aSupport.empty() ) 142 { 143 ::connectivity::DriversConfig aDriverConfig(::comphelper::getProcessServiceFactory()); 144 const uno::Sequence< ::rtl::OUString > aURLs = aDriverConfig.getURLs(); 145 const ::rtl::OUString* pIter = aURLs.getConstArray(); 146 const ::rtl::OUString* pEnd = pIter + aURLs.getLength(); 147 for(;pIter != pEnd;++pIter) 148 { 149 FeatureSupport aInit( AuthNone ); 150 const ::comphelper::NamedValueCollection& aMetaData = aDriverConfig.getMetaData(*pIter); 151 if ( aMetaData.has("Authentication") ) 152 { 153 ::rtl::OUString sAuth; 154 aMetaData.get("Authentication") >>= sAuth; 155 if ( sAuth.equalsAscii("UserPassword") ) 156 aInit = AuthUserPwd; 157 else if ( sAuth.equalsAscii("Password") ) 158 aInit = AuthPwd; 159 } 160 s_aSupport.insert(Supported::value_type(*pIter,aInit)); 161 } 162 } 163 OSL_ENSURE(s_aSupport.find(_sURL) != s_aSupport.end(),"Illegal URL!"); 164 return s_aSupport[ _sURL ].eAuthentication; 165 } 166 167 //==================================================================== 168 //= DataSourceMetaData_Impl 169 //==================================================================== 170 class DataSourceMetaData_Impl 171 { 172 public: 173 DataSourceMetaData_Impl( const ::rtl::OUString& _sURL ); 174 175 inline ::rtl::OUString getType() const { return m_sURL; } 176 177 private: 178 const ::rtl::OUString m_sURL; 179 }; 180 181 //-------------------------------------------------------------------- 182 DataSourceMetaData_Impl::DataSourceMetaData_Impl( const ::rtl::OUString& _sURL ) 183 :m_sURL( _sURL ) 184 { 185 } 186 187 //==================================================================== 188 //= DataSourceMetaData 189 //==================================================================== 190 //-------------------------------------------------------------------- 191 DataSourceMetaData::DataSourceMetaData( const ::rtl::OUString& _sURL ) 192 :m_pImpl( new DataSourceMetaData_Impl( _sURL ) ) 193 { 194 } 195 196 //-------------------------------------------------------------------- 197 DataSourceMetaData::~DataSourceMetaData() 198 { 199 } 200 201 //-------------------------------------------------------------------- 202 const FeatureSet& DataSourceMetaData::getFeatureSet() const 203 { 204 return lcl_getFeatureSet( m_pImpl->getType() ); 205 } 206 207 //-------------------------------------------------------------------- 208 AuthenticationMode DataSourceMetaData::getAuthentication( const ::rtl::OUString& _sURL ) 209 { 210 return getAuthenticationMode( _sURL ); 211 } 212 213 //........................................................................ 214 } // namespace dbaui 215 //........................................................................ 216