import dbm.gnu as dbm import os import sys from pathlib import Path from typing import List, Tuple, Iterator sys.path.insert(0, os.path.dirname(os.path.dirname((os.path.abspath(__file__))))) # magic import-fixer from silverstream.bittorrent.database import TorrentDatabase from silverstream.bittorrent.peer import TorrentPeer from silverstream.util import grouper class OldPeerDatabaseStub: def __init__(self, filepath) -> None: self.dbm = dbm.open(filepath, "rf") # read/fast mode def __iter__(self) -> Iterator[Tuple[bytes, List[TorrentPeer]]]: info_hash = self.dbm.firstkey() while info_hash is not None: yield info_hash, self.get(info_hash) info_hash = self.dbm.nextkey(info_hash) def get(self, info_hash: bytes) -> List[TorrentPeer]: compact_peers = grouper(self.dbm.get(info_hash), 6) return [TorrentPeer.from_compact(bytes(compact_peer)) for compact_peer in compact_peers] try: old_filepath = Path(sys.argv[1]) except IndexError: exit(f"Usage: {__file__} ") old = OldPeerDatabaseStub(str(old_filepath)) new = TorrentDatabase(filepath=old_filepath.with_suffix(".sqlite")) num_keys = len(old.dbm.keys()) num_hashes = num_peers = 0 for info_hash, peers in old: num_hashes += 1 for peer in peers: num_peers += 1 new.add_peer(info_hash, peer) print(f"{num_hashes} hashes, {num_peers} peers done ({num_hashes / num_keys:.2%})")