xref: /AOO41X/main/connectivity/source/drivers/adabas/BResultSet.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 "adabas/BResultSet.hxx"
27 #include "adabas/BResultSetMetaData.hxx"
28 #include <com/sun/star/lang/DisposedException.hpp>
29 #include "odbc/OTools.hxx"
30 
31 using namespace connectivity::adabas;
32 using namespace connectivity::odbc;
33 using namespace cppu;
34 using namespace com::sun::star::uno;
35 using namespace com::sun::star::lang;
36 using namespace com::sun::star::beans;
37 using namespace com::sun::star::sdbc;
38 using namespace com::sun::star::sdbcx;
39 using namespace com::sun::star::container;
40 using namespace com::sun::star::io;
41 using namespace com::sun::star::util;
42 
43 // comment: all this movement methods are needed because adabas doesn't support a SQLGetData call when
44 // the cursor was moved with a call of SQLFetchScroll. So when this is fixed by adabas we can remove this damn thing.
45 
46 
next()47 sal_Bool SAL_CALL OAdabasResultSet::next(  ) throw(SQLException, RuntimeException)
48 {
49     ::osl::MutexGuard aGuard( m_aMutex );
50     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
51 
52 
53     m_nLastColumnPos = 0;
54     //  m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_NEXT,0);
55     m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
56 
57     if(m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO)
58         ++m_nRowPos;
59 
60     OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
61     return m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
62 }
63 // -----------------------------------------------------------------------------
first()64 sal_Bool SAL_CALL OAdabasResultSet::first(  ) throw(SQLException, RuntimeException)
65 {
66     ::osl::MutexGuard aGuard( m_aMutex );
67     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
68 
69 
70     m_nLastColumnPos = 0;
71     // don't ask why !
72     N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_OFF,SQL_IS_UINTEGER);
73     m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_FIRST,0);
74     sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
75     if(bRet)
76     {
77         m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
78         N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_ON,SQL_IS_UINTEGER);
79         m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
80     }
81 
82     OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
83 
84     bRet = ( m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO );
85     if ( bRet )
86         m_nRowPos = 1;
87     return bRet;
88 }
89 // -------------------------------------------------------------------------
90 
last()91 sal_Bool SAL_CALL OAdabasResultSet::last(  ) throw(SQLException, RuntimeException)
92 {
93     ::osl::MutexGuard aGuard( m_aMutex );
94     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
95 
96 
97     m_nLastColumnPos = 0;
98     N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_OFF,SQL_IS_UINTEGER);
99     m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_LAST,0);
100     sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
101     if(bRet)
102     {
103         m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
104         N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_ON,SQL_IS_UINTEGER);
105         m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
106     }
107 
108     m_bEOF = sal_True;
109     OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
110     // here I know definitely that I stand on the last record
111     return m_bLastRecord = (m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO);
112 }
113 // -------------------------------------------------------------------------
absolute(sal_Int32 row)114 sal_Bool SAL_CALL OAdabasResultSet::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
115 {
116     ::osl::MutexGuard aGuard( m_aMutex );
117     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
118 
119 
120     m_nLastColumnPos = 0;
121     N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_OFF,SQL_IS_UINTEGER);
122 
123     m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_ABSOLUTE,row);
124     sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
125     if(bRet)
126     {
127         m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
128         N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_ON,SQL_IS_UINTEGER);
129         m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
130     }
131 
132     OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
133     if(bRet)
134         m_nRowPos = row;
135     return bRet;
136 }
137 // -------------------------------------------------------------------------
relative(sal_Int32 row)138 sal_Bool SAL_CALL OAdabasResultSet::relative( sal_Int32 row ) throw(SQLException, RuntimeException)
139 {
140     ::osl::MutexGuard aGuard( m_aMutex );
141     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
142 
143 
144     m_nLastColumnPos = 0;
145     N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_OFF,SQL_IS_UINTEGER);
146     m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,row);
147     sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
148     if(bRet)
149     {
150         m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
151         N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_ON,SQL_IS_UINTEGER);
152         m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
153     }
154 
155     OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
156     if(bRet)
157         m_nRowPos += row;
158     return bRet;
159 }
160 // -------------------------------------------------------------------------
previous()161 sal_Bool SAL_CALL OAdabasResultSet::previous(  ) throw(SQLException, RuntimeException)
162 {
163     ::osl::MutexGuard aGuard( m_aMutex );
164     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
165 
166 
167     m_nLastColumnPos = 0;
168     N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_OFF,SQL_IS_UINTEGER);
169     m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
170     sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
171     if(bRet)
172     {
173         m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
174         N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_ON,SQL_IS_UINTEGER);
175         m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
176     }
177 
178     OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
179     if(bRet || m_nCurrentFetchState == SQL_NO_DATA)
180         --m_nRowPos;
181     return bRet;
182 }
183 // -----------------------------------------------------------------------------
refreshRow()184 void SAL_CALL OAdabasResultSet::refreshRow(  ) throw(SQLException, RuntimeException)
185 {
186     ::osl::MutexGuard aGuard( m_aMutex );
187     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
188 
189 
190     //  SQLRETURN nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_REFRESH,SQL_LOCK_NO_CHANGE);
191     N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_OFF,SQL_IS_UINTEGER);
192     m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,0);
193     sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
194     if(bRet)
195     {
196         m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
197         N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_RETRIEVE_DATA,(SQLPOINTER)SQL_RD_ON,SQL_IS_UINTEGER);
198         m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
199     }
200     OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
201 }
202 // -----------------------------------------------------------------------------
getMetaData()203 Reference< XResultSetMetaData > SAL_CALL OAdabasResultSet::getMetaData(  ) throw(SQLException, RuntimeException)
204 {
205     ::osl::MutexGuard aGuard( m_aMutex );
206     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
207 
208 
209     if(!m_xMetaData.is())
210         m_xMetaData = new OAdabasResultSetMetaData(m_pStatement->getOwnConnection(),m_aStatementHandle,m_aSelectColumns);
211     return m_xMetaData;
212 }
213 // -----------------------------------------------------------------------------
214 
215 
216 
217 
218 
219 
220