Source code for openwpm.storage.leveldb

from pathlib import Path

import plyvel
from plyvel._plyvel import WriteBatch

from .storage_providers import UnstructuredStorageProvider

LDB_BATCH_SIZE = 100


[docs] class LevelDbProvider(UnstructuredStorageProvider): ldb: plyvel.DB content_batch: WriteBatch def __init__(self, db_path: Path): self.db_path = db_path self._ldb_counter = 0 self._ldb_commit_time = 0
[docs] async def init(self) -> None: self.ldb = plyvel.DB( str(self.db_path), create_if_missing=True, write_buffer_size=128 * 10**6, compression="snappy", ) self.content_batch = self.ldb.write_batch()
[docs] async def flush_cache(self) -> None: """Write out content batch to LevelDB database""" self.content_batch.write() self.content_batch = self.ldb.write_batch()
[docs] async def shutdown(self) -> None: self.ldb.close()
[docs] async def store_blob( self, filename: str, blob: bytes, overwrite: bool = False, ) -> None: content_hash = str(filename).encode("ascii") if self.ldb.get(content_hash) is not None and not overwrite: return self.content_batch.put(content_hash, blob) self._ldb_counter += 1 if self._ldb_counter >= LDB_BATCH_SIZE: await self.flush_cache() self._ldb_counter = 0