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 // -------------------------------------------------------------------------------- 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 //----------------------------------------------------------------------------- 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 //----------------------------------------------------------------------------- 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 // -------------------------------------------------------------------------------- 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 //------------------------------------------------------------------------------ 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 // -------------------------------------------------------------------------------- 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 // -------------------------------------------------------------------------------- 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 // -------------------------------------------------------------------------------- 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