xref: /AOO41X/main/connectivity/source/drivers/dbase/DResultSet.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 <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