1*9b5730f6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9b5730f6SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9b5730f6SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9b5730f6SAndrew Rist  * distributed with this work for additional information
6*9b5730f6SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9b5730f6SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9b5730f6SAndrew Rist  * "License"); you may not use this file except in compliance
9*9b5730f6SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*9b5730f6SAndrew Rist  *
11*9b5730f6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*9b5730f6SAndrew Rist  *
13*9b5730f6SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9b5730f6SAndrew Rist  * software distributed under the License is distributed on an
15*9b5730f6SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9b5730f6SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9b5730f6SAndrew Rist  * specific language governing permissions and limitations
18*9b5730f6SAndrew Rist  * under the License.
19*9b5730f6SAndrew Rist  *
20*9b5730f6SAndrew Rist  *************************************************************/
21*9b5730f6SAndrew Rist 
22*9b5730f6SAndrew Rist 
23cdf0e10cSrcweir #include "precompiled_connectivity.hxx"
24cdf0e10cSrcweir #include "ParameterSubstitution.hxx"
25cdf0e10cSrcweir #include "connectivity/sqlparse.hxx"
26cdf0e10cSrcweir #include <comphelper/sequenceashashmap.hxx>
27cdf0e10cSrcweir 
28cdf0e10cSrcweir namespace connectivity
29cdf0e10cSrcweir {
30cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
31cdf0e10cSrcweir     using namespace ::com::sun::star::sdbc;
32cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
33cdf0e10cSrcweir     using namespace ::com::sun::star;
34cdf0e10cSrcweir 
ParameterSubstitution(const::com::sun::star::uno::Reference<::com::sun::star::uno::XComponentContext> & _rxContext)35cdf0e10cSrcweir     ParameterSubstitution::ParameterSubstitution(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext ) : m_xContext(_rxContext)
36cdf0e10cSrcweir     {
37cdf0e10cSrcweir     }
initialize(const uno::Sequence<uno::Any> & _aArguments)38cdf0e10cSrcweir     void SAL_CALL ParameterSubstitution::initialize( const uno::Sequence< uno::Any >& _aArguments ) throw (uno::Exception, uno::RuntimeException)
39cdf0e10cSrcweir     {
40cdf0e10cSrcweir         ::osl::MutexGuard aGuard(m_aMutex);
41cdf0e10cSrcweir         comphelper::SequenceAsHashMap aArgs(_aArguments);
42cdf0e10cSrcweir         uno::Reference< sdbc::XConnection > xConnection;
43cdf0e10cSrcweir         xConnection = aArgs.getUnpackedValueOrDefault(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ActiveConnection")),xConnection);
44cdf0e10cSrcweir         m_xConnection = xConnection;
45cdf0e10cSrcweir     }
46cdf0e10cSrcweir     //------------------------------------------------------------------------------
getImplementationName_Static()47cdf0e10cSrcweir 	rtl::OUString ParameterSubstitution::getImplementationName_Static(  ) throw(RuntimeException)
48cdf0e10cSrcweir 	{
49cdf0e10cSrcweir 		return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.comp.helper.ParameterSubstitution"));
50cdf0e10cSrcweir 	}
51cdf0e10cSrcweir 	//------------------------------------------------------------------------------
getImplementationName()52cdf0e10cSrcweir 	::rtl::OUString SAL_CALL ParameterSubstitution::getImplementationName(  ) throw(RuntimeException)
53cdf0e10cSrcweir 	{
54cdf0e10cSrcweir 		return getImplementationName_Static();
55cdf0e10cSrcweir 	}
56cdf0e10cSrcweir 	//------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)57cdf0e10cSrcweir 	sal_Bool SAL_CALL ParameterSubstitution::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
58cdf0e10cSrcweir 	{
59cdf0e10cSrcweir 		Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
60cdf0e10cSrcweir 		const ::rtl::OUString* pSupported = aSupported.getConstArray();
61cdf0e10cSrcweir 		const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
62cdf0e10cSrcweir 		for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
63cdf0e10cSrcweir 			;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir 		return pSupported != pEnd;
66cdf0e10cSrcweir 	}
67cdf0e10cSrcweir 	//------------------------------------------------------------------
getSupportedServiceNames()68cdf0e10cSrcweir 	Sequence< ::rtl::OUString > SAL_CALL ParameterSubstitution::getSupportedServiceNames(  ) throw(RuntimeException)
69cdf0e10cSrcweir 	{
70cdf0e10cSrcweir 		return getSupportedServiceNames_Static();
71cdf0e10cSrcweir 	}
72cdf0e10cSrcweir     //------------------------------------------------------------------
getSupportedServiceNames_Static()73cdf0e10cSrcweir     Sequence< ::rtl::OUString > ParameterSubstitution::getSupportedServiceNames_Static(  ) throw (RuntimeException)
74cdf0e10cSrcweir 	{
75cdf0e10cSrcweir 		Sequence< ::rtl::OUString > aSNS( 1 );
76cdf0e10cSrcweir 		aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.ParameterSubstitution");
77cdf0e10cSrcweir 		return aSNS;
78cdf0e10cSrcweir 	}
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	//------------------------------------------------------------------
create(const Reference<XComponentContext> & _xContext)81cdf0e10cSrcweir     Reference< XInterface >  ParameterSubstitution::create(const Reference< XComponentContext >& _xContext)
82cdf0e10cSrcweir     {
83cdf0e10cSrcweir         return *(new ParameterSubstitution(_xContext));
84cdf0e10cSrcweir     }
85cdf0e10cSrcweir 	//------------------------------------------------------------------
substituteVariables(const::rtl::OUString & _sText,::sal_Bool)86cdf0e10cSrcweir     ::rtl::OUString SAL_CALL ParameterSubstitution::substituteVariables( const ::rtl::OUString& _sText, ::sal_Bool /*bSubstRequired*/ ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException)
87cdf0e10cSrcweir     {
88cdf0e10cSrcweir         ::rtl::OUString sRet = _sText;
89cdf0e10cSrcweir         uno::Reference< sdbc::XConnection > xConnection = m_xConnection;
90cdf0e10cSrcweir         if ( xConnection.is() )
91cdf0e10cSrcweir         {
92cdf0e10cSrcweir             try
93cdf0e10cSrcweir 		    {
94cdf0e10cSrcweir                 uno::Reference< XMultiServiceFactory> xFac(m_xContext->getServiceManager(),uno::UNO_QUERY_THROW);
95cdf0e10cSrcweir 			    OSQLParser aParser( xFac );
96cdf0e10cSrcweir 			    ::rtl::OUString sErrorMessage;
97cdf0e10cSrcweir 			    ::rtl::OUString sNewSql;
98cdf0e10cSrcweir 			    OSQLParseNode* pNode = aParser.parseTree(sErrorMessage,_sText);
99cdf0e10cSrcweir 			    if(pNode)
100cdf0e10cSrcweir 			    {	// special handling for parameters
101cdf0e10cSrcweir 				    OSQLParseNode::substituteParameterNames(pNode);
102cdf0e10cSrcweir 				    pNode->parseNodeToStr( sNewSql, xConnection );
103cdf0e10cSrcweir 				    delete pNode;
104cdf0e10cSrcweir 				    sRet = sNewSql;
105cdf0e10cSrcweir 			    }
106cdf0e10cSrcweir 		    }
107cdf0e10cSrcweir 		    catch(const Exception&)
108cdf0e10cSrcweir 		    {
109cdf0e10cSrcweir 		    }
110cdf0e10cSrcweir         }
111cdf0e10cSrcweir         return sRet;
112cdf0e10cSrcweir     }
113cdf0e10cSrcweir 	//------------------------------------------------------------------
reSubstituteVariables(const::rtl::OUString & _sText)114cdf0e10cSrcweir     ::rtl::OUString SAL_CALL ParameterSubstitution::reSubstituteVariables( const ::rtl::OUString& _sText ) throw (::com::sun::star::uno::RuntimeException)
115cdf0e10cSrcweir     {
116cdf0e10cSrcweir         return _sText;
117cdf0e10cSrcweir     }
118cdf0e10cSrcweir 	//------------------------------------------------------------------
getSubstituteVariableValue(const::rtl::OUString &)119cdf0e10cSrcweir     ::rtl::OUString SAL_CALL ParameterSubstitution::getSubstituteVariableValue( const ::rtl::OUString& /*variable*/ ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException)
120cdf0e10cSrcweir     {
121cdf0e10cSrcweir         throw container::NoSuchElementException();
122cdf0e10cSrcweir     }
123cdf0e10cSrcweir     //------------------------------------------------------------------
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 
126cdf0e10cSrcweir // ==================================
127cdf0e10cSrcweir } // connectivity
128cdf0e10cSrcweir // ==================================
129