.. _module-pw_blob_store: ============= pw_blob_store ============= ``pw_blob_store`` is a storage container library for storing a single blob of data. ``BlobStore`` is a flash-backed persistent storage system with integrated data integrity checking that serves as a lightweight alternative to a file system. ----- Usage ----- Most operations on a ``BlobStore`` are done using ``BlobReader`` and ``BlobWriter`` objects that have been constructed using a ``BlobStore``. Though a ``BlobStore`` may have multiple open ``BlobReader`` objects, no other readers/writers may be active if a ``BlobWriter`` is opened on a blob store. The data state of a blob can be checked using the ``HasData()`` method. The method returns true if the blob is currenty valid and has at least one data byte. This allows checking if a blob has stored data without needing to instantiate and open a reader or writer. Write buffer ============ BlobStore uses a write buffer to allow writes smaller than and/or unaligned to the flash write aligment. BlobStore also supports using the write buffer for deferred writes that can be enqueued and written to flash at a later time or by a different thread/context. BlobStore can be used with a zero-size write buffer to reduce memory requirements. When using zero-size write buffer, the user is required to write maintain write sizes that are a multiple of the flash write size the blob is configured for. If a non-zero sized write buffer is used, the write buffer size must be a multiple of the flash write size. Writing to a BlobStore ---------------------- ``BlobWriter`` objects are ``pw::stream::Writer`` compatible, but do not support reading any of the blob's contents. Opening a ``BlobWriter`` on a ``BlobStore`` that contains data will discard any existing data if ``Discard()``, ``Write ()``, or ``Erase()`` are called. There is currently no mechanism to allow appending to existing data. .. code-block:: cpp BlobStore::BlobWriterWithBuffer writer(my_blob_store); writer.Open(); writer.Write(my_data); // ... // A close is implied when a BlobWriter is destroyed. Manually closing a // BlobWriter enables error handling on Close() failure. writer.Close(); Erasing a BlobStore =================== There are two distinctly different mechanisms to "erase" the contents of a BlobStore: #. ``Discard()``: Discards any ongoing writes and ensures ``BlobReader`` objects see the ``BlobStore`` as empty. This is the fastest way to logically erase a ``BlobStore``. #. ``Erase()``: Performs an explicit flash erase of the ``BlobStore``'s underlying partition. This is useful for manually controlling when a flash erase is performed before a ``BlobWriter`` starts to write data (as flash erase operations may be time-consuming). Naming a BlobStore's contents ============================= Data in a ``BlobStore`` May be named similarly to a file. This enables identification of a BlobStore's contents in cases where different data may be stored to a shared blob store. This requires an additional RAM buffer that can be used to encode the BlobStore's KVS metadata entry. Calling ``MaxFileNameLength()`` on a ``BlobWriter`` will provide the max file name length based on the ``BlobWriter``'s metadata encode buffer size. ``SetFileName()`` performs a copy of the provided file name, meaning it's safe for the ``std::string_view`` to be invalidated after the function returns. .. code-block:: cpp constexpr size_t kMaxFileNameLength = 48; BlobStore::BlobWriterWithBuffer writer(my_blob_store); writer.Open(); writer.SetFileName("stonks.jpg"); writer.Write(my_data); // ... writer.Close(); Reading from a BlobStore ------------------------ A ``BlobStore`` may have multiple open ``BlobReader`` objects. No other readers/writers may be open/active if a ``BlobWriter`` is opened on a blob store. 0) Create BlobReader instance 1) BlobReader::Open(). 2) Read data using BlobReader::Read() or BlobReader::GetMemoryMappedBlob(). BlobReader is seekable. Use BlobReader::Seek() to read from a desired offset. 3) BlobReader::Close(). -------------------------- FileSystem RPC integration -------------------------- ``pw_blob_store`` provides an optional ``FileSystemEntry`` implementation for use with ``pw_file``'s ``FlatFileSystemService``. This simplifies the process of enumerating ``BlobStore`` objects as files via ``pw_file``'s ``FileSystem`` RPC service. ----------- Size report ----------- The following size report showcases the memory usage of the blob store. .. include:: blob_size .. note:: The documentation for this module is currently incomplete.