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 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_connectivity.hxx"
30 #include "odbc/ODriver.hxx"
31 #include "odbc/OConnection.hxx"
32 #include "odbc/OFunctions.hxx"
33 #include "odbc/OTools.hxx"
34 #include "connectivity/dbexception.hxx"
35 #include "resource/common_res.hrc"
36 #include "resource/sharedresources.hxx"
37 
38 using namespace connectivity::odbc;
39 using namespace com::sun::star::uno;
40 using namespace com::sun::star::lang;
41 using namespace com::sun::star::beans;
42 using namespace com::sun::star::sdbc;
43 // --------------------------------------------------------------------------------
44 ODBCDriver::ODBCDriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory)
45 	:ODriver_BASE(m_aMutex)
46 	,m_xORB(_rxFactory)
47     ,m_pDriverHandle(SQL_NULL_HANDLE)
48 {
49 }
50 // --------------------------------------------------------------------------------
51 void ODBCDriver::disposing()
52 {
53 	::osl::MutexGuard aGuard(m_aMutex);
54 
55 
56 	for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i)
57 	{
58 		Reference< XComponent > xComp(i->get(), UNO_QUERY);
59 		if (xComp.is())
60 			xComp->dispose();
61 	}
62 	m_xConnections.clear();
63 
64 	ODriver_BASE::disposing();
65 }
66 
67 // static ServiceInfo
68 //------------------------------------------------------------------------------
69 rtl::OUString ODBCDriver::getImplementationName_Static(  ) throw(RuntimeException)
70 {
71 	return rtl::OUString::createFromAscii("com.sun.star.comp.sdbc.ODBCDriver");
72 		// this name is referenced in the configuration and in the odbc.xml
73 		// Please take care when changing it.
74 }
75 
76 typedef Sequence< ::rtl::OUString > SS;
77 //------------------------------------------------------------------------------
78 SS ODBCDriver::getSupportedServiceNames_Static(  ) throw (RuntimeException)
79 {
80 	SS aSNS( 1 );
81 	aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver");
82 	return aSNS;
83 }
84 
85 //------------------------------------------------------------------
86 ::rtl::OUString SAL_CALL ODBCDriver::getImplementationName(  ) throw(RuntimeException)
87 {
88 	return getImplementationName_Static();
89 }
90 
91 //------------------------------------------------------------------
92 sal_Bool SAL_CALL ODBCDriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
93 {
94 	SS aSupported(getSupportedServiceNames());
95 	const ::rtl::OUString* pSupported = aSupported.getConstArray();
96 	const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
97 	for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
98 		;
99 
100 	return pSupported != pEnd;
101 }
102 
103 //------------------------------------------------------------------
104 SS SAL_CALL ODBCDriver::getSupportedServiceNames(  ) throw(RuntimeException)
105 {
106 	return getSupportedServiceNames_Static();
107 }
108 
109 // --------------------------------------------------------------------------------
110 Reference< XConnection > SAL_CALL ODBCDriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException)
111 {
112 	if ( ! acceptsURL(url) )
113 		return NULL;
114 
115 	if(!m_pDriverHandle)
116 	{
117 		::rtl::OUString aPath;
118 		if(!EnvironmentHandle(aPath))
119 			throw SQLException(aPath,*this,::rtl::OUString(),1000,Any());
120 	}
121 	OConnection* pCon = new OConnection(m_pDriverHandle,this);
122 	Reference< XConnection > xCon = pCon;
123 	pCon->Construct(url,info);
124 	m_xConnections.push_back(WeakReferenceHelper(*pCon));
125 
126 	return xCon;
127 }
128 // --------------------------------------------------------------------------------
129 sal_Bool SAL_CALL ODBCDriver::acceptsURL( const ::rtl::OUString& url )
130 		throw(SQLException, RuntimeException)
131 {
132 	return (!url.compareTo(::rtl::OUString::createFromAscii("sdbc:odbc:"),10));
133 }
134 // --------------------------------------------------------------------------------
135 Sequence< DriverPropertyInfo > SAL_CALL ODBCDriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& /*info*/ ) throw(SQLException, RuntimeException)
136 {
137 	if ( acceptsURL(url) )
138 	{
139 		::std::vector< DriverPropertyInfo > aDriverInfo;
140 
141 		Sequence< ::rtl::OUString > aBooleanValues(2);
142         aBooleanValues[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) );
143 		aBooleanValues[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) );
144 
145 		aDriverInfo.push_back(DriverPropertyInfo(
146 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet"))
147 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet of the database."))
148 				,sal_False
149 				,::rtl::OUString()
150 				,Sequence< ::rtl::OUString >())
151 				);
152 		aDriverInfo.push_back(DriverPropertyInfo(
153 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UseCatalog"))
154 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Use catalog for file-based databases."))
155 				,sal_False
156 				,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
157 				,aBooleanValues)
158 				);
159 		aDriverInfo.push_back(DriverPropertyInfo(
160 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SystemDriverSettings"))
161 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Driver settings."))
162 				,sal_False
163 				,::rtl::OUString()
164 				,Sequence< ::rtl::OUString >())
165 				);
166 		aDriverInfo.push_back(DriverPropertyInfo(
167 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParameterNameSubstitution"))
168 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Change named parameters with '?'."))
169 				,sal_False
170 				,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
171 				,aBooleanValues)
172 				);
173 		aDriverInfo.push_back(DriverPropertyInfo(
174 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IgnoreDriverPrivileges"))
175 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Ignore the privileges from the database driver."))
176 				,sal_False
177 				,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
178 				,aBooleanValues)
179 				);
180 		aDriverInfo.push_back(DriverPropertyInfo(
181 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsAutoRetrievingEnabled"))
182 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Retrieve generated values."))
183 				,sal_False
184 				,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
185 				,aBooleanValues)
186 				);
187 		aDriverInfo.push_back(DriverPropertyInfo(
188 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AutoRetrievingStatement"))
189 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Auto-increment statement."))
190 				,sal_False
191 				,::rtl::OUString()
192 				,Sequence< ::rtl::OUString >())
193 				);
194 		aDriverInfo.push_back(DriverPropertyInfo(
195 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GenerateASBeforeCorrelationName"))
196 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Generate AS before table correlation names."))
197 				,sal_False
198 				,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) )
199 				,aBooleanValues)
200 				);
201 		aDriverInfo.push_back(DriverPropertyInfo(
202 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EscapeDateTime"))
203 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Escape date time format."))
204 				,sal_False
205 				,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) )
206 				,aBooleanValues)
207 				);
208 
209 		return Sequence< DriverPropertyInfo >(&aDriverInfo[0],aDriverInfo.size());
210 	}
211 	::connectivity::SharedResources aResources;
212     const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR);
213     ::dbtools::throwGenericSQLException(sMessage ,*this);
214 	return Sequence< DriverPropertyInfo >();
215 }
216 // --------------------------------------------------------------------------------
217 sal_Int32 SAL_CALL ODBCDriver::getMajorVersion(  ) throw(RuntimeException)
218 {
219 	return 1;
220 }
221 // --------------------------------------------------------------------------------
222 sal_Int32 SAL_CALL ODBCDriver::getMinorVersion(  ) throw(RuntimeException)
223 {
224 	return 0;
225 }
226 // --------------------------------------------------------------------------------
227 //-----------------------------------------------------------------------------
228 
229 
230