|
21 | 21 | TYPE_CHECKING, |
22 | 22 | Any, |
23 | 23 | Callable, |
24 | | - Generator, |
25 | 24 | Iterator, |
26 | 25 | NamedTuple, |
27 | 26 | NoReturn, |
@@ -1242,37 +1241,30 @@ def executemany( |
1242 | 1241 |
|
1243 | 1242 | return self |
1244 | 1243 |
|
1245 | | - def _result_iterator( |
1246 | | - self, |
1247 | | - ) -> Generator[dict, None, None] | Generator[tuple, None, None]: |
1248 | | - """Yields the elements from _result and raises an exception when appropriate.""" |
1249 | | - try: |
1250 | | - for _next in self._result: |
1251 | | - if isinstance(_next, Exception): |
1252 | | - Error.errorhandler_wrapper_from_ready_exception( |
1253 | | - self._connection, |
1254 | | - self, |
1255 | | - _next, |
1256 | | - ) |
1257 | | - self._rownumber += 1 |
1258 | | - yield _next |
1259 | | - except TypeError as err: |
1260 | | - if self._result_state == ResultState.DEFAULT: |
1261 | | - raise err |
1262 | | - else: |
1263 | | - yield None |
1264 | | - |
1265 | 1244 | def fetchone(self) -> dict | tuple | None: |
1266 | 1245 | """Fetches one row.""" |
1267 | 1246 | if self._prefetch_hook is not None: |
1268 | 1247 | self._prefetch_hook() |
1269 | 1248 | if self._result is None and self._result_set is not None: |
1270 | 1249 | self._result = iter(self._result_set) |
1271 | 1250 | self._result_state = ResultState.VALID |
| 1251 | + |
1272 | 1252 | try: |
1273 | | - return next(self._result_iterator()) |
1274 | | - except StopIteration: |
1275 | | - return None |
| 1253 | + _next = next(self._result, None) |
| 1254 | + if isinstance(_next, Exception): |
| 1255 | + Error.errorhandler_wrapper_from_ready_exception( |
| 1256 | + self._connection, |
| 1257 | + self, |
| 1258 | + _next, |
| 1259 | + ) |
| 1260 | + if _next is not None: |
| 1261 | + self._rownumber += 1 |
| 1262 | + return _next |
| 1263 | + except TypeError as err: |
| 1264 | + if self._result_state == ResultState.DEFAULT: |
| 1265 | + raise err |
| 1266 | + else: |
| 1267 | + return None |
1276 | 1268 |
|
1277 | 1269 | def fetchmany(self, size: int | None = None) -> list[tuple] | list[dict]: |
1278 | 1270 | """Fetches the number of specified rows.""" |
@@ -1369,11 +1361,11 @@ def reset(self, closing: bool = False) -> None: |
1369 | 1361 |
|
1370 | 1362 | def __iter__(self) -> Iterator[dict] | Iterator[tuple]: |
1371 | 1363 | """Iteration over the result set.""" |
1372 | | - # set _result if _result_set is not None |
1373 | | - if self._result is None and self._result_set is not None: |
1374 | | - self._result = iter(self._result_set) |
1375 | | - self._result_state = ResultState.VALID |
1376 | | - return self._result_iterator() |
| 1364 | + while True: |
| 1365 | + _next = self.fetchone() |
| 1366 | + if _next is None: |
| 1367 | + break |
| 1368 | + yield _next |
1377 | 1369 |
|
1378 | 1370 | def __cancel_query(self, query) -> None: |
1379 | 1371 | if self._sequence_counter >= 0 and not self.is_closed(): |
|
0 commit comments