1*079eb577SAndrew Rist /**************************************************************
2*079eb577SAndrew Rist *
3*079eb577SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*079eb577SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*079eb577SAndrew Rist * distributed with this work for additional information
6*079eb577SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*079eb577SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*079eb577SAndrew Rist * "License"); you may not use this file except in compliance
9*079eb577SAndrew Rist * with the License. You may obtain a copy of the License at
10*079eb577SAndrew Rist *
11*079eb577SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*079eb577SAndrew Rist *
13*079eb577SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*079eb577SAndrew Rist * software distributed under the License is distributed on an
15*079eb577SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*079eb577SAndrew Rist * KIND, either express or implied. See the License for the
17*079eb577SAndrew Rist * specific language governing permissions and limitations
18*079eb577SAndrew Rist * under the License.
19*079eb577SAndrew Rist *
20*079eb577SAndrew Rist *************************************************************/
21cdf0e10cSrcweir
22cdf0e10cSrcweir #include "mysqlc_connection.hxx"
23cdf0e10cSrcweir #include "mysqlc_databasemetadata.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include "mysqlc_driver.hxx"
27cdf0e10cSrcweir #include "mysqlc_statement.hxx"
28cdf0e10cSrcweir #include "mysqlc_preparedstatement.hxx"
29cdf0e10cSrcweir #include "mysqlc_general.hxx"
30cdf0e10cSrcweir
31cdf0e10cSrcweir #include <preextstl.h>
32cdf0e10cSrcweir #include <cppconn/driver.h>
33cdf0e10cSrcweir #include <cppconn/connection.h>
34cdf0e10cSrcweir #include <cppconn/statement.h>
35cdf0e10cSrcweir #include <cppconn/metadata.h>
36cdf0e10cSrcweir #include <cppconn/exception.h>
37cdf0e10cSrcweir #include <postextstl.h>
38cdf0e10cSrcweir
39cdf0e10cSrcweir #include <com/sun/star/sdbc/ColumnValue.hpp>
40cdf0e10cSrcweir #include <com/sun/star/sdbc/XRow.hpp>
41cdf0e10cSrcweir #include <com/sun/star/sdbc/TransactionIsolation.hpp>
42cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
43cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp>
44cdf0e10cSrcweir
45cdf0e10cSrcweir #include <osl/module.hxx>
46cdf0e10cSrcweir #include <osl/thread.h>
47cdf0e10cSrcweir #include <osl/file.h>
48cdf0e10cSrcweir #include <rtl/uri.hxx>
49cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
50cdf0e10cSrcweir
51cdf0e10cSrcweir using namespace connectivity::mysqlc;
52cdf0e10cSrcweir
53cdf0e10cSrcweir #include <stdio.h>
54cdf0e10cSrcweir
55cdf0e10cSrcweir //------------------------------------------------------------------------------
56cdf0e10cSrcweir using namespace com::sun::star::uno;
57cdf0e10cSrcweir using namespace com::sun::star::container;
58cdf0e10cSrcweir using namespace com::sun::star::lang;
59cdf0e10cSrcweir using namespace com::sun::star::beans;
60cdf0e10cSrcweir using namespace com::sun::star::sdbc;
61cdf0e10cSrcweir using ::osl::MutexGuard;
62cdf0e10cSrcweir using ::rtl::OUString;
63cdf0e10cSrcweir
64cdf0e10cSrcweir
65cdf0e10cSrcweir #define MYSQLC_URI_PREFIX "sdbc:mysqlc:"
66cdf0e10cSrcweir
67cdf0e10cSrcweir
68cdf0e10cSrcweir /* {{{ OConnection::OConnection() -I- */
OConnection(MysqlCDriver & _rDriver,sql::Driver * _cppDriver)69cdf0e10cSrcweir OConnection::OConnection(MysqlCDriver& _rDriver, sql::Driver * _cppDriver)
70cdf0e10cSrcweir :OMetaConnection_BASE(m_aMutex)
71cdf0e10cSrcweir ,OSubComponent<OConnection, OConnection_BASE>((::cppu::OWeakObject*)&_rDriver, this)
72cdf0e10cSrcweir ,m_xMetaData(NULL)
73cdf0e10cSrcweir ,m_rDriver(_rDriver)
74cdf0e10cSrcweir ,cppDriver(_cppDriver)
75cdf0e10cSrcweir ,m_bClosed(sal_False)
76cdf0e10cSrcweir ,m_bUseCatalog(sal_False)
77cdf0e10cSrcweir ,m_bUseOldDateFormat(sal_False)
78cdf0e10cSrcweir {
79cdf0e10cSrcweir OSL_TRACE("OConnection::OConnection");
80cdf0e10cSrcweir m_rDriver.acquire();
81cdf0e10cSrcweir }
82cdf0e10cSrcweir /* }}} */
83cdf0e10cSrcweir
84cdf0e10cSrcweir
85cdf0e10cSrcweir /* {{{ OConnection::OConnection() -I- */
~OConnection()86cdf0e10cSrcweir OConnection::~OConnection()
87cdf0e10cSrcweir {
88cdf0e10cSrcweir OSL_TRACE("OConnection::~OConnection");
89cdf0e10cSrcweir if (!isClosed()) {
90cdf0e10cSrcweir close();
91cdf0e10cSrcweir }
92cdf0e10cSrcweir m_rDriver.release();
93cdf0e10cSrcweir }
94cdf0e10cSrcweir /* }}} */
95cdf0e10cSrcweir
96cdf0e10cSrcweir
97cdf0e10cSrcweir /* {{{ OConnection::release() -I- */
release()98cdf0e10cSrcweir void SAL_CALL OConnection::release()
99cdf0e10cSrcweir throw()
100cdf0e10cSrcweir {
101cdf0e10cSrcweir OSL_TRACE("OConnection::release");
102cdf0e10cSrcweir relase_ChildImpl();
103cdf0e10cSrcweir }
104cdf0e10cSrcweir /* }}} */
105cdf0e10cSrcweir
106cdf0e10cSrcweir #ifndef SYSTEM_MYSQL
thisModule()107cdf0e10cSrcweir extern "C" { void SAL_CALL thisModule() {} }
108cdf0e10cSrcweir #endif
109cdf0e10cSrcweir
110cdf0e10cSrcweir /* {{{ OConnection::construct() -I- */
construct(const OUString & url,const Sequence<PropertyValue> & info)111cdf0e10cSrcweir void OConnection::construct(const OUString& url, const Sequence< PropertyValue >& info)
112cdf0e10cSrcweir throw(SQLException)
113cdf0e10cSrcweir {
114cdf0e10cSrcweir OSL_TRACE("OConnection::construct");
115cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
116cdf0e10cSrcweir
117cdf0e10cSrcweir sal_Int32 nIndex;
118cdf0e10cSrcweir sal_Bool bEmbedded = sal_False;
119cdf0e10cSrcweir OUString token;
120cdf0e10cSrcweir OUString aHostName(RTL_CONSTASCII_USTRINGPARAM("localhost"));
121cdf0e10cSrcweir sal_Int32 nPort = 3306;
122cdf0e10cSrcweir OUString aDbName;
123cdf0e10cSrcweir
124cdf0e10cSrcweir m_settings.encoding = m_rDriver.getDefaultEncoding();
125cdf0e10cSrcweir m_settings.quoteIdentifier = OUString();
126cdf0e10cSrcweir
127cdf0e10cSrcweir // parse url. Url has the following format:
128cdf0e10cSrcweir // external server: sdbc:mysqlc:[hostname]:[port]/[dbname]
129cdf0e10cSrcweir
130cdf0e10cSrcweir if (!url.compareTo(OUString::createFromAscii(MYSQLC_URI_PREFIX), sizeof(MYSQLC_URI_PREFIX)-1)) {
131cdf0e10cSrcweir nIndex = 12;
132cdf0e10cSrcweir } else {
133cdf0e10cSrcweir bEmbedded = sal_True;
134cdf0e10cSrcweir nIndex = 20;
135cdf0e10cSrcweir mysqlc_sdbc_driver::throwFeatureNotImplementedException("OConnection::construct (embedded MySQL)", *this);
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
138cdf0e10cSrcweir token = url.getToken(0, '/', nIndex);
139cdf0e10cSrcweir if (token.getLength()) {
140cdf0e10cSrcweir sal_Int32 nIndex1 = 0;
141cdf0e10cSrcweir OUString hostandport = token.getToken(0,':', nIndex1);
142cdf0e10cSrcweir if (hostandport.getLength()) {
143cdf0e10cSrcweir aHostName = hostandport;
144cdf0e10cSrcweir hostandport = token.getToken(0, ':', nIndex1);
145cdf0e10cSrcweir if (hostandport.getLength() && nIndex1) {
146cdf0e10cSrcweir nPort = hostandport.toInt32();
147cdf0e10cSrcweir }
148cdf0e10cSrcweir token = url.getToken(0, '/', nIndex);
149cdf0e10cSrcweir if (token.getLength() && nIndex) {
150cdf0e10cSrcweir aDbName = token;
151cdf0e10cSrcweir }
152cdf0e10cSrcweir }
153cdf0e10cSrcweir }
154cdf0e10cSrcweir
155cdf0e10cSrcweir // get user and password for mysql connection
156cdf0e10cSrcweir const PropertyValue *pIter = info.getConstArray();
157cdf0e10cSrcweir const PropertyValue *pEnd = pIter + info.getLength();
158cdf0e10cSrcweir OUString aUser, aPass, sUnixSocket, sNamedPipe;
159cdf0e10cSrcweir bool unixSocketPassed = false;
160cdf0e10cSrcweir bool namedPipePassed = false;
161cdf0e10cSrcweir
162cdf0e10cSrcweir m_settings.connectionURL = url;
163cdf0e10cSrcweir for (;pIter != pEnd;++pIter) {
164cdf0e10cSrcweir if (!pIter->Name.compareToAscii("user")) {
165cdf0e10cSrcweir OSL_VERIFY( pIter->Value >>= aUser );
166cdf0e10cSrcweir } else if (!pIter->Name.compareToAscii("password")) {
167cdf0e10cSrcweir OSL_VERIFY( pIter->Value >>= aPass );
168cdf0e10cSrcweir } else if (!pIter->Name.compareToAscii("LocalSocket")) {
169cdf0e10cSrcweir OSL_VERIFY( pIter->Value >>= sUnixSocket );
170cdf0e10cSrcweir unixSocketPassed = true;
171cdf0e10cSrcweir } else if (!pIter->Name.compareToAscii("NamedPipe")) {
172cdf0e10cSrcweir OSL_VERIFY( pIter->Value >>= sNamedPipe );
173cdf0e10cSrcweir namedPipePassed = true;
174cdf0e10cSrcweir } else if ( !pIter->Name.compareToAscii("PublicConnectionURL")) {
175cdf0e10cSrcweir OSL_VERIFY( pIter->Value >>= m_settings.connectionURL );
176cdf0e10cSrcweir } else if ( !pIter->Name.compareToAscii("NewURL")) { // legacy name for "PublicConnectionURL"
177cdf0e10cSrcweir OSL_VERIFY( pIter->Value >>= m_settings.connectionURL );
178cdf0e10cSrcweir }
179cdf0e10cSrcweir }
180cdf0e10cSrcweir
181cdf0e10cSrcweir if (bEmbedded == sal_False) {
182cdf0e10cSrcweir try {
183cdf0e10cSrcweir sql::ConnectOptionsMap connProps;
184cdf0e10cSrcweir ext_std::string host_str = OUStringToOString(aHostName, m_settings.encoding).getStr();
185cdf0e10cSrcweir ext_std::string user_str = OUStringToOString(aUser, m_settings.encoding).getStr();
186cdf0e10cSrcweir ext_std::string pass_str = OUStringToOString(aPass, m_settings.encoding).getStr();
187cdf0e10cSrcweir ext_std::string schema_str = OUStringToOString(aDbName, m_settings.encoding).getStr();
188cdf0e10cSrcweir connProps["hostName"] = sql::ConnectPropertyVal(host_str);
189cdf0e10cSrcweir connProps["userName"] = sql::ConnectPropertyVal(user_str);
190cdf0e10cSrcweir connProps["password"] = sql::ConnectPropertyVal(pass_str);
191cdf0e10cSrcweir connProps["schema"] = sql::ConnectPropertyVal(schema_str);
192cdf0e10cSrcweir connProps["port"] = sql::ConnectPropertyVal((int)(nPort));
193cdf0e10cSrcweir if (unixSocketPassed) {
194cdf0e10cSrcweir sql::SQLString socket_str = OUStringToOString(sUnixSocket, m_settings.encoding).getStr();
195cdf0e10cSrcweir connProps["socket"] = socket_str;
196cdf0e10cSrcweir } else if (namedPipePassed) {
197cdf0e10cSrcweir sql::SQLString pipe_str = OUStringToOString(sNamedPipe, m_settings.encoding).getStr();
198cdf0e10cSrcweir connProps["socket"] = pipe_str;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
201cdf0e10cSrcweir #ifndef SYSTEM_MYSQL
202cdf0e10cSrcweir ::rtl::OUString sMySQLClientLib( RTL_CONSTASCII_USTRINGPARAM( MYSQL_LIB ) );
203cdf0e10cSrcweir
204cdf0e10cSrcweir ::rtl::OUString moduleBase;
205cdf0e10cSrcweir OSL_VERIFY( ::osl::Module::getUrlFromAddress( &thisModule, moduleBase ) );
206cdf0e10cSrcweir ::rtl::OUString sMySQLClientLibURL;
207cdf0e10cSrcweir try
208cdf0e10cSrcweir {
209cdf0e10cSrcweir sMySQLClientLibURL = ::rtl::Uri::convertRelToAbs( moduleBase, sMySQLClientLib.pData );
210cdf0e10cSrcweir }
211cdf0e10cSrcweir catch ( const ::rtl::MalformedUriException& e )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir (void)e; // silence compiler
214cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
215cdf0e10cSrcweir ::rtl::OString sMessage( "OConnection::construct: malformed URI: " );
216cdf0e10cSrcweir sMessage += ::rtl::OUStringToOString( e.getMessage(), osl_getThreadTextEncoding() );
217cdf0e10cSrcweir OSL_ENSURE( false, sMessage.getStr() );
218cdf0e10cSrcweir #endif
219cdf0e10cSrcweir }
220cdf0e10cSrcweir
221cdf0e10cSrcweir ::rtl::OUString sMySQLClientLibPath;
222cdf0e10cSrcweir osl_getSystemPathFromFileURL( sMySQLClientLibURL.pData, &sMySQLClientLibPath.pData );
223cdf0e10cSrcweir
224cdf0e10cSrcweir sql::SQLString mysqlLib = ::rtl::OUStringToOString( sMySQLClientLibPath, osl_getThreadTextEncoding() ).getStr();
225cdf0e10cSrcweir connProps["clientlib"] = mysqlLib;
226cdf0e10cSrcweir
227cdf0e10cSrcweir OSL_TRACE("clientlib=%s", mysqlLib.c_str());
228cdf0e10cSrcweir #endif
229cdf0e10cSrcweir
230cdf0e10cSrcweir OSL_TRACE("hostName=%s", host_str.c_str());
231cdf0e10cSrcweir OSL_TRACE("port=%i", int(nPort));
232cdf0e10cSrcweir OSL_TRACE("userName=%s", user_str.c_str());
233cdf0e10cSrcweir OSL_TRACE("password=%s", pass_str.c_str());
234cdf0e10cSrcweir OSL_TRACE("schema=%s", schema_str.c_str());
235cdf0e10cSrcweir
236cdf0e10cSrcweir m_settings.cppConnection.reset(cppDriver->connect(connProps));
237cdf0e10cSrcweir } catch (sql::SQLException &e) {
238cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
239cdf0e10cSrcweir }
240cdf0e10cSrcweir } else {
241cdf0e10cSrcweir // TODO: support for embedded server
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
244cdf0e10cSrcweir m_settings.schema = aDbName;
245cdf0e10cSrcweir OSL_TRACE(OUStringToOString(m_settings.schema, getConnectionEncoding()).getStr());
246cdf0e10cSrcweir
247cdf0e10cSrcweir // Check if the server is 4.1 or above
248cdf0e10cSrcweir if (this->getMysqlVersion() < 40100) {
249cdf0e10cSrcweir throw SQLException(
250cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MySQL Connector/OO.org requires MySQL Server 4.1 or above" ) ),
251cdf0e10cSrcweir *this,
252cdf0e10cSrcweir ::rtl::OUString(),
253cdf0e10cSrcweir 0,
254cdf0e10cSrcweir Any());
255cdf0e10cSrcweir }
256cdf0e10cSrcweir std::auto_ptr<sql::Statement> stmt(m_settings.cppConnection->createStatement());
257cdf0e10cSrcweir stmt->executeUpdate("SET session sql_mode='ANSI_QUOTES'");
258cdf0e10cSrcweir stmt->executeUpdate("SET NAMES utf8");
259cdf0e10cSrcweir }
260cdf0e10cSrcweir /* }}} */
261cdf0e10cSrcweir
262cdf0e10cSrcweir
263cdf0e10cSrcweir // XServiceInfo
264cdf0e10cSrcweir IMPLEMENT_SERVICE_INFO(OConnection, "com.sun.star.sdbc.drivers.mysqlc.OConnection", "com.sun.star.sdbc.Connection")
265cdf0e10cSrcweir
266cdf0e10cSrcweir
267cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
createStatement()268cdf0e10cSrcweir Reference< XStatement > SAL_CALL OConnection::createStatement()
269cdf0e10cSrcweir throw(SQLException, RuntimeException)
270cdf0e10cSrcweir {
271cdf0e10cSrcweir OSL_TRACE("OConnection::createStatement");
272cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
273cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
274cdf0e10cSrcweir
275cdf0e10cSrcweir // create a statement
276cdf0e10cSrcweir Reference< XStatement > xReturn;
277cdf0e10cSrcweir // the statement can only be executed once
278cdf0e10cSrcweir try {
279cdf0e10cSrcweir xReturn = new OStatement(this, m_settings.cppConnection->createStatement());
280cdf0e10cSrcweir m_aStatements.push_back(WeakReferenceHelper(xReturn));
281cdf0e10cSrcweir return xReturn;
282cdf0e10cSrcweir } catch (sql::SQLException & e) {
283cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
284cdf0e10cSrcweir }
285cdf0e10cSrcweir return xReturn;
286cdf0e10cSrcweir }
287cdf0e10cSrcweir /* }}} */
288cdf0e10cSrcweir
289cdf0e10cSrcweir
290cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
prepareStatement(const OUString & _sSql)291cdf0e10cSrcweir Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement(const OUString& _sSql)
292cdf0e10cSrcweir throw(SQLException, RuntimeException)
293cdf0e10cSrcweir {
294cdf0e10cSrcweir OSL_TRACE("OConnection::prepareStatement");
295cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
296cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
297cdf0e10cSrcweir const ::rtl::OUString sSqlStatement = transFormPreparedStatement( _sSql );
298cdf0e10cSrcweir
299cdf0e10cSrcweir Reference< XPreparedStatement > xStatement;
300cdf0e10cSrcweir try {
301cdf0e10cSrcweir // create a statement
302cdf0e10cSrcweir // the statement can only be executed more than once
303cdf0e10cSrcweir xStatement = new OPreparedStatement(this,
304cdf0e10cSrcweir m_settings.cppConnection->prepareStatement(OUStringToOString(sSqlStatement, getConnectionEncoding()).getStr()));
305cdf0e10cSrcweir m_aStatements.push_back( WeakReferenceHelper( xStatement ) );
306cdf0e10cSrcweir } catch (sql::SQLException & e) {
307cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
308cdf0e10cSrcweir }
309cdf0e10cSrcweir return xStatement;
310cdf0e10cSrcweir }
311cdf0e10cSrcweir /* }}} */
312cdf0e10cSrcweir
313cdf0e10cSrcweir
314cdf0e10cSrcweir /* {{{ OConnection::prepareCall() -U- */
prepareCall(const OUString &)315cdf0e10cSrcweir Reference< XPreparedStatement > SAL_CALL OConnection::prepareCall(const OUString& /*_sSql*/ )
316cdf0e10cSrcweir throw(SQLException, RuntimeException)
317cdf0e10cSrcweir {
318cdf0e10cSrcweir OSL_TRACE("OConnection::prepareCall");
319cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
320cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
321cdf0e10cSrcweir
322cdf0e10cSrcweir mysqlc_sdbc_driver::throwFeatureNotImplementedException("OConnection::prepareCall", *this);
323cdf0e10cSrcweir return Reference< XPreparedStatement >();
324cdf0e10cSrcweir }
325cdf0e10cSrcweir /* }}} */
326cdf0e10cSrcweir
327cdf0e10cSrcweir
328cdf0e10cSrcweir /* {{{ OConnection::nativeSQL() -I- */
nativeSQL(const OUString & _sSql)329cdf0e10cSrcweir OUString SAL_CALL OConnection::nativeSQL(const OUString& _sSql)
330cdf0e10cSrcweir throw(SQLException, RuntimeException)
331cdf0e10cSrcweir {
332cdf0e10cSrcweir OSL_TRACE("OConnection::nativeSQL");
333cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
334cdf0e10cSrcweir
335cdf0e10cSrcweir const ::rtl::OUString sSqlStatement = transFormPreparedStatement( _sSql );
336cdf0e10cSrcweir ::rtl::OUString sNativeSQL;
337cdf0e10cSrcweir try {
338cdf0e10cSrcweir sNativeSQL = mysqlc_sdbc_driver::convert(m_settings.cppConnection->nativeSQL(mysqlc_sdbc_driver::convert(sSqlStatement, getConnectionEncoding())),
339cdf0e10cSrcweir getConnectionEncoding());
340cdf0e10cSrcweir } catch (sql::SQLException & e) {
341cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
342cdf0e10cSrcweir }
343cdf0e10cSrcweir return sNativeSQL;
344cdf0e10cSrcweir }
345cdf0e10cSrcweir /* }}} */
346cdf0e10cSrcweir
347cdf0e10cSrcweir
348cdf0e10cSrcweir /* {{{ OConnection::setAutoCommit() -I- */
setAutoCommit(sal_Bool autoCommit)349cdf0e10cSrcweir void SAL_CALL OConnection::setAutoCommit(sal_Bool autoCommit)
350cdf0e10cSrcweir throw(SQLException, RuntimeException)
351cdf0e10cSrcweir {
352cdf0e10cSrcweir OSL_TRACE("OConnection::setAutoCommit");
353cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
354cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
355cdf0e10cSrcweir try {
356cdf0e10cSrcweir m_settings.cppConnection->setAutoCommit(autoCommit == sal_True? true:false);
357cdf0e10cSrcweir } catch (sql::SQLException & e) {
358cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
359cdf0e10cSrcweir }
360cdf0e10cSrcweir }
361cdf0e10cSrcweir /* }}} */
362cdf0e10cSrcweir
363cdf0e10cSrcweir
364cdf0e10cSrcweir /* {{{ OConnection::getAutoCommit() -I- */
getAutoCommit()365cdf0e10cSrcweir sal_Bool SAL_CALL OConnection::getAutoCommit()
366cdf0e10cSrcweir throw(SQLException, RuntimeException)
367cdf0e10cSrcweir {
368cdf0e10cSrcweir OSL_TRACE("OConnection::getAutoCommit");
369cdf0e10cSrcweir // you have to distinguish which if you are in autocommit mode or not
370cdf0e10cSrcweir // at normal case true should be fine here
371cdf0e10cSrcweir
372cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
373cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
374cdf0e10cSrcweir
375cdf0e10cSrcweir sal_Bool autoCommit = sal_False;
376cdf0e10cSrcweir try {
377cdf0e10cSrcweir autoCommit = m_settings.cppConnection->getAutoCommit() == true ? sal_True : sal_False;
378cdf0e10cSrcweir } catch (sql::SQLException & e) {
379cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
380cdf0e10cSrcweir }
381cdf0e10cSrcweir return autoCommit;
382cdf0e10cSrcweir }
383cdf0e10cSrcweir /* }}} */
384cdf0e10cSrcweir
385cdf0e10cSrcweir
386cdf0e10cSrcweir /* {{{ OConnection::commit() -I- */
commit()387cdf0e10cSrcweir void SAL_CALL OConnection::commit()
388cdf0e10cSrcweir throw(SQLException, RuntimeException)
389cdf0e10cSrcweir {
390cdf0e10cSrcweir OSL_TRACE("OConnection::commit");
391cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
392cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
393cdf0e10cSrcweir try {
394cdf0e10cSrcweir m_settings.cppConnection->commit();
395cdf0e10cSrcweir } catch (sql::SQLException & e) {
396cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
397cdf0e10cSrcweir }
398cdf0e10cSrcweir }
399cdf0e10cSrcweir /* }}} */
400cdf0e10cSrcweir
401cdf0e10cSrcweir
402cdf0e10cSrcweir /* {{{ OConnection::rollback() -I- */
rollback()403cdf0e10cSrcweir void SAL_CALL OConnection::rollback()
404cdf0e10cSrcweir throw(SQLException, RuntimeException)
405cdf0e10cSrcweir {
406cdf0e10cSrcweir OSL_TRACE("OConnection::rollback");
407cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
408cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
409cdf0e10cSrcweir try {
410cdf0e10cSrcweir m_settings.cppConnection->rollback();
411cdf0e10cSrcweir } catch (sql::SQLException & e) {
412cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
413cdf0e10cSrcweir }
414cdf0e10cSrcweir }
415cdf0e10cSrcweir /* }}} */
416cdf0e10cSrcweir
417cdf0e10cSrcweir
418cdf0e10cSrcweir /* {{{ OConnection::isClosed() -I- */
isClosed()419cdf0e10cSrcweir sal_Bool SAL_CALL OConnection::isClosed()
420cdf0e10cSrcweir throw(SQLException, RuntimeException)
421cdf0e10cSrcweir {
422cdf0e10cSrcweir OSL_TRACE("OConnection::isClosed");
423cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
424cdf0e10cSrcweir
425cdf0e10cSrcweir // just simple -> we are close when we are disposed taht means someone called dispose(); (XComponent)
426cdf0e10cSrcweir return (OConnection_BASE::rBHelper.bDisposed);
427cdf0e10cSrcweir }
428cdf0e10cSrcweir /* }}} */
429cdf0e10cSrcweir
430cdf0e10cSrcweir
431cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
getMetaData()432cdf0e10cSrcweir Reference< XDatabaseMetaData > SAL_CALL OConnection::getMetaData()
433cdf0e10cSrcweir throw(SQLException, RuntimeException)
434cdf0e10cSrcweir {
435cdf0e10cSrcweir OSL_TRACE("OConnection::getMetaData");
436cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
437cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
438cdf0e10cSrcweir
439cdf0e10cSrcweir Reference< XDatabaseMetaData > xMetaData = m_xMetaData;
440cdf0e10cSrcweir if (!xMetaData.is()) {
441cdf0e10cSrcweir try {
442cdf0e10cSrcweir xMetaData = new ODatabaseMetaData(*this); // need the connection because it can return it
443cdf0e10cSrcweir } catch (sql::SQLException & e) {
444cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
445cdf0e10cSrcweir }
446cdf0e10cSrcweir m_xMetaData = xMetaData;
447cdf0e10cSrcweir }
448cdf0e10cSrcweir
449cdf0e10cSrcweir return xMetaData;
450cdf0e10cSrcweir }
451cdf0e10cSrcweir /* }}} */
452cdf0e10cSrcweir
453cdf0e10cSrcweir
454cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
setReadOnly(sal_Bool readOnly)455cdf0e10cSrcweir void SAL_CALL OConnection::setReadOnly(sal_Bool readOnly)
456cdf0e10cSrcweir throw(SQLException, RuntimeException)
457cdf0e10cSrcweir {
458cdf0e10cSrcweir OSL_TRACE("OConnection::setReadOnly");
459cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
460cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
461cdf0e10cSrcweir
462cdf0e10cSrcweir m_settings.readOnly = readOnly;
463cdf0e10cSrcweir }
464cdf0e10cSrcweir /* }}} */
465cdf0e10cSrcweir
466cdf0e10cSrcweir
467cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
isReadOnly()468cdf0e10cSrcweir sal_Bool SAL_CALL OConnection::isReadOnly()
469cdf0e10cSrcweir throw(SQLException, RuntimeException)
470cdf0e10cSrcweir {
471cdf0e10cSrcweir OSL_TRACE("OConnection::isReadOnly");
472cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
473cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
474cdf0e10cSrcweir
475cdf0e10cSrcweir // return if your connection to readonly
476cdf0e10cSrcweir return (m_settings.readOnly);
477cdf0e10cSrcweir }
478cdf0e10cSrcweir /* }}} */
479cdf0e10cSrcweir
480cdf0e10cSrcweir
481cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
setCatalog(const OUString & catalog)482cdf0e10cSrcweir void SAL_CALL OConnection::setCatalog(const OUString& catalog)
483cdf0e10cSrcweir throw(SQLException, RuntimeException)
484cdf0e10cSrcweir {
485cdf0e10cSrcweir OSL_TRACE("OConnection::setCatalog");
486cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
487cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
488cdf0e10cSrcweir
489cdf0e10cSrcweir try {
490cdf0e10cSrcweir // m_settings.cppConnection->setCatalog(OUStringToOString(catalog, m_settings.encoding).getStr());
491cdf0e10cSrcweir m_settings.cppConnection->setSchema(OUStringToOString(catalog, getConnectionEncoding()).getStr());
492cdf0e10cSrcweir } catch (sql::SQLException & e) {
493cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
494cdf0e10cSrcweir }
495cdf0e10cSrcweir }
496cdf0e10cSrcweir /* }}} */
497cdf0e10cSrcweir
498cdf0e10cSrcweir
499cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
getCatalog()500cdf0e10cSrcweir OUString SAL_CALL OConnection::getCatalog()
501cdf0e10cSrcweir throw(SQLException, RuntimeException)
502cdf0e10cSrcweir {
503cdf0e10cSrcweir OSL_TRACE("OConnection::getCatalog");
504cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
505cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
506cdf0e10cSrcweir
507cdf0e10cSrcweir OUString catalog;
508cdf0e10cSrcweir try {
509cdf0e10cSrcweir catalog = mysqlc_sdbc_driver::convert(m_settings.cppConnection->getSchema(), getConnectionEncoding());
510cdf0e10cSrcweir } catch (sql::SQLException & e) {
511cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
512cdf0e10cSrcweir }
513cdf0e10cSrcweir return catalog;
514cdf0e10cSrcweir }
515cdf0e10cSrcweir /* }}} */
516cdf0e10cSrcweir
517cdf0e10cSrcweir
518cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
setTransactionIsolation(sal_Int32 level)519cdf0e10cSrcweir void SAL_CALL OConnection::setTransactionIsolation(sal_Int32 level)
520cdf0e10cSrcweir throw(SQLException, RuntimeException)
521cdf0e10cSrcweir {
522cdf0e10cSrcweir OSL_TRACE("OConnection::setTransactionIsolation");
523cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
524cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
525cdf0e10cSrcweir
526cdf0e10cSrcweir sql::enum_transaction_isolation cpplevel = sql::TRANSACTION_SERIALIZABLE;
527cdf0e10cSrcweir
528cdf0e10cSrcweir switch (level) {
529cdf0e10cSrcweir case TransactionIsolation::READ_UNCOMMITTED:
530cdf0e10cSrcweir cpplevel = sql::TRANSACTION_READ_UNCOMMITTED;
531cdf0e10cSrcweir break;
532cdf0e10cSrcweir case TransactionIsolation::READ_COMMITTED:
533cdf0e10cSrcweir cpplevel = sql::TRANSACTION_READ_COMMITTED;
534cdf0e10cSrcweir break;
535cdf0e10cSrcweir case TransactionIsolation::REPEATABLE_READ:
536cdf0e10cSrcweir cpplevel = sql::TRANSACTION_REPEATABLE_READ;
537cdf0e10cSrcweir break;
538cdf0e10cSrcweir case TransactionIsolation::SERIALIZABLE:
539cdf0e10cSrcweir cpplevel = sql::TRANSACTION_SERIALIZABLE;
540cdf0e10cSrcweir break;
541cdf0e10cSrcweir case TransactionIsolation::NONE:
542cdf0e10cSrcweir cpplevel = sql::TRANSACTION_SERIALIZABLE;
543cdf0e10cSrcweir break;
544cdf0e10cSrcweir default:;
545cdf0e10cSrcweir /* XXX: Exception ?? */
546cdf0e10cSrcweir }
547cdf0e10cSrcweir try {
548cdf0e10cSrcweir m_settings.cppConnection->setTransactionIsolation(cpplevel);
549cdf0e10cSrcweir } catch (sql::SQLException & e) {
550cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
551cdf0e10cSrcweir }
552cdf0e10cSrcweir }
553cdf0e10cSrcweir /* }}} */
554cdf0e10cSrcweir
555cdf0e10cSrcweir
556cdf0e10cSrcweir /* {{{ OConnection::createStatement() -I- */
getTransactionIsolation()557cdf0e10cSrcweir sal_Int32 SAL_CALL OConnection::getTransactionIsolation()
558cdf0e10cSrcweir throw(SQLException, RuntimeException)
559cdf0e10cSrcweir {
560cdf0e10cSrcweir OSL_TRACE("OConnection::getTransactionIsolation");
561cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
562cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
563cdf0e10cSrcweir
564cdf0e10cSrcweir try {
565cdf0e10cSrcweir switch (m_settings.cppConnection->getTransactionIsolation()) {
566cdf0e10cSrcweir case sql::TRANSACTION_SERIALIZABLE: return TransactionIsolation::SERIALIZABLE;
567cdf0e10cSrcweir case sql::TRANSACTION_REPEATABLE_READ: return TransactionIsolation::REPEATABLE_READ;
568cdf0e10cSrcweir case sql::TRANSACTION_READ_COMMITTED: return TransactionIsolation::READ_COMMITTED;
569cdf0e10cSrcweir case sql::TRANSACTION_READ_UNCOMMITTED: return TransactionIsolation::READ_UNCOMMITTED;
570cdf0e10cSrcweir default:
571cdf0e10cSrcweir ;
572cdf0e10cSrcweir }
573cdf0e10cSrcweir } catch (sql::SQLException & e) {
574cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
575cdf0e10cSrcweir }
576cdf0e10cSrcweir return TransactionIsolation::NONE;
577cdf0e10cSrcweir }
578cdf0e10cSrcweir /* }}} */
579cdf0e10cSrcweir
580cdf0e10cSrcweir
581cdf0e10cSrcweir /* {{{ OConnection::getTypeMap() -I- */
getTypeMap()582cdf0e10cSrcweir Reference<XNameAccess> SAL_CALL OConnection::getTypeMap()
583cdf0e10cSrcweir throw(SQLException, RuntimeException)
584cdf0e10cSrcweir {
585cdf0e10cSrcweir OSL_TRACE("OConnection::getTypeMap");
586cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
587cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
588cdf0e10cSrcweir
589cdf0e10cSrcweir Reference<XNameAccess > t;
590cdf0e10cSrcweir {
591cdf0e10cSrcweir t = m_typeMap;
592cdf0e10cSrcweir }
593cdf0e10cSrcweir return (t);
594cdf0e10cSrcweir }
595cdf0e10cSrcweir /* }}} */
596cdf0e10cSrcweir
597cdf0e10cSrcweir
598cdf0e10cSrcweir /* {{{ OConnection::setTypeMap() -I- */
setTypeMap(const Reference<XNameAccess> & typeMap)599cdf0e10cSrcweir void SAL_CALL OConnection::setTypeMap(const Reference<XNameAccess >& typeMap)
600cdf0e10cSrcweir throw(SQLException, RuntimeException)
601cdf0e10cSrcweir {
602cdf0e10cSrcweir OSL_TRACE("OConnection::setTypeMap");
603cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
604cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
605cdf0e10cSrcweir
606cdf0e10cSrcweir m_typeMap = typeMap;
607cdf0e10cSrcweir }
608cdf0e10cSrcweir /* }}} */
609cdf0e10cSrcweir
610cdf0e10cSrcweir
611cdf0e10cSrcweir // XCloseable
612cdf0e10cSrcweir /* {{{ OConnection::close() -I- */
close()613cdf0e10cSrcweir void SAL_CALL OConnection::close()
614cdf0e10cSrcweir throw(SQLException, RuntimeException)
615cdf0e10cSrcweir {
616cdf0e10cSrcweir OSL_TRACE("OConnection::close");
617cdf0e10cSrcweir /*
618cdf0e10cSrcweir we need block, because the mutex is a local variable,
619cdf0e10cSrcweir which will guard the block
620cdf0e10cSrcweir */
621cdf0e10cSrcweir {
622cdf0e10cSrcweir // we just dispose us
623cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
624cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
625cdf0e10cSrcweir }
626cdf0e10cSrcweir dispose();
627cdf0e10cSrcweir }
628cdf0e10cSrcweir /* }}} */
629cdf0e10cSrcweir
630cdf0e10cSrcweir
631cdf0e10cSrcweir // XWarningsSupplier
632cdf0e10cSrcweir /* {{{ OConnection::getWarnings() -I- */
getWarnings()633cdf0e10cSrcweir Any SAL_CALL OConnection::getWarnings()
634cdf0e10cSrcweir throw(SQLException, RuntimeException)
635cdf0e10cSrcweir {
636cdf0e10cSrcweir Any x = Any();
637cdf0e10cSrcweir OSL_TRACE("OConnection::getWarnings");
638cdf0e10cSrcweir // when you collected some warnings -> return it
639cdf0e10cSrcweir return x;
640cdf0e10cSrcweir }
641cdf0e10cSrcweir /* }}} */
642cdf0e10cSrcweir
643cdf0e10cSrcweir
644cdf0e10cSrcweir /* {{{ OConnection::clearWarnings() -I- */
clearWarnings()645cdf0e10cSrcweir void SAL_CALL OConnection::clearWarnings()
646cdf0e10cSrcweir throw(SQLException, RuntimeException)
647cdf0e10cSrcweir {
648cdf0e10cSrcweir OSL_TRACE("OConnection::clearWarnings");
649cdf0e10cSrcweir // you should clear your collected warnings here#
650cdf0e10cSrcweir }
651cdf0e10cSrcweir /* }}} */
652cdf0e10cSrcweir
653cdf0e10cSrcweir
654cdf0e10cSrcweir /* {{{ OConnection::buildTypeInfo() -I- */
buildTypeInfo()655cdf0e10cSrcweir void OConnection::buildTypeInfo()
656cdf0e10cSrcweir throw(SQLException)
657cdf0e10cSrcweir {
658cdf0e10cSrcweir OSL_TRACE("OConnection::buildTypeInfo");
659cdf0e10cSrcweir }
660cdf0e10cSrcweir /* }}} */
661cdf0e10cSrcweir
662cdf0e10cSrcweir
663cdf0e10cSrcweir /* {{{ OConnection::disposing() -I- */
disposing()664cdf0e10cSrcweir void OConnection::disposing()
665cdf0e10cSrcweir {
666cdf0e10cSrcweir OSL_TRACE("OConnection::disposing");
667cdf0e10cSrcweir // we noticed that we should be destroied in near future so we have to dispose our statements
668cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
669cdf0e10cSrcweir
670cdf0e10cSrcweir for (OWeakRefArray::iterator i = m_aStatements.begin(); i != m_aStatements.end() ; ++i) {
671cdf0e10cSrcweir Reference< XComponent > xComp(i->get(), UNO_QUERY);
672cdf0e10cSrcweir if (xComp.is()) {
673cdf0e10cSrcweir xComp->dispose();
674cdf0e10cSrcweir }
675cdf0e10cSrcweir }
676cdf0e10cSrcweir m_aStatements.clear();
677cdf0e10cSrcweir
678cdf0e10cSrcweir m_bClosed = sal_True;
679cdf0e10cSrcweir m_xMetaData = WeakReference< XDatabaseMetaData >();
680cdf0e10cSrcweir
681cdf0e10cSrcweir dispose_ChildImpl();
682cdf0e10cSrcweir OConnection_BASE::disposing();
683cdf0e10cSrcweir }
684cdf0e10cSrcweir /* }}} */
685cdf0e10cSrcweir
686cdf0e10cSrcweir
687cdf0e10cSrcweir /* ToDo - upcast the connection to MySQL_Connection and use ::getSessionVariable() */
688cdf0e10cSrcweir
689cdf0e10cSrcweir /* {{{ OConnection::getMysqlVariable() -I- */
getMysqlVariable(const char * varname)690cdf0e10cSrcweir OUString OConnection::getMysqlVariable(const char *varname)
691cdf0e10cSrcweir throw(SQLException, RuntimeException)
692cdf0e10cSrcweir {
693cdf0e10cSrcweir OSL_TRACE("OConnection::getMysqlVariable");
694cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
695cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
696cdf0e10cSrcweir
697cdf0e10cSrcweir OUString ret;
698cdf0e10cSrcweir ::rtl::OUStringBuffer aStatement;
699cdf0e10cSrcweir aStatement.appendAscii( "SHOW SESSION VARIABLES LIKE '" );
700cdf0e10cSrcweir aStatement.appendAscii( varname );
701cdf0e10cSrcweir aStatement.append( sal_Unicode( '\'' ) );
702cdf0e10cSrcweir
703cdf0e10cSrcweir try {
704cdf0e10cSrcweir XStatement * stmt = new OStatement(this, m_settings.cppConnection->createStatement());
705cdf0e10cSrcweir Reference< XResultSet > rs = stmt->executeQuery( aStatement.makeStringAndClear() );
706cdf0e10cSrcweir if (rs.is() && rs->next()) {
707cdf0e10cSrcweir Reference< XRow > xRow(rs, UNO_QUERY);
708cdf0e10cSrcweir ret = xRow->getString(2);
709cdf0e10cSrcweir }
710cdf0e10cSrcweir } catch (sql::SQLException & e) {
711cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
712cdf0e10cSrcweir }
713cdf0e10cSrcweir
714cdf0e10cSrcweir return ret;
715cdf0e10cSrcweir }
716cdf0e10cSrcweir /* }}} */
717cdf0e10cSrcweir
718cdf0e10cSrcweir
719cdf0e10cSrcweir /* {{{ OConnection::getMysqlVersion() -I- */
getMysqlVersion()720cdf0e10cSrcweir sal_Int32 OConnection::getMysqlVersion()
721cdf0e10cSrcweir throw(SQLException, RuntimeException)
722cdf0e10cSrcweir {
723cdf0e10cSrcweir OSL_TRACE("OConnection::getMysqlVersion");
724cdf0e10cSrcweir MutexGuard aGuard(m_aMutex);
725cdf0e10cSrcweir checkDisposed(OConnection_BASE::rBHelper.bDisposed);
726cdf0e10cSrcweir
727cdf0e10cSrcweir sal_Int32 version(0);
728cdf0e10cSrcweir try {
729cdf0e10cSrcweir version = 10000 * m_settings.cppConnection->getMetaData()->getDatabaseMajorVersion();
730cdf0e10cSrcweir version += 100 * m_settings.cppConnection->getMetaData()->getDatabaseMinorVersion();
731cdf0e10cSrcweir version += m_settings.cppConnection->getMetaData()->getDatabasePatchVersion();
732cdf0e10cSrcweir } catch (sql::SQLException & e) {
733cdf0e10cSrcweir mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding());
734cdf0e10cSrcweir }
735cdf0e10cSrcweir return version;
736cdf0e10cSrcweir }
737cdf0e10cSrcweir /* }}} */
738cdf0e10cSrcweir
739cdf0e10cSrcweir
740cdf0e10cSrcweir /* {{{ OConnection::sdbcColumnType() -I- */
741cdf0e10cSrcweir // TODO: Not used
742cdf0e10cSrcweir //sal_Int32 OConnection::sdbcColumnType(OUString typeName)
743cdf0e10cSrcweir //{
744cdf0e10cSrcweir // OSL_TRACE("OConnection::sdbcColumnType");
745cdf0e10cSrcweir // int i = 0;
746cdf0e10cSrcweir // while (mysqlc_types[i].typeName) {
747cdf0e10cSrcweir // if (OUString::createFromAscii(mysqlc_types[i].typeName).equals(
748cdf0e10cSrcweir // typeName.toAsciiUpperCase()))
749cdf0e10cSrcweir // {
750cdf0e10cSrcweir // return mysqlc_types[i].dataType;
751cdf0e10cSrcweir // }
752cdf0e10cSrcweir // i++;
753cdf0e10cSrcweir // }
754cdf0e10cSrcweir // return 0;
755cdf0e10cSrcweir //}
756cdf0e10cSrcweir // -----------------------------------------------------------------------------
transFormPreparedStatement(const::rtl::OUString & _sSQL)757cdf0e10cSrcweir ::rtl::OUString OConnection::transFormPreparedStatement(const ::rtl::OUString& _sSQL)
758cdf0e10cSrcweir {
759cdf0e10cSrcweir ::rtl::OUString sSqlStatement = _sSQL;
760cdf0e10cSrcweir if ( !m_xParameterSubstitution.is() ) {
761cdf0e10cSrcweir try {
762cdf0e10cSrcweir Sequence< Any > aArgs(1);
763cdf0e10cSrcweir Reference< XConnection> xCon = this;
764cdf0e10cSrcweir aArgs[0] <<= NamedValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ActiveConnection")), makeAny(xCon));
765cdf0e10cSrcweir
766cdf0e10cSrcweir m_xParameterSubstitution.set(m_rDriver.getFactory()->createInstanceWithArguments(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.comp.helper.ParameterSubstitution")),aArgs),UNO_QUERY);
767cdf0e10cSrcweir } catch(const Exception&) {}
768cdf0e10cSrcweir }
769cdf0e10cSrcweir if ( m_xParameterSubstitution.is() ) {
770cdf0e10cSrcweir try {
771cdf0e10cSrcweir sSqlStatement = m_xParameterSubstitution->substituteVariables(sSqlStatement,sal_True);
772cdf0e10cSrcweir } catch(const Exception&) { }
773cdf0e10cSrcweir }
774cdf0e10cSrcweir return sSqlStatement;
775cdf0e10cSrcweir }
776cdf0e10cSrcweir
777cdf0e10cSrcweir /* }}} */
778cdf0e10cSrcweir
779cdf0e10cSrcweir /*
780cdf0e10cSrcweir * Local variables:
781cdf0e10cSrcweir * tab-width: 4
782cdf0e10cSrcweir * c-basic-offset: 4
783cdf0e10cSrcweir * End:
784cdf0e10cSrcweir * vim600: noet sw=4 ts=4 fdm=marker
785cdf0e10cSrcweir * vim<600: noet sw=4 ts=4
786cdf0e10cSrcweir */
787