mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-09-07 17:14:09 +02:00
Merge 9a605e058c into 56dd09702f
This commit is contained in:
commit
540c8186fd
2 changed files with 45 additions and 4 deletions
|
|
@ -208,15 +208,23 @@ class UpdateWrapper:
|
|||
def __init__(self, wrapped: io.IOBase, update: Callable[[int], None]) -> None:
|
||||
self._wrapped = wrapped
|
||||
self._update = update
|
||||
# If this wraps a text stream, encode lines back to bytes for accurate
|
||||
# byte-level progress tracking (fixes #439 for multi-byte encodings).
|
||||
self._encoding: Optional[str] = getattr(wrapped, "encoding", None)
|
||||
|
||||
def __iter__(self) -> Iterator[bytes]:
|
||||
def _byte_len(self, s: Any) -> int:
|
||||
if self._encoding and isinstance(s, str):
|
||||
return len(s.encode(self._encoding, errors="replace"))
|
||||
return len(s)
|
||||
|
||||
def __iter__(self) -> Iterator[Any]:
|
||||
for line in self._wrapped:
|
||||
self._update(len(line))
|
||||
self._update(self._byte_len(line))
|
||||
yield line
|
||||
|
||||
def read(self, size: int = -1) -> bytes:
|
||||
def read(self, size: int = -1) -> Any:
|
||||
data = self._wrapped.read(size)
|
||||
self._update(len(data))
|
||||
self._update(self._byte_len(data))
|
||||
return data
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue