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 <com/sun/star/sdbcx/CompareBookmark.hpp>
27 #include "dbase/DResultSet.hxx"
28 #include <com/sun/star/lang/DisposedException.hpp>
29 #include <comphelper/sequence.hxx>
30 #include "dbase/DIndex.hxx"
31 #include "dbase/DIndexIter.hxx"
32 #include "dbase/DCode.hxx"
33 #include <comphelper/types.hxx>
34 #include <connectivity/dbexception.hxx>
35 #include "resource/dbase_res.hrc"
36
37 using namespace ::comphelper;
38
39 using namespace connectivity::dbase;
40 using namespace connectivity::file;
41 using namespace ::cppu;
42 using namespace com::sun::star::uno;
43 using namespace com::sun::star::lang;
44 using namespace com::sun::star::beans;
45 using namespace com::sun::star::sdbc;
46 using namespace com::sun::star::sdbcx;
47 // using namespace com::sun::star::container;
48 // using namespace com::sun::star::util;
49 //------------------------------------------------------------------------------
ODbaseResultSet(OStatement_Base * pStmt,connectivity::OSQLParseTreeIterator & _aSQLIterator)50 ODbaseResultSet::ODbaseResultSet( OStatement_Base* pStmt,connectivity::OSQLParseTreeIterator& _aSQLIterator)
51 : file::OResultSet(pStmt,_aSQLIterator)
52 ,m_bBookmarkable(sal_True)
53 {
54 registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), PROPERTY_ID_ISBOOKMARKABLE, PropertyAttribute::READONLY,&m_bBookmarkable, ::getBooleanCppuType());
55 }
56 // -------------------------------------------------------------------------
getImplementationName()57 ::rtl::OUString SAL_CALL ODbaseResultSet::getImplementationName( ) throw ( RuntimeException)
58 {
59 return ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.dbase.ResultSet");
60 }
61 // -------------------------------------------------------------------------
getSupportedServiceNames()62 Sequence< ::rtl::OUString > SAL_CALL ODbaseResultSet::getSupportedServiceNames( ) throw( RuntimeException)
63 {
64 Sequence< ::rtl::OUString > aSupported(2);
65 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.ResultSet");
66 aSupported[1] = ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.ResultSet");
67 return aSupported;
68 }
69 // -------------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)70 sal_Bool SAL_CALL ODbaseResultSet::supportsService( const ::rtl::OUString& _rServiceName ) throw( RuntimeException)
71 {
72 Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
73 const ::rtl::OUString* pSupported = aSupported.getConstArray();
74 const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
75 for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
76 ;
77
78 return pSupported != pEnd;
79 }
80 // -------------------------------------------------------------------------
queryInterface(const Type & rType)81 Any SAL_CALL ODbaseResultSet::queryInterface( const Type & rType ) throw(RuntimeException)
82 {
83 Any aRet = ODbaseResultSet_BASE::queryInterface(rType);
84 return aRet.hasValue() ? aRet : OResultSet::queryInterface(rType);
85 }
86 // -------------------------------------------------------------------------
getTypes()87 Sequence< Type > SAL_CALL ODbaseResultSet::getTypes( ) throw( RuntimeException)
88 {
89 return ::comphelper::concatSequences(OResultSet::getTypes(),ODbaseResultSet_BASE::getTypes());
90 }
91
92 // -------------------------------------------------------------------------
93 // XRowLocate
getBookmark()94 Any SAL_CALL ODbaseResultSet::getBookmark( ) throw( SQLException, RuntimeException)
95 {
96 ::osl::MutexGuard aGuard( m_aMutex );
97 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
98 OSL_ENSURE((m_bShowDeleted || !m_aRow->isDeleted()),"getBookmark called for deleted row");
99
100 return makeAny((sal_Int32)(m_aRow->get())[0]->getValue());
101 }
102 // -------------------------------------------------------------------------
moveToBookmark(const Any & bookmark)103 sal_Bool SAL_CALL ODbaseResultSet::moveToBookmark( const Any& bookmark ) throw( SQLException, RuntimeException)
104 {
105 ::osl::MutexGuard aGuard( m_aMutex );
106 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
107
108
109 m_bRowDeleted = m_bRowInserted = m_bRowUpdated = sal_False;
110
111 return m_pTable ? Move(IResultSetHelper::BOOKMARK,comphelper::getINT32(bookmark),sal_True) : sal_False;
112 }
113 // -------------------------------------------------------------------------
moveRelativeToBookmark(const Any & bookmark,sal_Int32 rows)114 sal_Bool SAL_CALL ODbaseResultSet::moveRelativeToBookmark( const Any& bookmark, sal_Int32 rows ) throw( SQLException, RuntimeException)
115 {
116 ::osl::MutexGuard aGuard( m_aMutex );
117 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
118 if(!m_pTable)
119 return sal_False;
120
121
122 Move(IResultSetHelper::BOOKMARK,comphelper::getINT32(bookmark),sal_False);
123
124 return relative(rows);
125 }
126
127 // -------------------------------------------------------------------------
compareBookmarks(const Any & lhs,const Any & rhs)128 sal_Int32 SAL_CALL ODbaseResultSet::compareBookmarks( const Any& lhs, const Any& rhs ) throw( SQLException, RuntimeException)
129 {
130 sal_Int32 nFirst(0),nSecond(0),nResult(0);
131 if ( !( lhs >>= nFirst ) || !( rhs >>= nSecond ) )
132 {
133 ::connectivity::SharedResources aResources;
134 const ::rtl::OUString sMessage = aResources.getResourceString(STR_INVALID_BOOKMARK);
135 ::dbtools::throwGenericSQLException(sMessage ,*this);
136 } // if ( !( lhs >>= nFirst ) || !( rhs >>= nSecond ) )
137
138 // have a look at CompareBookmark
139 // we can't use the names there because we already have defines with the same name from the parser
140 if(nFirst < nSecond)
141 nResult = -1;
142 else if(nFirst > nSecond)
143 nResult = 1;
144 else
145 nResult = 0;
146
147 return nResult;
148 }
149 // -------------------------------------------------------------------------
hasOrderedBookmarks()150 sal_Bool SAL_CALL ODbaseResultSet::hasOrderedBookmarks( ) throw( SQLException, RuntimeException)
151 {
152 return sal_True;
153 }
154 // -------------------------------------------------------------------------
hashBookmark(const Any & bookmark)155 sal_Int32 SAL_CALL ODbaseResultSet::hashBookmark( const Any& bookmark ) throw( SQLException, RuntimeException)
156 {
157 ::osl::MutexGuard aGuard( m_aMutex );
158 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
159
160
161 return comphelper::getINT32(bookmark);
162 }
163 // -------------------------------------------------------------------------
164 // XDeleteRows
deleteRows(const Sequence<Any> &)165 Sequence< sal_Int32 > SAL_CALL ODbaseResultSet::deleteRows( const Sequence< Any >& /*rows*/ ) throw( SQLException, RuntimeException)
166 {
167 ::osl::MutexGuard aGuard( m_aMutex );
168 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
169
170 ::dbtools::throwFeatureNotImplementedException( "XDeleteRows::deleteRows", *this );
171 return Sequence< sal_Int32 >();
172 }
173 // -------------------------------------------------------------------------
fillIndexValues(const Reference<XColumnsSupplier> & _xIndex)174 sal_Bool ODbaseResultSet::fillIndexValues(const Reference< XColumnsSupplier> &_xIndex)
175 {
176 Reference<XUnoTunnel> xTunnel(_xIndex,UNO_QUERY);
177 if(xTunnel.is())
178 {
179 dbase::ODbaseIndex* pIndex = reinterpret_cast< dbase::ODbaseIndex* >( xTunnel->getSomething(dbase::ODbaseIndex::getUnoTunnelImplementationId()) );
180 if(pIndex)
181 {
182 dbase::OIndexIterator* pIter = pIndex->createIterator(NULL,NULL);
183
184 if (pIter)
185 {
186 sal_uInt32 nRec = pIter->First();
187 while (nRec != SQL_COLUMN_NOTFOUND)
188 {
189 if (m_aOrderbyAscending[0])
190 m_pFileSet->get().push_back(nRec);
191 else
192 m_pFileSet->get().insert(m_pFileSet->get().begin(),nRec);
193 nRec = pIter->Next();
194 }
195 m_pFileSet->setFrozen();
196 // if(!bDistinct)
197 // SetRowCount(pFileSet->count());
198 delete pIter;
199 return sal_True;
200 }
201 delete pIter;
202 }
203 }
204 return sal_False;
205 }
206 // -------------------------------------------------------------------------
getInfoHelper()207 ::cppu::IPropertyArrayHelper & ODbaseResultSet::getInfoHelper()
208 {
209 return *ODbaseResultSet_BASE3::getArrayHelper();
210 }
211 // -----------------------------------------------------------------------------
createArrayHelper() const212 ::cppu::IPropertyArrayHelper* ODbaseResultSet::createArrayHelper() const
213 {
214 Sequence< Property > aProps;
215 describeProperties(aProps);
216 return new ::cppu::OPropertyArrayHelper(aProps);
217 }
218 // -----------------------------------------------------------------------------
acquire()219 void SAL_CALL ODbaseResultSet::acquire() throw()
220 {
221 ODbaseResultSet_BASE2::acquire();
222 }
223 // -----------------------------------------------------------------------------
release()224 void SAL_CALL ODbaseResultSet::release() throw()
225 {
226 ODbaseResultSet_BASE2::release();
227 }
228 // -----------------------------------------------------------------------------
getPropertySetInfo()229 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL ODbaseResultSet::getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException)
230 {
231 return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
232 }
233 // -----------------------------------------------------------------------------
createAnalyzer()234 OSQLAnalyzer* ODbaseResultSet::createAnalyzer()
235 {
236 return new OFILEAnalyzer(m_pTable->getConnection());
237 }
238 // -----------------------------------------------------------------------------
getCurrentFilePos() const239 sal_Int32 ODbaseResultSet::getCurrentFilePos() const
240 {
241 return m_pTable->getFilePos();
242 }
243 // -----------------------------------------------------------------------------
244
245
246