xref: /AOO41X/main/connectivity/source/drivers/flat/EConnection.cxx (revision 9b5730f6ddef7eb82608ca4d31dc0d7678e652cf)
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 "flat/EConnection.hxx"
27 #include "flat/EDatabaseMetaData.hxx"
28 #include "flat/ECatalog.hxx"
29 #ifndef _CONNECTIVITY_FLAT_ODRIVER_HXX_
30 #include "flat/EDriver.hxx"
31 #endif
32 #include <com/sun/star/lang/DisposedException.hpp>
33 #include <tools/urlobj.hxx>
34 #include "flat/EPreparedStatement.hxx"
35 #ifndef _CONNECTIVITY_FLAT_DSTATEMENT_HXX_
36 #include "flat/EStatement.hxx"
37 #endif
38 #include <comphelper/extract.hxx>
39 #include <connectivity/dbexception.hxx>
40 
41 using namespace connectivity::flat;
42 using namespace connectivity::file;
43 
44 typedef connectivity::file::OConnection  OConnection_B;
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 
53 // --------------------------------------------------------------------------------
OFlatConnection(ODriver * _pDriver)54 OFlatConnection::OFlatConnection(ODriver*   _pDriver) : OConnection(_pDriver)
55     ,m_nMaxRowsToScan(50)
56     ,m_bHeaderLine(sal_True)
57     ,m_cFieldDelimiter(';')
58     ,m_cStringDelimiter('"')
59     ,m_cDecimalDelimiter(',')
60     ,m_cThousandDelimiter('.')
61 {
62 }
63 //-----------------------------------------------------------------------------
~OFlatConnection()64 OFlatConnection::~OFlatConnection()
65 {
66 }
67 
68 // XServiceInfo
69 // --------------------------------------------------------------------------------
70 IMPLEMENT_SERVICE_INFO(OFlatConnection, "com.sun.star.sdbc.drivers.flat.Connection", "com.sun.star.sdbc.Connection")
71 
72 //-----------------------------------------------------------------------------
construct(const::rtl::OUString & url,const Sequence<PropertyValue> & info)73 void OFlatConnection::construct(const ::rtl::OUString& url,const Sequence< PropertyValue >& info)  throw(SQLException)
74 {
75     osl_incrementInterlockedCount( &m_refCount );
76 
77     ::rtl::OUString aExt;
78     const PropertyValue *pBegin  = info.getConstArray();
79     const PropertyValue *pEnd    = pBegin + info.getLength();
80     for(;pBegin != pEnd;++pBegin)
81     {
82         if(!pBegin->Name.compareToAscii("HeaderLine"))
83             OSL_VERIFY( pBegin->Value >>= m_bHeaderLine );
84         else if(!pBegin->Name.compareToAscii("FieldDelimiter"))
85         {
86             ::rtl::OUString aVal;
87             OSL_VERIFY( pBegin->Value >>= aVal );
88             m_cFieldDelimiter = aVal.toChar();
89         }
90         else if(!pBegin->Name.compareToAscii("StringDelimiter"))
91         {
92             ::rtl::OUString aVal;
93             OSL_VERIFY( pBegin->Value >>= aVal );
94             m_cStringDelimiter = aVal.toChar();
95         }
96         else if(!pBegin->Name.compareToAscii("DecimalDelimiter"))
97         {
98             ::rtl::OUString aVal;
99             OSL_VERIFY( pBegin->Value >>= aVal );
100             m_cDecimalDelimiter = aVal.toChar();
101         }
102         else if(!pBegin->Name.compareToAscii("ThousandDelimiter"))
103         {
104             ::rtl::OUString aVal;
105             OSL_VERIFY( pBegin->Value >>= aVal );
106             m_cThousandDelimiter = aVal.toChar();
107         }
108         else if ( !pBegin->Name.compareToAscii("MaxRowScan") )
109         {
110             pBegin->Value >>= m_nMaxRowsToScan;
111         }
112     }
113 
114     osl_decrementInterlockedCount( &m_refCount );
115     OConnection::construct(url,info);
116     m_bShowDeleted = sal_True; // we do not supported rows for this type
117 }
118 // --------------------------------------------------------------------------------
getMetaData()119 Reference< XDatabaseMetaData > SAL_CALL OFlatConnection::getMetaData(  ) throw(SQLException, RuntimeException)
120 {
121     ::osl::MutexGuard aGuard( m_aMutex );
122     checkDisposed(OConnection_B::rBHelper.bDisposed);
123 
124 
125     Reference< XDatabaseMetaData > xMetaData = m_xMetaData;
126     if(!xMetaData.is())
127     {
128         xMetaData = new OFlatDatabaseMetaData(this);
129         m_xMetaData = xMetaData;
130     }
131 
132     return xMetaData;
133 }
134 //------------------------------------------------------------------------------
createCatalog()135 ::com::sun::star::uno::Reference< XTablesSupplier > OFlatConnection::createCatalog()
136 {
137     ::osl::MutexGuard aGuard( m_aMutex );
138     Reference< XTablesSupplier > xTab = m_xCatalog;
139     if(!xTab.is())
140     {
141         OFlatCatalog *pCat = new OFlatCatalog(this);
142         xTab = pCat;
143         m_xCatalog = xTab;
144     }
145     return xTab;
146 }
147 // --------------------------------------------------------------------------------
createStatement()148 Reference< XStatement > SAL_CALL OFlatConnection::createStatement(  ) throw(SQLException, RuntimeException)
149 {
150     ::osl::MutexGuard aGuard( m_aMutex );
151     checkDisposed(OConnection_B::rBHelper.bDisposed);
152 
153     OFlatStatement* pStmt = new OFlatStatement(this);
154 
155     Reference< XStatement > xStmt = pStmt;
156     m_aStatements.push_back(WeakReferenceHelper(*pStmt));
157     return xStmt;
158 }
159 // --------------------------------------------------------------------------------
prepareStatement(const::rtl::OUString & sql)160 Reference< XPreparedStatement > SAL_CALL OFlatConnection::prepareStatement( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
161 {
162     ::osl::MutexGuard aGuard( m_aMutex );
163     checkDisposed(OConnection_B::rBHelper.bDisposed);
164 
165 
166     OFlatPreparedStatement* pStmt = new OFlatPreparedStatement(this);
167     Reference< XPreparedStatement > xStmt = pStmt;
168     pStmt->construct(sql);
169 
170     m_aStatements.push_back(WeakReferenceHelper(*pStmt));
171     return xStmt;
172 }
173 // --------------------------------------------------------------------------------
prepareCall(const::rtl::OUString &)174 Reference< XPreparedStatement > SAL_CALL OFlatConnection::prepareCall( const ::rtl::OUString& /*sql*/ ) throw(SQLException, RuntimeException)
175 {
176     ::osl::MutexGuard aGuard( m_aMutex );
177     checkDisposed(OConnection_B::rBHelper.bDisposed);
178 
179     ::dbtools::throwFeatureNotImplementedException( "XConnection::prepareCall", *this );
180     return NULL;
181 }
182 
183 
184