nedb-engine 2.0.0a1__tar.gz → 2.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/PKG-INFO +1 -1
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/pyproject.toml +1 -1
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/__init__.py +1 -1
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/engine.py +22 -3
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/server.py +29 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/.gitignore +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/LICENSE +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/README.md +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/autoindex.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/backends/__init__.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/backends/redis_backend.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/cascade.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/concurrent.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/crypto.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/index.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/log.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/merkle.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/mongo.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/query.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/redis_compat.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/relations.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/resp2.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/snapshot.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/sql.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/store.py +0 -0
- {nedb_engine-2.0.0a1 → nedb_engine-2.0.3}/python/nedb/wrap_redis.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedb-engine
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.3
|
|
4
4
|
Summary: NEDB — a versioned, self-compressing, time-traveling embedded database (replay-protected, idempotent, relational, searchable) with durable AOF persistence and a server daemon (nedbd).
|
|
5
5
|
Project-URL: Homepage, https://github.com/Eth-Interchained/nedb
|
|
6
6
|
Project-URL: Repository, https://github.com/Eth-Interchained/nedb
|
|
@@ -10,7 +10,7 @@ build-backend = "hatchling.build"
|
|
|
10
10
|
|
|
11
11
|
[project]
|
|
12
12
|
name = "nedb-engine"
|
|
13
|
-
version = "2.0.
|
|
13
|
+
version = "2.0.3"
|
|
14
14
|
description = "NEDB — a versioned, self-compressing, time-traveling embedded database (replay-protected, idempotent, relational, searchable) with durable AOF persistence and a server daemon (nedbd)."
|
|
15
15
|
readme = "README.md"
|
|
16
16
|
requires-python = ">=3.8"
|
|
@@ -261,13 +261,32 @@ class NEDB:
|
|
|
261
261
|
for coll, field, kind in json.load(fh).get("indexes", []):
|
|
262
262
|
self.indexes.ensure(coll, field, kind)
|
|
263
263
|
# 2) the hash-chained op log
|
|
264
|
+
# Self-healing AOF load — never crash on corruption.
|
|
264
265
|
ops = []
|
|
266
|
+
corrupt_count = 0
|
|
265
267
|
if os.path.exists(self._aof_path):
|
|
266
268
|
with open(self._aof_path, encoding="utf-8") as fh:
|
|
267
269
|
for raw_line in fh:
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
270
|
+
try:
|
|
271
|
+
line = _crypto.aof_decode(raw_line, self._dek)
|
|
272
|
+
if line:
|
|
273
|
+
ops.append(Op.from_dict(json.loads(line)))
|
|
274
|
+
except Exception as exc:
|
|
275
|
+
corrupt_count += 1
|
|
276
|
+
print(
|
|
277
|
+
f" [nedb] AOF self-repair: corrupt entry in"
|
|
278
|
+
f" {self._aof_path!r}"
|
|
279
|
+
f" ({type(exc).__name__}: {exc})"
|
|
280
|
+
f" -- truncating and recovering {len(ops)} op(s)."
|
|
281
|
+
)
|
|
282
|
+
break
|
|
283
|
+
if corrupt_count:
|
|
284
|
+
self._rewrite_aof(ops)
|
|
285
|
+
print(
|
|
286
|
+
f" [nedb] AOF self-repair complete:"
|
|
287
|
+
f" {len(ops)} op(s) recovered,"
|
|
288
|
+
f" {corrupt_count} corrupt entry/entries removed."
|
|
289
|
+
)
|
|
271
290
|
self.log.load(ops)
|
|
272
291
|
# 3) fold
|
|
273
292
|
for op in self.log.ops:
|
|
@@ -551,8 +551,37 @@ def main() -> None:
|
|
|
551
551
|
help="Verbosity: 0=errors only (default), 1=requests, 2=deploy phases, 3=everything. "
|
|
552
552
|
"Env var NEDBD_DEBUG=1 is equivalent to --log-level 3.",
|
|
553
553
|
)
|
|
554
|
+
parser.add_argument(
|
|
555
|
+
"--dag", action="store_true",
|
|
556
|
+
default=os.environ.get("NEDBD_DAG", "").lower() in ("1", "true", "yes"),
|
|
557
|
+
help="Run the v2 content-addressed DAG engine (Rust binary) instead of the v1 AOF engine. "
|
|
558
|
+
"No AOF, no global lock, instant cold start. Env var NEDBD_DAG=1 also enables this.",
|
|
559
|
+
)
|
|
554
560
|
args = parser.parse_args()
|
|
555
561
|
|
|
562
|
+
# ── DAG mode: exec into the Rust v2 binary, replacing this process entirely ──
|
|
563
|
+
if args.dag:
|
|
564
|
+
import shutil as _shutil, sys as _sys
|
|
565
|
+
_pkg_dir = os.path.dirname(os.path.abspath(__file__))
|
|
566
|
+
_candidates = [
|
|
567
|
+
os.path.join(_pkg_dir, "nedbd-v2"),
|
|
568
|
+
os.path.join(_pkg_dir, "nedbd_v2"),
|
|
569
|
+
_shutil.which("nedbd-v2") or "",
|
|
570
|
+
_shutil.which("nedbd_v2") or "",
|
|
571
|
+
]
|
|
572
|
+
_bin = next((c for c in _candidates if c and os.path.isfile(c)), None)
|
|
573
|
+
if _bin is None:
|
|
574
|
+
print("nedbd --dag: v2 Rust binary not found.", file=_sys.stderr)
|
|
575
|
+
print(" Expected 'nedbd-v2' alongside the package or in PATH.", file=_sys.stderr)
|
|
576
|
+
print(" Build: cd rust/nedb-v2 && cargo build --release", file=_sys.stderr)
|
|
577
|
+
print(" Copy: cp rust/nedb-v2/target/release/nedbd nedbd-v2 && nedbd --dag", file=_sys.stderr)
|
|
578
|
+
_sys.exit(1)
|
|
579
|
+
os.environ["NEDBD_PORT"] = str(args.port)
|
|
580
|
+
if args.token:
|
|
581
|
+
os.environ["NEDBD_TOKEN"] = args.token
|
|
582
|
+
# exec replaces this process — clean signal handling, no Python overhead
|
|
583
|
+
os.execv(_bin, [_bin, args.data])
|
|
584
|
+
|
|
556
585
|
# Resolve log level: CLI flag beats env var.
|
|
557
586
|
# Level 0: only errors (always printed)
|
|
558
587
|
# Level 1: every request method+path
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|