1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_connectivity.hxx"
26 #include "NConnection.hxx"
27 #include "NDatabaseMetaData.hxx"
28 #include "NCatalog.hxx"
29 #include <com/sun/star/lang/DisposedException.hpp>
30 #include <com/sun/star/sdbc/TransactionIsolation.hpp>
31 #include <tools/urlobj.hxx>
32 #include "NPreparedStatement.hxx"
33 #include "NStatement.hxx"
34 #include <comphelper/extract.hxx>
35 #include <connectivity/dbexception.hxx>
36 #include <comphelper/processfactory.hxx>
37 #include <vos/process.hxx>
38 #include <tools/debug.hxx>
39 #include "NDebug.hxx"
40 #include <comphelper/sequence.hxx>
41
42 using namespace connectivity::evoab;
43 using namespace vos;
44 using namespace dbtools;
45
46 //------------------------------------------------------------------------------
47 using namespace ::com::sun::star::uno;
48 using namespace ::com::sun::star::beans;
49 using namespace ::com::sun::star::sdbcx;
50 using namespace ::com::sun::star::sdbc;
51 using namespace ::com::sun::star::lang;
52
implGetExceptionMsg(Exception & e,const::rtl::OUString & aExceptionType_)53 ::rtl::OUString implGetExceptionMsg( Exception& e, const ::rtl::OUString& aExceptionType_ )
54 {
55 ::rtl::OUString aExceptionType = aExceptionType_;
56 if( aExceptionType.getLength() == 0 )
57 aExceptionType = ::rtl::OUString::createFromAscii("Unknown" ) ;
58
59 ::rtl::OUString aTypeLine( RTL_CONSTASCII_USTRINGPARAM("\nType: " ) );
60 aTypeLine += aExceptionType;
61
62 ::rtl::OUString aMessageLine( RTL_CONSTASCII_USTRINGPARAM("\nMessage: " ) );
63 aMessageLine += ::rtl::OUString( e.Message );
64
65 ::rtl::OUString aMsg(aTypeLine);
66 aMsg += aMessageLine;
67 return aMsg;
68 }
69
70 // Exception type unknown
implGetExceptionMsg(Exception & e)71 ::rtl::OUString implGetExceptionMsg( Exception& e )
72 {
73 ::rtl::OUString aMsg = implGetExceptionMsg( e, ::rtl::OUString() );
74 return aMsg;
75 }
76
77 // --------------------------------------------------------------------------------
OEvoabConnection(OEvoabDriver & _rDriver)78 OEvoabConnection::OEvoabConnection( OEvoabDriver& _rDriver )
79 :OSubComponent<OEvoabConnection, OConnection_BASE>( (::cppu::OWeakObject*)(&_rDriver), this )
80 ,m_rDriver(_rDriver)
81 ,m_xCatalog(NULL)
82 {
83 }
84 //-----------------------------------------------------------------------------
~OEvoabConnection()85 OEvoabConnection::~OEvoabConnection()
86 {
87 ::osl::MutexGuard aGuard( m_aMutex );
88
89 if(!isClosed()) {
90 acquire();
91 close();
92 }
93 }
94
95 //-----------------------------------------------------------------------------
release()96 void SAL_CALL OEvoabConnection::release() throw()
97 {
98 relase_ChildImpl();
99 }
100
101 // XServiceInfo
102 // --------------------------------------------------------------------------------
103 IMPLEMENT_SERVICE_INFO(OEvoabConnection, "com.sun.star.sdbc.drivers.evoab.Connection", "com.sun.star.sdbc.Connection")
104
105 //-----------------------------------------------------------------------------
construct(const::rtl::OUString & url,const Sequence<PropertyValue> & info)106 void OEvoabConnection::construct(const ::rtl::OUString& url, const Sequence< PropertyValue >& info) throw(SQLException)
107 {
108 osl_incrementInterlockedCount( &m_refCount );
109 EVO_TRACE_STRING("OEvoabConnection::construct()::url = %s\n", url );
110
111 ::rtl::OUString sPassword;
112 const char* pPwd = "password";
113
114 const PropertyValue *pIter = info.getConstArray();
115 const PropertyValue *pEnd = pIter + info.getLength();
116 for(;pIter != pEnd;++pIter)
117 {
118 if(!pIter->Name.compareToAscii(pPwd))
119 {
120 pIter->Value >>= sPassword;
121 break;
122 }
123 }
124
125 if (url.equalsAscii("sdbc:address:evolution:groupwise"))
126 setSDBCAddressType(SDBCAddress::EVO_GWISE);
127 else if (url.equalsAscii("sdbc:address:evolution:ldap"))
128 setSDBCAddressType(SDBCAddress::EVO_LDAP);
129 else
130 setSDBCAddressType(SDBCAddress::EVO_LOCAL);
131 setURL(url);
132 setPassword(::rtl::OUStringToOString(sPassword,RTL_TEXTENCODING_UTF8));
133 osl_decrementInterlockedCount( &m_refCount );
134 }
135
136 // --------------------------------------------------------------------------------
nativeSQL(const::rtl::OUString & _sSql)137 ::rtl::OUString SAL_CALL OEvoabConnection::nativeSQL( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException)
138 {
139 // when you need to transform SQL92 to you driver specific you can do it here
140 return _sSql;
141 }
142 // --------------------------------------------------------------------------------
getMetaData()143 Reference< XDatabaseMetaData > SAL_CALL OEvoabConnection::getMetaData( ) throw(SQLException, RuntimeException)
144 {
145 ::osl::MutexGuard aGuard( m_aMutex );
146 checkDisposed(OConnection_BASE::rBHelper.bDisposed);
147
148 Reference< XDatabaseMetaData > xMetaData = m_xMetaData;
149 if(!xMetaData.is())
150 {
151 xMetaData = new OEvoabDatabaseMetaData(this);
152 m_xMetaData = xMetaData;
153 }
154
155 return xMetaData;
156 }
157 //------------------------------------------------------------------------------
createCatalog()158 ::com::sun::star::uno::Reference< XTablesSupplier > OEvoabConnection::createCatalog()
159 {
160 ::osl::MutexGuard aGuard( m_aMutex );
161 Reference< XTablesSupplier > xTab = m_xCatalog;
162 if(!xTab.is())
163 {
164 OEvoabCatalog *pCat = new OEvoabCatalog(this);
165 xTab = pCat;
166 m_xCatalog = xTab;
167 }
168 return xTab;
169 }
170 // --------------------------------------------------------------------------------
createStatement()171 Reference< XStatement > SAL_CALL OEvoabConnection::createStatement( ) throw(SQLException, RuntimeException)
172 {
173 ::osl::MutexGuard aGuard( m_aMutex );
174 checkDisposed(OConnection_BASE::rBHelper.bDisposed);
175
176 OStatement* pStmt = new OStatement(this);
177
178 Reference< XStatement > xStmt = pStmt;
179 m_aStatements.push_back(WeakReferenceHelper(*pStmt));
180 return xStmt;
181 }
182 // --------------------------------------------------------------------------------
prepareStatement(const::rtl::OUString & sql)183 Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareStatement( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
184 {
185 ::osl::MutexGuard aGuard( m_aMutex );
186 checkDisposed(OConnection_BASE::rBHelper.bDisposed);
187
188 OEvoabPreparedStatement* pStmt = new OEvoabPreparedStatement( this );
189 Reference< XPreparedStatement > xStmt = pStmt;
190 pStmt->construct( sql );
191
192 m_aStatements.push_back(WeakReferenceHelper(*pStmt));
193 return xStmt;
194 }
195
prepareCall(const::rtl::OUString &)196 Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareCall( const ::rtl::OUString& /*sql*/ ) throw( SQLException, RuntimeException)
197 {
198 ::dbtools::throwFeatureNotImplementedException( "XConnection::prepareCall", *this );
199 return NULL;
200 }
isClosed()201 sal_Bool SAL_CALL OEvoabConnection::isClosed( ) throw(SQLException, RuntimeException)
202 {
203 ::osl::MutexGuard aGuard( m_aMutex );
204 return OConnection_BASE::rBHelper.bDisposed;
205 }
206
207 // --------------------------------------------------------------------------------
208 // XCloseable
close()209 void SAL_CALL OEvoabConnection::close( ) throw(SQLException, RuntimeException)
210 {
211 { // we just dispose us
212 ::osl::MutexGuard aGuard( m_aMutex );
213 checkDisposed(OConnection_BASE::rBHelper.bDisposed);
214 }
215 dispose();
216 }
217
218 // --------------------------------------------------------------------------------
219 // XWarningsSupplier
getWarnings()220 Any SAL_CALL OEvoabConnection::getWarnings( ) throw(SQLException, RuntimeException)
221 {
222 return m_aWarnings.getWarnings();
223 }
clearWarnings()224 void SAL_CALL OEvoabConnection::clearWarnings( ) throw(SQLException, RuntimeException)
225 {
226 m_aWarnings.clearWarnings();
227 }
228 //------------------------------------------------------------------------------
229
disposing()230 void OEvoabConnection::disposing()
231 {
232 // we noticed that we should be destroyed in near future so we have to dispose our statements
233 ::osl::MutexGuard aGuard(m_aMutex);
234 OConnection_BASE::disposing();
235 dispose_ChildImpl();
236 }
237
238 // -------------------------------- stubbed methods ------------------------------------------------
setAutoCommit(sal_Bool)239 void SAL_CALL OEvoabConnection::setAutoCommit( sal_Bool /*autoCommit*/ ) throw(SQLException, RuntimeException)
240 {
241 ::dbtools::throwFeatureNotImplementedException( "XConnection::setAutoCommit", *this );
242 }
getAutoCommit()243 sal_Bool SAL_CALL OEvoabConnection::getAutoCommit( ) throw(SQLException, RuntimeException)
244 {
245 return sal_True;
246 }
commit()247 void SAL_CALL OEvoabConnection::commit( ) throw(SQLException, RuntimeException)
248 {
249 }
rollback()250 void SAL_CALL OEvoabConnection::rollback( ) throw(SQLException, RuntimeException)
251 {
252 }
setReadOnly(sal_Bool)253 void SAL_CALL OEvoabConnection::setReadOnly( sal_Bool /*readOnly*/ ) throw(SQLException, RuntimeException)
254 {
255 ::dbtools::throwFeatureNotImplementedException( "XConnection::setReadOnly", *this );
256 }
isReadOnly()257 sal_Bool SAL_CALL OEvoabConnection::isReadOnly( ) throw(SQLException, RuntimeException)
258 {
259 return sal_False;
260 }
setCatalog(const::rtl::OUString &)261 void SAL_CALL OEvoabConnection::setCatalog( const ::rtl::OUString& /*catalog*/ ) throw(SQLException, RuntimeException)
262 {
263 ::dbtools::throwFeatureNotImplementedException( "XConnection::setCatalog", *this );
264 }
265
getCatalog()266 ::rtl::OUString SAL_CALL OEvoabConnection::getCatalog( ) throw(SQLException, RuntimeException)
267 {
268 return ::rtl::OUString();
269 }
setTransactionIsolation(sal_Int32)270 void SAL_CALL OEvoabConnection::setTransactionIsolation( sal_Int32 /*level*/ ) throw(SQLException, RuntimeException)
271 {
272 ::dbtools::throwFeatureNotImplementedException( "XConnection::setTransactionIsolation", *this );
273 }
274
getTransactionIsolation()275 sal_Int32 SAL_CALL OEvoabConnection::getTransactionIsolation( ) throw(SQLException, RuntimeException)
276 {
277 return TransactionIsolation::NONE;
278 }
279
getTypeMap()280 Reference< ::com::sun::star::container::XNameAccess > SAL_CALL OEvoabConnection::getTypeMap( ) throw(SQLException, RuntimeException)
281 {
282 ::dbtools::throwFeatureNotImplementedException( "XConnection::getTypeMap", *this );
283 return NULL;
284 }
setTypeMap(const Reference<::com::sun::star::container::XNameAccess> &)285 void SAL_CALL OEvoabConnection::setTypeMap( const Reference< ::com::sun::star::container::XNameAccess >& /*typeMap*/ ) throw(SQLException, RuntimeException)
286 {
287 ::dbtools::throwFeatureNotImplementedException( "XConnection::setTypeMap", *this );
288 }
289