xref: /trunk/main/connectivity/source/drivers/jdbc/JDriver.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 "java/sql/Driver.hxx"
31 #include "java/lang/Object.hxx"
32 #include "java/lang/Class.hxx"
33 #include "java/sql/DriverPropertyInfo.hxx"
34 #include "java/sql/Connection.hxx"
35 #include "java/util/Property.hxx"
36 #include "java/tools.hxx"
37 #include "connectivity/dbexception.hxx"
38 #include <jvmfwk/framework.h>
39 #include "diagnose_ex.h"
40 #include "resource/jdbc_log.hrc"
41 #include "resource/common_res.hrc"
42 #include "resource/sharedresources.hxx"
43 #include <comphelper/componentcontext.hxx>
44 
45 using namespace connectivity;
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::beans;
48 using namespace ::com::sun::star::sdbc;
49 using namespace ::com::sun::star::container;
50 using namespace ::com::sun::star::lang;
51 
52 // -------------------------------------------------------------------------
53 java_sql_Driver::java_sql_Driver(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory)
54     :m_aContext( _rxFactory )
55     ,m_aLogger( m_aContext.getUNOContext(), "sdbcl", "org.openoffice.sdbc.jdbcBridge" )
56 {
57 }
58 // --------------------------------------------------------------------------------
59 java_sql_Driver::~java_sql_Driver()
60 {
61 }
62 
63 // static ServiceInfo
64 //------------------------------------------------------------------------------
65 rtl::OUString java_sql_Driver::getImplementationName_Static(  ) throw(RuntimeException)
66 {
67     return ::rtl::OUString::createFromAscii("com.sun.star.comp.sdbc.JDBCDriver");
68         // this name is referenced in the configuration and in the jdbc.xml
69         // Please take care when changing it.
70 }
71 //------------------------------------------------------------------------------
72 Sequence< ::rtl::OUString > java_sql_Driver::getSupportedServiceNames_Static(  ) throw (RuntimeException)
73 {
74     Sequence< ::rtl::OUString > aSNS( 1 );
75     aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver");
76     return aSNS;
77 }
78 //------------------------------------------------------------------
79 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL connectivity::java_sql_Driver_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception )
80 {
81     return *(new java_sql_Driver(_rxFactory));
82 }
83 // --------------------------------------------------------------------------------
84 ::rtl::OUString SAL_CALL java_sql_Driver::getImplementationName(  ) throw(RuntimeException)
85 {
86     return getImplementationName_Static();
87 }
88 
89 // --------------------------------------------------------------------------------
90 sal_Bool SAL_CALL java_sql_Driver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
91 {
92     Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
93     const ::rtl::OUString* pSupported = aSupported.getConstArray();
94     const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
95     for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
96         ;
97 
98     return pSupported != pEnd;
99 }
100 
101 // --------------------------------------------------------------------------------
102 Sequence< ::rtl::OUString > SAL_CALL java_sql_Driver::getSupportedServiceNames(  ) throw(RuntimeException)
103 {
104     return getSupportedServiceNames_Static();
105 }
106 // -------------------------------------------------------------------------
107 Reference< XConnection > SAL_CALL java_sql_Driver::connect( const ::rtl::OUString& url, const
108                                                          Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException)
109 {
110     m_aLogger.log( LogLevel::INFO, STR_LOG_DRIVER_CONNECTING_URL, url );
111 
112     Reference< XConnection > xOut;
113     if ( acceptsURL(url ) )
114     {
115         java_sql_Connection* pConnection = new java_sql_Connection( *this );
116         xOut = pConnection;
117         if ( !pConnection->construct(url,info) )
118             xOut.clear(); // an error occured and the java driver didn't throw an exception
119         else
120             m_aLogger.log( LogLevel::INFO, STR_LOG_DRIVER_SUCCESS );
121     }
122     return xOut;
123 }
124 // -------------------------------------------------------------------------
125 sal_Bool SAL_CALL java_sql_Driver::acceptsURL( const ::rtl::OUString& url ) throw(SQLException, RuntimeException)
126 {
127     // don't ask the real driver for the url
128     // I feel responsible for all jdbc url's
129     sal_Bool bEnabled = sal_False;
130     OSL_VERIFY_EQUALS( jfw_getEnabled( &bEnabled ), JFW_E_NONE, "error in jfw_getEnabled" );
131     static const ::rtl::OUString s_sJdbcPrefix = ::rtl::OUString::createFromAscii("jdbc:");
132     return bEnabled && 0 == url.compareTo(s_sJdbcPrefix, 5);
133 }
134 // -------------------------------------------------------------------------
135 Sequence< DriverPropertyInfo > SAL_CALL java_sql_Driver::getPropertyInfo( const ::rtl::OUString& url,
136                                                                          const Sequence< PropertyValue >& /*info*/ ) throw(SQLException, RuntimeException)
137 {
138     if ( acceptsURL(url) )
139     {
140         ::std::vector< DriverPropertyInfo > aDriverInfo;
141 
142         Sequence< ::rtl::OUString > aBooleanValues(2);
143         aBooleanValues[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) );
144         aBooleanValues[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) );
145 
146         aDriverInfo.push_back(DriverPropertyInfo(
147                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JavaDriverClass"))
148                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The JDBC driver class name."))
149                 ,sal_True
150                 ,::rtl::OUString()
151                 ,Sequence< ::rtl::OUString >())
152         );
153         aDriverInfo.push_back(DriverPropertyInfo(
154                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JavaDriverClassPath"))
155                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The class path where to look for the JDBC driver."))
156                 ,sal_True
157                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "" ) )
158                 ,Sequence< ::rtl::OUString >())
159         );
160         aDriverInfo.push_back(DriverPropertyInfo(
161                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SystemProperties"))
162                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Additional properties to set at java.lang.System before loading the driver."))
163                 ,sal_True
164                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "" ) )
165                 ,Sequence< ::rtl::OUString >())
166         );
167         aDriverInfo.push_back(DriverPropertyInfo(
168                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParameterNameSubstitution"))
169                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Change named parameters with '?'."))
170                 ,sal_False
171                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
172                 ,aBooleanValues)
173         );
174         aDriverInfo.push_back(DriverPropertyInfo(
175                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IgnoreDriverPrivileges"))
176                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Ignore the privileges from the database driver."))
177                 ,sal_False
178                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
179                 ,aBooleanValues)
180         );
181         aDriverInfo.push_back(DriverPropertyInfo(
182                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsAutoRetrievingEnabled"))
183                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Retrieve generated values."))
184                 ,sal_False
185                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
186                 ,aBooleanValues)
187         );
188         aDriverInfo.push_back(DriverPropertyInfo(
189                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AutoRetrievingStatement"))
190                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Auto-increment statement."))
191                 ,sal_False
192                 ,::rtl::OUString()
193                 ,Sequence< ::rtl::OUString >())
194         );
195         aDriverInfo.push_back(DriverPropertyInfo(
196                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GenerateASBeforeCorrelationName"))
197                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Generate AS before table correlation names."))
198                 ,sal_False
199                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) )
200                 ,aBooleanValues)
201         );
202         aDriverInfo.push_back(DriverPropertyInfo(
203                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IgnoreCurrency"))
204                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Ignore the currency field from the ResultsetMetaData."))
205                 ,sal_False
206                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) )
207                 ,aBooleanValues)
208         );
209         aDriverInfo.push_back(DriverPropertyInfo(
210                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EscapeDateTime"))
211                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Escape date time format."))
212                 ,sal_False
213                 ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) )
214                 ,aBooleanValues)
215         );
216         aDriverInfo.push_back(DriverPropertyInfo(
217                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TypeInfoSettings"))
218                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Defines how the type info of the database metadata should be manipulated."))
219                 ,sal_False
220                 ,::rtl::OUString( )
221                 ,Sequence< ::rtl::OUString > ())
222         );
223         aDriverInfo.push_back(DriverPropertyInfo(
224                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImplicitCatalogRestriction"))
225                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The catalog which should be used in getTables calls, when the caller passed NULL."))
226                 ,sal_False
227                 ,::rtl::OUString( )
228                 ,Sequence< ::rtl::OUString > ())
229         );
230         aDriverInfo.push_back(DriverPropertyInfo(
231                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImplicitSchemaRestriction"))
232                 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The schema which should be used in getTables calls, when the caller passed NULL."))
233                 ,sal_False
234                 ,::rtl::OUString( )
235                 ,Sequence< ::rtl::OUString > ())
236         );
237         return Sequence< DriverPropertyInfo >(&aDriverInfo[0],aDriverInfo.size());
238     }
239     ::connectivity::SharedResources aResources;
240     const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR);
241     ::dbtools::throwGenericSQLException(sMessage ,*this);
242     return Sequence< DriverPropertyInfo >();
243 }
244 // -------------------------------------------------------------------------
245 sal_Int32 SAL_CALL java_sql_Driver::getMajorVersion(  ) throw(RuntimeException)
246 {
247     return 1;
248 }
249 // -------------------------------------------------------------------------
250 sal_Int32 SAL_CALL java_sql_Driver::getMinorVersion(  ) throw(RuntimeException)
251 {
252     return 0;
253 }
254 // -------------------------------------------------------------------------
255 
256 
257