gh-69093: Support basic incremental I/O to blobs in sqlite3 (GH-30680)

Authored-by: Aviv Palivoda <palaviv@gmail.com>
Co-authored-by: Erlend E. Aasland <erlend.aasland@innova.no>
Co-authored-by: palaviv <palaviv@gmail.com>
Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
Erlend Egeberg Aasland 2022-04-15 02:02:56 +02:00 committed by GitHub
parent c9d41bcd68
commit ee475430d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 989 additions and 7 deletions

View file

@ -394,6 +394,20 @@ Connection Objects
supplied, this must be a callable returning an instance of :class:`Cursor`
or its subclasses.
.. method:: blobopen(table, column, row, /, *, readonly=False, name="main")
Open a :class:`Blob` handle to the :abbr:`BLOB (Binary Large OBject)`
located in row *row*, column *column*, table *table* of database *name*.
When *readonly* is :const:`True` the blob is opened without write
permissions.
.. note::
The blob size cannot be changed using the :class:`Blob` class.
Use the SQL function ``zeroblob`` to create a blob with a fixed size.
.. versionadded:: 3.11
.. method:: commit()
This method commits the current transaction. If you don't call this method,
@ -1088,6 +1102,58 @@ Exceptions
transactions turned off. It is a subclass of :exc:`DatabaseError`.
.. _sqlite3-blob-objects:
Blob Objects
------------
.. versionadded:: 3.11
.. class:: Blob
A :class:`Blob` instance is a :term:`file-like object` that can read and write
data in an SQLite :abbr:`BLOB (Binary Large OBject)`. Call ``len(blob)`` to
get the size (number of bytes) of the blob.
.. method:: close()
Close the blob.
The blob will be unusable from this point onward. An
:class:`~sqlite3.Error` (or subclass) exception will be raised if any
further operation is attempted with the blob.
.. method:: read(length=-1, /)
Read *length* bytes of data from the blob at the current offset position.
If the end of the blob is reached, the data up to
:abbr:`EOF (End of File)` will be returned. When *length* is not
specified, or is negative, :meth:`~Blob.read` will read until the end of
the blob.
.. method:: write(data, /)
Write *data* to the blob at the current offset. This function cannot
change the blob length. Writing beyond the end of the blob will raise
:exc:`ValueError`.
.. method:: tell()
Return the current access position of the blob.
.. method:: seek(offset, origin=os.SEEK_SET, /)
Set the current access position of the blob to *offset*. The *origin*
argument defaults to :data:`os.SEEK_SET` (absolute blob positioning).
Other values for *origin* are :data:`os.SEEK_CUR` (seek relative to the
current position) and :data:`os.SEEK_END` (seek relative to the blobs
end).
:class:`Blob` example:
.. literalinclude:: ../includes/sqlite3/blob.py
.. _sqlite3-types:
SQLite and Python types