Forge
pythonf8555a15
1"""BridgeDatabase — subprocess implementation of pywitdb.Database."""
2
3from __future__ import annotations
4
5from collections.abc import Iterator
6from contextlib import contextmanager
7
8from pywitdb._api import Database
9from pywitdb._bridge.client import BridgeClient
10from pywitdb.exceptions import WitDbStoreError
11
12
13class BridgeDatabase(Database):
14 def __init__(self, client: BridgeClient, path: str) -> None:
15 self._client = client
16 self._path = path
17 self._closed = False
18
19 def get(self, key: bytes) -> bytes | None:
20 resp = self._client.ensure_ok(self._client.request("get", key=BridgeClient.b64(key)))
21 if not resp.get("found"):
22 return None
23 value = resp.get("value")
24 if not isinstance(value, str):
25 raise WitDbStoreError("bridge get: missing value")
26 return BridgeClient.unb64(value)
27
28 def put(self, key: bytes, value: bytes) -> None:
29 self._client.ensure_ok(
30 self._client.request(
31 "put",
32 key=BridgeClient.b64(key),
33 value=BridgeClient.b64(value),
34 )
35 )
36
37 def delete(self, key: bytes) -> bool:
38 resp = self._client.ensure_ok(
39 self._client.request("delete", key=BridgeClient.b64(key))
40 )
41 return bool(resp.get("deleted"))
42
43 @contextmanager
44 def transaction(self) -> Iterator[None]:
45 self._client.ensure_ok(self._client.request("txn_begin"))
46 try:
47 yield None
48 self._client.ensure_ok(self._client.request("txn_commit"))
49 except Exception:
50 self._client.ensure_ok(self._client.request("txn_rollback"))
51 raise
52
53 def close(self) -> None:
54 if self._closed:
55 return
56 self._closed = True
57 self._client.close()
58
59
60def open_bridge(
61 path: str,
62 *,
63 password: str | None = None,
64 create: bool = True,
65) -> BridgeDatabase:
66 client = BridgeClient.start()
67 client.open(path, password=password, create=create)
68 return BridgeDatabase(client, path)
69
View only · write via MCP/CIDE