@@ -196,9 +196,11 @@ Statement::Statement(Statement&& o) noexcept
196196 outMessage{std::move (o.outMessage )},
197197 outRow{std::make_unique<Row>(attachment->getClient (), outDescriptors, std::span{outMessage})},
198198 type{o.type },
199- cursorFlags{o.cursorFlags }
199+ cursorFlags{o.cursorFlags },
200+ currentRow{o.currentRow }
200201{
201202 o.outRow .reset ();
203+ o.currentRow = false ;
202204}
203205
204206Statement& Statement::operator =(Statement&& o) noexcept
@@ -220,8 +222,10 @@ Statement& Statement::operator=(Statement&& o) noexcept
220222 outRow = std::make_unique<Row>(attachment->getClient (), outDescriptors, std::span{outMessage});
221223 type = o.type ;
222224 cursorFlags = o.cursorFlags ;
225+ currentRow = o.currentRow ;
223226
224227 o.outRow .reset ();
228+ o.currentRow = false ;
225229 }
226230
227231 return *this ;
@@ -237,6 +241,7 @@ void Statement::free()
237241 resultSetHandle.reset ();
238242 }
239243
244+ currentRow = false ;
240245 statementHandle->free (&statusWrapper);
241246 statementHandle.reset ();
242247}
@@ -266,6 +271,8 @@ bool Statement::execute(Transaction& transaction)
266271 resultSetHandle.reset ();
267272 }
268273
274+ currentRow = false ;
275+
269276 const auto outMessageData = outMessage.data ();
270277
271278 if (outMessageData)
@@ -280,11 +287,13 @@ bool Statement::execute(Transaction& transaction)
280287 case StatementType::SELECT_FOR_UPDATE :
281288 resultSetHandle.reset (statementHandle->openCursor (&statusWrapper, transaction.getHandle ().get (),
282289 inMetadata.get (), inMessage.data (), outMetadata.get (), cursorFlags));
283- return resultSetHandle->fetchNext (&statusWrapper, outMessageData) == fb::IStatus::RESULT_OK ;
290+ currentRow = resultSetHandle->fetchNext (&statusWrapper, outMessageData) == fb::IStatus::RESULT_OK ;
291+ return currentRow;
284292
285293 default :
286294 statementHandle->execute (&statusWrapper, transaction.getHandle ().get (), inMetadata.get (), inMessage.data (),
287295 outMetadata.get (), outMessageData);
296+ currentRow = !outDescriptors.empty ();
288297 return true ;
289298 }
290299}
@@ -298,43 +307,52 @@ bool Statement::fetchNext()
298307{
299308 assert (isValid ());
300309
301- return resultSetHandle && resultSetHandle->fetchNext (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
310+ currentRow = resultSetHandle && resultSetHandle->fetchNext (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
311+ return currentRow;
302312}
303313
304314bool Statement::fetchPrior ()
305315{
306316 assert (isValid ());
307317
308- return resultSetHandle && resultSetHandle->fetchPrior (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
318+ currentRow =
319+ resultSetHandle && resultSetHandle->fetchPrior (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
320+ return currentRow;
309321}
310322
311323bool Statement::fetchFirst ()
312324{
313325 assert (isValid ());
314326
315- return resultSetHandle && resultSetHandle->fetchFirst (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
327+ currentRow =
328+ resultSetHandle && resultSetHandle->fetchFirst (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
329+ return currentRow;
316330}
317331
318332bool Statement::fetchLast ()
319333{
320334 assert (isValid ());
321335
322- return resultSetHandle && resultSetHandle->fetchLast (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
336+ currentRow =
337+ resultSetHandle && resultSetHandle->fetchLast (&statusWrapper, outMessage.data ()) == fb::IStatus::RESULT_OK ;
338+ return currentRow;
323339}
324340
325341bool Statement::fetchAbsolute (unsigned position)
326342{
327343 assert (isValid ());
328344
329- return resultSetHandle &&
345+ currentRow = resultSetHandle &&
330346 resultSetHandle->fetchAbsolute (&statusWrapper, static_cast <int >(position), outMessage.data ()) ==
331- fb::IStatus::RESULT_OK ;
347+ fb::IStatus::RESULT_OK ;
348+ return currentRow;
332349}
333350
334351bool Statement::fetchRelative (int offset)
335352{
336353 assert (isValid ());
337354
338- return resultSetHandle &&
355+ currentRow = resultSetHandle &&
339356 resultSetHandle->fetchRelative (&statusWrapper, offset, outMessage.data ()) == fb::IStatus::RESULT_OK ;
357+ return currentRow;
340358}
0 commit comments