nedb-engine 2.0.4__tar.gz → 2.0.6__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.
Files changed (27) hide show
  1. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/PKG-INFO +97 -12
  2. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/README.md +96 -11
  3. nedb_engine-2.0.6/client/python/README.md +55 -0
  4. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/pyproject.toml +1 -1
  5. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/__init__.py +1 -1
  6. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/.gitignore +0 -0
  7. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/LICENSE +0 -0
  8. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/autoindex.py +0 -0
  9. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/backends/__init__.py +0 -0
  10. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/backends/redis_backend.py +0 -0
  11. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/cascade.py +0 -0
  12. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/concurrent.py +0 -0
  13. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/crypto.py +0 -0
  14. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/engine.py +0 -0
  15. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/index.py +0 -0
  16. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/log.py +0 -0
  17. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/merkle.py +0 -0
  18. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/mongo.py +0 -0
  19. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/query.py +0 -0
  20. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/redis_compat.py +0 -0
  21. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/relations.py +0 -0
  22. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/resp2.py +0 -0
  23. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/server.py +0 -0
  24. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/snapshot.py +0 -0
  25. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/sql.py +0 -0
  26. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/python/nedb/store.py +0 -0
  27. {nedb_engine-2.0.4 → nedb_engine-2.0.6}/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.4
3
+ Version: 2.0.6
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
@@ -21,7 +21,7 @@ Description-Content-Type: text/markdown
21
21
 
22
22
  # NEDB
23
23
 
24
- **Hash-chained · time-traveling · bi-temporal · causally-provable embedded database.**
24
+ **Content-addressed Merkle DAG · Hash-chained · Time-traveling · Bi-temporal · Causally-provable embedded database.**
25
25
 
26
26
  Replay-protected · idempotent · relational · filterable · sortable · searchable · concurrent.
27
27
  One Rust core → ships to **PyPI** and **npm** from a single source.
