2222 SQCLOUD_RESULT_TYPE ,
2323 SQCloudConfig ,
2424 SQCloudConnect ,
25+ SQCloudException ,
2526 SqliteCloudAccount ,
2627 SQLiteCloudDataTypes ,
2728)
@@ -198,12 +199,12 @@ def close(self):
198199
199200 def commit (self ):
200201 """
201- This method is a no-op as SQLite Cloud is currently not supporting transactions .
202+ Not implementied yet .
202203 """
203204
204205 def rollback (self ):
205206 """
206- This method is a no-op as SQLite Cloud is currently not supporting transactions .
207+ Not implemented yet .
207208 """
208209
209210 def cursor (self ):
@@ -290,15 +291,21 @@ def rowcount(self) -> int:
290291 """
291292 return self ._resultset .nrows if self ._is_result_rowset () else - 1
292293
293- def close (self ) -> None :
294+ @property
295+ def lastrowid (self ) -> Optional [int ]:
296+ """
297+ Not implemented yet in the library.
294298 """
295- Closes the database connection use to create the cursor.
299+ return None
296300
297- Note:
298- DB-API 2.0 interface does not manage the Sqlite Cloud PubSub feature.
299- Therefore, only the main socket is closed.
301+ def close (self ) -> None :
302+ """
303+ Just mark the cursors to be no more usable in SQLite Cloud database.
304+ In sqlite the `close()` is used to free up resources: https://devpress.csdn.net/python/62fe355b7e668234661931d8.html
300305 """
301- self ._driver .disconnect (self .connection .sqlcloud_connection , True )
306+ self ._ensure_connection ()
307+
308+ self ._connection = None
302309
303310 def execute (
304311 self ,
@@ -330,6 +337,8 @@ def execute(
330337 Returns:
331338 Cursor: The cursor object.
332339 """
340+ self ._ensure_connection ()
341+
333342 prepared_statement = self ._driver .prepare_statement (sql , parameters )
334343 result = self ._driver .execute (
335344 prepared_statement , self .connection .sqlcloud_connection
@@ -361,6 +370,8 @@ def executemany(
361370 Returns:
362371 Cursor: The cursor object.
363372 """
373+ self ._ensure_connection ()
374+
364375 commands = ""
365376 for parameters in seq_of_parameters :
366377 prepared_statement = self ._driver .prepare_statement (sql , parameters )
@@ -379,6 +390,8 @@ def fetchone(self) -> Optional[Any]:
379390 The next row of the query result set as a tuple,
380391 or None if no more rows are available.
381392 """
393+ self ._ensure_connection ()
394+
382395 if not self ._is_result_rowset ():
383396 return None
384397
@@ -395,6 +408,8 @@ def fetchmany(self, size=None) -> List[Any]:
395408 Returns:
396409 List[Tuple]: A list of rows, where each row is represented as a tuple.
397410 """
411+ self ._ensure_connection ()
412+
398413 if not self ._is_result_rowset ():
399414 return []
400415
@@ -417,6 +432,8 @@ def fetchall(self) -> List[Any]:
417432 Returns:
418433 A list of rows, where each row is represented as a tuple.
419434 """
435+ self ._ensure_connection ()
436+
420437 if not self ._is_result_rowset ():
421438 return []
422439
@@ -439,10 +456,22 @@ def _is_result_rowset(self) -> bool:
439456 self ._resultset and self ._resultset .tag == SQCLOUD_RESULT_TYPE .RESULT_ROWSET
440457 )
441458
459+ def _ensure_connection (self ):
460+ """
461+ Ensure the cursor is usable or has been closed.
462+
463+ Raises:
464+ SQCloudException: If the cursor is closed.
465+ """
466+ if not self ._connection :
467+ raise SQCloudException ("The cursor is closed." )
468+
442469 def __iter__ (self ) -> "Cursor" :
443470 return self
444471
445472 def __next__ (self ) -> Optional [Tuple [Any ]]:
473+ self ._ensure_connection ()
474+
446475 if (
447476 not self ._resultset .is_result
448477 and self ._resultset .data
@@ -457,6 +486,3 @@ def __next__(self) -> Optional[Tuple[Any]]:
457486 return self ._call_row_factory (out )
458487
459488 raise StopIteration
460-
461- def __len__ (self ) -> int :
462- return self .rowcount
0 commit comments