@@ -29,6 +29,7 @@ One Rust core → ships to **PyPI** and **npm** from a single source.
29
29
  [![PyPI](https://img.shields.io/pypi/v/nedb-engine?label=PyPI&color=6366f1)](https://pypi.org/project/nedb-engine/)
30
30
  [![npm](https://img.shields.io/npm/v/nedb-engine?label=npm&color=00d4ff)](https://www.npmjs.com/package/nedb-engine)
31
31
  [![Tests](https://img.shields.io/badge/tests-266%20passing-34d399)](https://github.com/Eth-Interchained/nedb/actions)
32
+ [![nedb-client PyPI](https://img.shields.io/pypi/v/nedb-client?label=nedb-client&color=34d399)](https://pypi.org/project/nedb-client/)
32
33
 
33
34
  **[Studio → studio.interchained.org](https://studio.interchained.org)** · **[nedb.aiassist.net](https://nedb.aiassist.net)**
34
35
 
@@ -36,6 +37,34 @@ One Rust core → ships to **PyPI** and **npm** from a single source.
36
37
 
37
38
  ---
38
39
 
40
+ ## v2 — The DAG Engine (new in 2.0.5)
41
+
42
+ NEDB v2 replaces the append-only log (AOF) with a **content-addressed Merkle DAG**. Every document version is an immutable, BLAKE2b-verified object. Nothing is ever overwritten.
43
+
44
+ ```bash
45
+ # Run the v2 DAG engine — ships inside pip install nedb-engine
46
+ nedbd --dag --data ./data
47
+ # or
48
+ NEDBD_DAG=1 NEDB_TMK=<32-byte-hex> nedbd --data ./data
49
+
50
+ curl http://127.0.0.1:7070/health
51
+ # {"ok":true,"version":"2.0.5","service":"nedbd","encrypted":true}
52
+ ```
53
+
54
+ | Property | v2 DAG | v1 AOF |
55
+ |---|:---:|:---:|
56
+ | Uncorruptable (atomic writes, hash-verified reads) | ✅ | ⚠️ |
57
+ | Instant cold start (no AOF replay) | ✅ | ❌ |
58
+ | Parallel writes (no global lock) | ✅ | ❌ |
59
+ | BLAKE2b Merkle head on every response | ✅ | ❌ |
60
+ | Tombstone deletes (history preserved) | ✅ | ✅ |
61
+ | Auto-migrates v1 AOF → v2 DAG on startup | ✅ | — |
62
+ | Same HTTP API — Vision, Studio, all clients unchanged | ✅ | ✅ |
63
+
64
+ **v1 AOF engine is still shipped and unchanged** — `nedbd` (no flag) runs v1.
65
+
66
+ ---
67
+
39
68
  ## What makes NEDB different
40
69
 
41
70
  Every database stores *what*. NEDB stores *what*, *when*, *when it was true*, and *why* — all sealed in a cryptographic hash chain that proves none of it was tampered with.
@@ -252,15 +281,28 @@ db.query('FROM policy AS OF 200 VALID AS OF "2024-02-15"')
252
281
 
253
282
  ---
254
283
 
255
- ## Performance (v1.0.x · Rust native · Linux x86_64 VPS)
284
+ ## Performance
256
285
 
257
- | Operation | Throughput | Notes |
286
+ **v1 Python server (baseline single-threaded AOF):**
287
+
288
+ | Operation | Throughput | p99 latency |
258
289
  |---|---|---|
259
- | PUT (Rust napi, per-op FFI) | ~70K/s | FFI-bound; batch path: ~15K writes/s group-commit |
260
- | GET (Rust napi, per-op FFI) | ~330K/s | FFI-bound |
261
- | NQL query (Rust engine) | ~23 µs | faster than pure-Python (~120 µs) |
262
- | Python PUT (AOF + fsync) | ~7K/s | Durable, per-op |
263
- | Python GET (in-process) | ~1.3M/s | Zero socket hop |
290
+ | Sequential PUT | ~23/s | 44 ms |
291
+ | Concurrent PUT (16 workers) | ~92/s | 48 ms |
292
+ | Batch PUT (500 ops/request) | ~520 ops/s | 1.9 ms/op |
293
+ | Point-lookup read (NQL) | ~23/s | 44 ms |
294
+ | Rust napi PUT (FFI) | ~70K/s | |
295
+ | Rust napi GET (FFI) | ~330K/s | — |
296
+
297
+ **v2 DAG Rust server — tokio/axum, no GIL, lock-free per-doc writes:**
298
+ > Benchmarks in progress — target 5,000–50,000 ops/s. Run `python3 tests/test_dag_perf.py` against your own instance.
299
+
300
+ Reproduce with the included benchmark:
301
+
302
+ ```bash
303
+ NEDBD_DAG=1 nedbd --data /tmp/perf &
304
+ python3 tests/test_dag_perf.py --n 10000 --reads 100000
305
+ ```
264
306
 
265
307
  ---
266
308
 
@@ -290,16 +332,49 @@ Encryption: AES-256-GCM at-rest (TMK/DEK double-envelope)
290
332
 
291
333
  ---
292
334
 
335
+ ## nedb-client — lightweight HTTP client
336
+
337
+ Connect to any running nedbd instance from Python or TypeScript without embedding the engine:
338
+
339
+ ```bash
340
+ pip install nedb-client # async Python
341
+ npm install nedb-client # TypeScript / Node.js 18+
342
+ ```
343
+
344
+ ```python
345
+ from nedb_client import NedbClient
346
+
347
+ async with NedbClient("http://127.0.0.1:7070", db="mydb") as db:
348
+ await db.put("blocks", "618000", {"height": 618000})
349
+ rows = await db.query("FROM blocks ORDER BY height DESC LIMIT 10")
350
+ head = await db.head() # BLAKE2b Merkle root — changes on every write
351
+ ok = await db.verify() # tamper-evidence check across all objects
352
+ ```
353
+
354
+ ```typescript
355
+ import { NedbClient } from "nedb-client";
356
+ const db = new NedbClient({ url: "http://127.0.0.1:7070", db: "mydb" });
357
+ await db.put("blocks", "618000", { height: 618000 });
358
+ const rows = await db.query("FROM blocks LIMIT 10");
359
+ ```
360
+
361
+ ---
362
+
293
363
  ## Repo layout
294
364
 
295
365
  ```
296
366
  python/nedb/ reference engine (pure Python — always-works baseline)
297
367
  rust/
298
- nedb-core/ production Rust engine (shared by both runtimes)
368
+ nedb-core/ v1 production Rust engine (shared by both runtimes)
299
369
  nedb-py/ maturin PyO3 binding → PyPI native wheels
300
370
  nedb-node/ napi-rs binding → npm native addons
301
- tests/ engine + concurrent + causal + bitemporal + deploy tests
371
+ nedb-v2/ v2 DAG engine (tokio + axum + BLAKE2b DAG)
372
+ client/
373
+ python/ nedb-client — async Python HTTP client (pip install nedb-client)
374
+ node/ nedb-client — TypeScript HTTP client (npm install nedb-client)
375
+ tests/ engine + concurrent + causal + bitemporal + deploy + perf benchmarks
302
376
  examples/ resp2_python.py resp2_demo.sh
377
+ docs/ index.html reference.html SPEC.md
303
378
  ```
304
379
 
305
380
  ---
@@ -316,7 +391,17 @@ examples/ resp2_python.py resp2_demo.sh
316
391
  - [x] SQL / Redis / MongoDB compatibility adapters
317
392
  - [x] RESP2 wire protocol (redis-cli / redis-benchmark compatible)
318
393
  - [x] Rust native core — napi-rs (npm) + maturin PyO3 (PyPI)
319
- - [x] Self-healing chains (auto-repair structural gaps, detect real tampering)
394
+ - [x] Self-healing AOF auto-truncates corrupt tail on startup, never hangs
395
+ - [x] **v2 DAG engine** — content-addressed Merkle DAG, atomic writes, instant cold start
396
+ - [x] **`nedbd --dag`** — one flag switches to v2 Rust engine; v1 untouched
397
+ - [x] **BLAKE2b Merkle head** — tamper-evident root on every response
398
+ - [x] **Tombstone deletes** — history preserved in DAG, live id removed from index
399
+ - [x] **Auto-migration** — v1 AOF → v2 DAG on first `--dag` startup
400
+ - [x] **nedb-client** — async Python + TypeScript HTTP client (`pip/npm install nedb-client`)
401
+ - [x] **Intel Mac support** — native wheels for `aarch64` + `x86_64` Apple Darwin
402
+ - [ ] In-memory DAG mode — `Db::in_memory()` for zero-disk ephemeral sessions
403
+ - [ ] PyO3 + napi-rs bindings updated to v2 DAG API
404
+ - [ ] NEDB Studio DAG mode toggle
320
405
  - [ ] Merkle inclusion proofs — prove a document existed at a specific time to a third party
321
406
  - [ ] Git-style branching — fork database state, experiment, merge or discard
322
407
  - [ ] Agent Memory SDK — `Memory.remember()` / `Memory.recall()` / `Memory.trace()`
@@ -2,7 +2,7 @@
2
2
 
3
3
  # NEDB
4
4
 
5
- **Hash-chained · time-traveling · bi-temporal · causally-provable embedded database.**
5
+ **Content-addressed Merkle DAG · Hash-chained · Time-traveling · Bi-temporal · Causally-provable embedded database.**
6
6
 
7
7
  Replay-protected · idempotent · relational · filterable · sortable · searchable · concurrent.
8
8
  One Rust core → ships to **PyPI** and **npm** from a single source.
@@ -10,6 +10,7 @@ One Rust core → ships to **PyPI** and **npm** from a single source.
10
10
  [![PyPI](https://img.shields.io/pypi/v/nedb-engine?label=PyPI&color=6366f1)](https://pypi.org/project/nedb-engine/)
11
11
  [![npm](https://img.shields.io/npm/v/nedb-engine?label=npm&color=00d4ff)](https://www.npmjs.com/package/nedb-engine)
12
12
  [![Tests](https://img.shields.io/badge/tests-266%20passing-34d399)](https://github.com/Eth-Interchained/nedb/actions)
13
+ [![nedb-client PyPI](https://img.shields.io/pypi/v/nedb-client?label=nedb-client&color=34d399)](https://pypi.org/project/nedb-client/)
13
14
 
14
15
  **[Studio → studio.interchained.org](https://studio.interchained.org)** · **[nedb.aiassist.net](https://nedb.aiassist.net)**
15
16
 
@@ -17,6 +18,34 @@ One Rust core → ships to **PyPI** and **npm** from a single source.
17
18
 
18
19
  ---
19
20
 
21
+ ## v2 — The DAG Engine (new in 2.0.5)
22
+
23
+ NEDB v2 replaces the append-only log (AOF) with a **content-addressed Merkle DAG**. Every document version is an immutable, BLAKE2b-verified object. Nothing is ever overwritten.
24
+
25
+ ```bash
26
+ # Run the v2 DAG engine — ships inside pip install nedb-engine
27
+ nedbd --dag --data ./data
28
+ # or
29
+ NEDBD_DAG=1 NEDB_TMK=<32-byte-hex> nedbd --data ./data
30
+
31
+ curl http://127.0.0.1:7070/health
32
+ # {"ok":true,"version":"2.0.5","service":"nedbd","encrypted":true}
33
+ ```
34
+
35
+ | Property | v2 DAG | v1 AOF |
36
+ |---|:---:|:---:|
37
+ | Uncorruptable (atomic writes, hash-verified reads) | ✅ | ⚠️ |
38
+ | Instant cold start (no AOF replay) | ✅ | ❌ |
39
+ | Parallel writes (no global lock) | ✅ | ❌ |
40
+ | BLAKE2b Merkle head on every response | ✅ | ❌ |
41
+ | Tombstone deletes (history preserved) | ✅ | ✅ |
42
+ | Auto-migrates v1 AOF → v2 DAG on startup | ✅ | — |
43
+ | Same HTTP API — Vision, Studio, all clients unchanged | ✅ | ✅ |
44
+
45
+ **v1 AOF engine is still shipped and unchanged** — `nedbd` (no flag) runs v1.
46
+
47
+ ---
48
+
20
49
  ## What makes NEDB different
21
50
 
22
51
  Every database stores *what*. NEDB stores *what*, *when*, *when it was true*, and *why* — all sealed in a cryptographic hash chain that proves none of it was tampered with.
@@ -233,15 +262,28 @@ db.query('FROM policy AS OF 200 VALID AS OF "2024-02-15"')
233
262
 
234
263
  ---
235
264
 
236
- ## Performance (v1.0.x · Rust native · Linux x86_64 VPS)
265
+ ## Performance
237
266
 
238
- | Operation | Throughput | Notes |
267
+ **v1 Python server (baseline single-threaded AOF):**
268
+
269
+ | Operation | Throughput | p99 latency |
239
270
  |---|---|---|
240
- | PUT (Rust napi, per-op FFI) | ~70K/s | FFI-bound; batch path: ~15K writes/s group-commit |
241
- | GET (Rust napi, per-op FFI) | ~330K/s | FFI-bound |
242
- | NQL query (Rust engine) | ~23 µs | faster than pure-Python (~120 µs) |
243
- | Python PUT (AOF + fsync) | ~7K/s | Durable, per-op |
244
- | Python GET (in-process) | ~1.3M/s | Zero socket hop |
271
+ | Sequential PUT | ~23/s | 44 ms |
272
+ | Concurrent PUT (16 workers) | ~92/s | 48 ms |
273
+ | Batch PUT (500 ops/request) | ~520 ops/s | 1.9 ms/op |
274
+ | Point-lookup read (NQL) | ~23/s | 44 ms |
275
+ | Rust napi PUT (FFI) | ~70K/s | |
276
+ | Rust napi GET (FFI) | ~330K/s | — |
277
+
278
+ **v2 DAG Rust server — tokio/axum, no GIL, lock-free per-doc writes:**
279
+ > Benchmarks in progress — target 5,000–50,000 ops/s. Run `python3 tests/test_dag_perf.py` against your own instance.
280
+
281
+ Reproduce with the included benchmark:
282
+
283
+ ```bash
284
+ NEDBD_DAG=1 nedbd --data /tmp/perf &
285
+ python3 tests/test_dag_perf.py --n 10000 --reads 100000
286
+ ```
245
287
 
246
288
  ---
247
289
 
@@ -271,16 +313,49 @@ Encryption: AES-256-GCM at-rest (TMK/DEK double-envelope)
271
313
 
272
314
  ---
273
315
 
316
+ ## nedb-client — lightweight HTTP client
317
+
318
+ Connect to any running nedbd instance from Python or TypeScript without embedding the engine:
319
+
320
+ ```bash
321
+ pip install nedb-client # async Python
322
+ npm install nedb-client # TypeScript / Node.js 18+
323
+ ```
324
+
325
+ ```python
326
+ from nedb_client import NedbClient
327
+
328
+ async with NedbClient("http://127.0.0.1:7070", db="mydb") as db:
329
+ await db.put("blocks", "618000", {"height": 618000})
330
+ rows = await db.query("FROM blocks ORDER BY height DESC LIMIT 10")
331
+ head = await db.head() # BLAKE2b Merkle root — changes on every write
332
+ ok = await db.verify() # tamper-evidence check across all objects
333
+ ```
334
+
335
+ ```typescript
336
+ import { NedbClient } from "nedb-client";
337
+ const db = new NedbClient({ url: "http://127.0.0.1:7070", db: "mydb" });
338
+ await db.put("blocks", "618000", { height: 618000 });
339
+ const rows = await db.query("FROM blocks LIMIT 10");
340
+ ```
341
+
342
+ ---
343
+
274
344
  ## Repo layout
275
345
 
276
346
  ```
277
347
  python/nedb/ reference engine (pure Python — always-works baseline)
278
348
  rust/
279
- nedb-core/ production Rust engine (shared by both runtimes)
349
+ nedb-core/ v1 production Rust engine (shared by both runtimes)
280
350
  nedb-py/ maturin PyO3 binding → PyPI native wheels
281
351
  nedb-node/ napi-rs binding → npm native addons
282
- tests/ engine + concurrent + causal + bitemporal + deploy tests
352
+ nedb-v2/ v2 DAG engine (tokio + axum + BLAKE2b DAG)
353
+ client/
354
+ python/ nedb-client — async Python HTTP client (pip install nedb-client)
355
+ node/ nedb-client — TypeScript HTTP client (npm install nedb-client)
356
+ tests/ engine + concurrent + causal + bitemporal + deploy + perf benchmarks
283
357
  examples/ resp2_python.py resp2_demo.sh
358
+ docs/ index.html reference.html SPEC.md
284
359
  ```
285
360
 
286
361
  ---
@@ -297,7 +372,17 @@ examples/ resp2_python.py resp2_demo.sh
297
372
  - [x] SQL / Redis / MongoDB compatibility adapters
298
373
  - [x] RESP2 wire protocol (redis-cli / redis-benchmark compatible)
299
374
  - [x] Rust native core — napi-rs (npm) + maturin PyO3 (PyPI)
300
- - [x] Self-healing chains (auto-repair structural gaps, detect real tampering)
375
+ - [x] Self-healing AOF auto-truncates corrupt tail on startup, never hangs
376
+ - [x] **v2 DAG engine** — content-addressed Merkle DAG, atomic writes, instant cold start
377
+ - [x] **`nedbd --dag`** — one flag switches to v2 Rust engine; v1 untouched
378
+ - [x] **BLAKE2b Merkle head** — tamper-evident root on every response
379
+ - [x] **Tombstone deletes** — history preserved in DAG, live id removed from index
380
+ - [x] **Auto-migration** — v1 AOF → v2 DAG on first `--dag` startup
381
+ - [x] **nedb-client** — async Python + TypeScript HTTP client (`pip/npm install nedb-client`)
382
+ - [x] **Intel Mac support** — native wheels for `aarch64` + `x86_64` Apple Darwin
383
+ - [ ] In-memory DAG mode — `Db::in_memory()` for zero-disk ephemeral sessions
384
+ - [ ] PyO3 + napi-rs bindings updated to v2 DAG API
385
+ - [ ] NEDB Studio DAG mode toggle
301
386
  - [ ] Merkle inclusion proofs — prove a document existed at a specific time to a third party
302
387
  - [ ] Git-style branching — fork database state, experiment, merge or discard
303
388
  - [ ] Agent Memory SDK — `Memory.remember()` / `Memory.recall()` / `Memory.trace()`
@@ -0,0 +1,55 @@
1
+ # nedb-client (Python)
2
+
3
+ Async Python client for the [nedbd](https://github.com/Eth-Interchained/nedb) HTTP API.
4
+
5
+ ```bash
6
+ pip install nedb-client
7
+ ```
8
+
9
+ ## Quick start
10
+
11
+ ```python
12
+ from nedb_client import NedbClient
13
+
14
+ async with NedbClient("http://127.0.0.1:7070", db="mydb") as db:
15
+ # Write
16
+ await db.put("blocks", "618000", {"height": 618000, "hash": "000abc"})
17
+
18
+ # Query (full NQL)
19
+ rows = await db.query("FROM blocks ORDER BY height DESC LIMIT 10")
20
+
21
+ # Causal provenance + bi-temporal
22
+ result = await db.put("claims", "c1", {"fact": "..."},
23
+ caused_by=["abc123..."],
24
+ valid_from="2024-01-01",
25
+ evidence="sensor-42")
26
+
27
+ # Merkle head (tamper-evident root)
28
+ head = await db.head()
29
+
30
+ # Full tamper-evidence check
31
+ report = await db.verify()
32
+ assert report["ok"]
33
+ ```
34
+
35
+ ## API
36
+
37
+ | Method | Description |
38
+ |--------|-------------|
39
+ | `put(coll, id, doc, **meta)` | Write a document |
40
+ | `get(coll, id)` | Fetch current version |
41
+ | `delete(coll, id)` | Tombstone delete |
42
+ | `query(nql)` | NQL query → list of dicts |
43
+ | `query_full(nql)` | NQL query → full response with seq + head |
44
+ | `batch(ops)` | Batch put/del in one round-trip |
45
+ | `create_index(coll, field)` | Create sorted index |
46
+ | `verify()` | BLAKE2b tamper-evidence check |
47
+ | `head()` | Current Merkle head |
48
+ | `seq()` | Current sequence number |
49
+ | `checkpoint()` | Explicit checkpoint |
50
+ | `log(limit)` | Recent write log |
51
+ | `health()` | Server health |
52
+ | `ping()` | Boolean reachability check |
53
+ | `list_databases()` | All databases on server |
54
+ | `create_database()` | Create this database |
55
+ | `drop_database()` | Drop this database |
@@ -10,7 +10,7 @@ build-backend = "hatchling.build"
10
10
 
11
11
  [project]
12
12
  name = "nedb-engine"
13
- version = "2.0.4"
13
+ version = "2.0.6"
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"
@@ -47,4 +47,4 @@ __all__ = [
47
47
  "wrap_redis", "WrappedRedis",
48
48
  "_native", "__has_native__",
49
49
  ]
50
- __version__ = "2.0.4"
50
+ __version__ = "2.0.6"
File without changes
File without changes