PyMkDB 0.1.0__tar.gz → 0.1.2__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.
- {pymkdb-0.1.0 → pymkdb-0.1.2}/PKG-INFO +2 -2
- {pymkdb-0.1.0 → pymkdb-0.1.2}/PyMkDB.egg-info/PKG-INFO +2 -2
- pymkdb-0.1.2/PyMkDB.egg-info/SOURCES.txt +57 -0
- pymkdb-0.1.2/PyMkDB.egg-info/entry_points.txt +2 -0
- pymkdb-0.1.2/PyMkDB.egg-info/top_level.txt +1 -0
- {pymkdb-0.1.0 → pymkdb-0.1.2}/README.md +1 -1
- {pymkdb-0.1.0/pymkdb → pymkdb-0.1.2/mkdb}/cli.py +4 -4
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/config/db.py +3 -3
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/config/server.py +1 -1
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/__init__.py +12 -12
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/maintenance/task_scheduler.py +1 -1
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/objects/store.py +18 -18
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/parity/parity_manager.py +2 -2
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query/full_text_index.py +1 -1
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query/query_engine.py +5 -5
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query_workers/__init__.py +2 -2
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query_workers/dispatcher.py +2 -2
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query_workers/worker.py +2 -2
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/runtime/__init__.py +2 -2
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/coms/actions.py +3 -3
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/coms/http_handlers.py +3 -3
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/coms/socket.py +3 -3
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/control/api/actions.py +27 -27
- pymkdb-0.1.2/mkdb/server/control/files/config.html +934 -0
- pymkdb-0.1.2/mkdb/server/control/files/home.html +1033 -0
- pymkdb-0.1.2/mkdb/server/control/files/login.html +319 -0
- pymkdb-0.1.2/mkdb/server/control/files/query.html +777 -0
- pymkdb-0.1.2/mkdb/server/control/files/security.html +1545 -0
- pymkdb-0.1.2/mkdb/server/control/files/store-config.html +1761 -0
- pymkdb-0.1.2/mkdb/server/control/files/stores.html +1126 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/control/server.py +3 -3
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/event_log.py +1 -1
- {pymkdb-0.1.0 → pymkdb-0.1.2}/pyproject.toml +6 -3
- pymkdb-0.1.0/PyMkDB.egg-info/SOURCES.txt +0 -57
- pymkdb-0.1.0/PyMkDB.egg-info/entry_points.txt +0 -2
- pymkdb-0.1.0/PyMkDB.egg-info/top_level.txt +0 -3
- pymkdb-0.1.0/pymkdb/__init__.py +0 -6
- pymkdb-0.1.0/sdk/__init__.py +0 -1
- pymkdb-0.1.0/sdk/connection.py +0 -225
- pymkdb-0.1.0/sdk/delta.py +0 -19
- pymkdb-0.1.0/sdk/http_connection.py +0 -180
- pymkdb-0.1.0/sdk/mkdb_client.py +0 -226
- pymkdb-0.1.0/sdk/responses.py +0 -154
- {pymkdb-0.1.0 → pymkdb-0.1.2}/PyMkDB.egg-info/dependency_links.txt +0 -0
- {pymkdb-0.1.0 → pymkdb-0.1.2}/PyMkDB.egg-info/requires.txt +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/cache/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/cache/ram_cache.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/cache/write_queue.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/maintenance/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/maintenance/compactor.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/parity/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query/numeric_index.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query/tokenizer.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/query_workers/task.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/requesting/main.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/storage/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/storage/blob_store.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/storage/index_manager.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/storage/log_manager.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/db/storage/serializer.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/filing/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/objects/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/__init__.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/coms/http.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/coms/metrics.py +0 -0
- {pymkdb-0.1.0/src → pymkdb-0.1.2/mkdb}/server/coms/socket_protocol.py +0 -0
- {pymkdb-0.1.0 → pymkdb-0.1.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PyMkDB
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: A log-structured, partitioned NoSQL database engine with full-text search, numeric indexes, and dual TCP/HTTP protocols.
|
|
5
5
|
Author: MNG
|
|
6
6
|
License: MIT
|
|
@@ -53,7 +53,7 @@ MkDB is a Custom Log-Structured Merge & Partitioned Redundant Storage Engine bui
|
|
|
53
53
|
### Starting the Server
|
|
54
54
|
MkDB operates as a CLI tool. Launch the engine by pointing it to your desired database directory (which must contain a `config.json` file configuring your stores and network bindings):
|
|
55
55
|
```bash
|
|
56
|
-
mkdb /path/to/your/db
|
|
56
|
+
python mkdb.py /path/to/your/db
|
|
57
57
|
```
|
|
58
58
|
Once running, the database will host both TCP socket and HTTP interfaces as specified in your `config.json`. The web control panel is accessible via your browser (check server output for the bound port, normally `http://localhost:<port>`).
|
|
59
59
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PyMkDB
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: A log-structured, partitioned NoSQL database engine with full-text search, numeric indexes, and dual TCP/HTTP protocols.
|
|
5
5
|
Author: MNG
|
|
6
6
|
License: MIT
|
|
@@ -53,7 +53,7 @@ MkDB is a Custom Log-Structured Merge & Partitioned Redundant Storage Engine bui
|
|
|
53
53
|
### Starting the Server
|
|
54
54
|
MkDB operates as a CLI tool. Launch the engine by pointing it to your desired database directory (which must contain a `config.json` file configuring your stores and network bindings):
|
|
55
55
|
```bash
|
|
56
|
-
mkdb /path/to/your/db
|
|
56
|
+
python mkdb.py /path/to/your/db
|
|
57
57
|
```
|
|
58
58
|
Once running, the database will host both TCP socket and HTTP interfaces as specified in your `config.json`. The web control panel is accessible via your browser (check server output for the bound port, normally `http://localhost:<port>`).
|
|
59
59
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
PyMkDB.egg-info/PKG-INFO
|
|
4
|
+
PyMkDB.egg-info/SOURCES.txt
|
|
5
|
+
PyMkDB.egg-info/dependency_links.txt
|
|
6
|
+
PyMkDB.egg-info/entry_points.txt
|
|
7
|
+
PyMkDB.egg-info/requires.txt
|
|
8
|
+
PyMkDB.egg-info/top_level.txt
|
|
9
|
+
mkdb/__init__.py
|
|
10
|
+
mkdb/cli.py
|
|
11
|
+
mkdb/config/db.py
|
|
12
|
+
mkdb/config/server.py
|
|
13
|
+
mkdb/db/__init__.py
|
|
14
|
+
mkdb/db/cache/__init__.py
|
|
15
|
+
mkdb/db/cache/ram_cache.py
|
|
16
|
+
mkdb/db/cache/write_queue.py
|
|
17
|
+
mkdb/db/maintenance/__init__.py
|
|
18
|
+
mkdb/db/maintenance/compactor.py
|
|
19
|
+
mkdb/db/maintenance/task_scheduler.py
|
|
20
|
+
mkdb/db/objects/store.py
|
|
21
|
+
mkdb/db/parity/__init__.py
|
|
22
|
+
mkdb/db/parity/parity_manager.py
|
|
23
|
+
mkdb/db/query/__init__.py
|
|
24
|
+
mkdb/db/query/full_text_index.py
|
|
25
|
+
mkdb/db/query/numeric_index.py
|
|
26
|
+
mkdb/db/query/query_engine.py
|
|
27
|
+
mkdb/db/query/tokenizer.py
|
|
28
|
+
mkdb/db/query_workers/__init__.py
|
|
29
|
+
mkdb/db/query_workers/dispatcher.py
|
|
30
|
+
mkdb/db/query_workers/task.py
|
|
31
|
+
mkdb/db/query_workers/worker.py
|
|
32
|
+
mkdb/db/requesting/main.py
|
|
33
|
+
mkdb/db/storage/__init__.py
|
|
34
|
+
mkdb/db/storage/blob_store.py
|
|
35
|
+
mkdb/db/storage/index_manager.py
|
|
36
|
+
mkdb/db/storage/log_manager.py
|
|
37
|
+
mkdb/db/storage/serializer.py
|
|
38
|
+
mkdb/filing/__init__.py
|
|
39
|
+
mkdb/objects/__init__.py
|
|
40
|
+
mkdb/runtime/__init__.py
|
|
41
|
+
mkdb/server/__init__.py
|
|
42
|
+
mkdb/server/event_log.py
|
|
43
|
+
mkdb/server/coms/actions.py
|
|
44
|
+
mkdb/server/coms/http.py
|
|
45
|
+
mkdb/server/coms/http_handlers.py
|
|
46
|
+
mkdb/server/coms/metrics.py
|
|
47
|
+
mkdb/server/coms/socket.py
|
|
48
|
+
mkdb/server/coms/socket_protocol.py
|
|
49
|
+
mkdb/server/control/server.py
|
|
50
|
+
mkdb/server/control/api/actions.py
|
|
51
|
+
mkdb/server/control/files/config.html
|
|
52
|
+
mkdb/server/control/files/home.html
|
|
53
|
+
mkdb/server/control/files/login.html
|
|
54
|
+
mkdb/server/control/files/query.html
|
|
55
|
+
mkdb/server/control/files/security.html
|
|
56
|
+
mkdb/server/control/files/store-config.html
|
|
57
|
+
mkdb/server/control/files/stores.html
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
mkdb
|
|
@@ -30,7 +30,7 @@ MkDB is a Custom Log-Structured Merge & Partitioned Redundant Storage Engine bui
|
|
|
30
30
|
### Starting the Server
|
|
31
31
|
MkDB operates as a CLI tool. Launch the engine by pointing it to your desired database directory (which must contain a `config.json` file configuring your stores and network bindings):
|
|
32
32
|
```bash
|
|
33
|
-
mkdb /path/to/your/db
|
|
33
|
+
python mkdb.py /path/to/your/db
|
|
34
34
|
```
|
|
35
35
|
Once running, the database will host both TCP socket and HTTP interfaces as specified in your `config.json`. The web control panel is accessible via your browser (check server output for the bound port, normally `http://localhost:<port>`).
|
|
36
36
|
|
|
@@ -12,10 +12,10 @@ import sys
|
|
|
12
12
|
|
|
13
13
|
def main():
|
|
14
14
|
from colorama import Fore
|
|
15
|
-
from
|
|
16
|
-
from
|
|
17
|
-
from
|
|
18
|
-
from
|
|
15
|
+
from mkdb.db import mkdb
|
|
16
|
+
from mkdb.config.db import mkdb_config
|
|
17
|
+
from mkdb.filing import read_json, write_json
|
|
18
|
+
from mkdb.runtime import runtime_settings
|
|
19
19
|
|
|
20
20
|
print(f"""{Fore.CYAN}
|
|
21
21
|
╔═══════════════════════════════════════╗
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from
|
|
3
|
+
from mkdb.filing import write_json
|
|
4
|
+
from mkdb.config.server import control_server, socket_server, http_server
|
|
5
|
+
from mkdb.objects import base_object
|
|
6
6
|
|
|
7
7
|
class query_worker_config(base_object):
|
|
8
8
|
def __init__(self, data:dict={}):
|
|
@@ -3,13 +3,13 @@ import time
|
|
|
3
3
|
from typing import Union
|
|
4
4
|
|
|
5
5
|
from colorama import Fore
|
|
6
|
-
from
|
|
7
|
-
from
|
|
6
|
+
from mkdb.config.db import mkdb_config
|
|
7
|
+
from mkdb.server.coms.http import HTTPServer
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class mkdb:
|
|
11
11
|
def __init__(self, config:Union[dict, mkdb_config]):
|
|
12
|
-
from
|
|
12
|
+
from mkdb.db.objects.store import store
|
|
13
13
|
|
|
14
14
|
if type(config) == dict:
|
|
15
15
|
config = mkdb_config(config)
|
|
@@ -56,7 +56,7 @@ class mkdb:
|
|
|
56
56
|
|
|
57
57
|
os.makedirs(os.path.join(self.file_path, "stores"), exist_ok=True)
|
|
58
58
|
for store_name, store_config in self.config.stores.items():
|
|
59
|
-
from
|
|
59
|
+
from mkdb.db.objects.store import store
|
|
60
60
|
if store_name not in self.stores:
|
|
61
61
|
s = store(self, store_config)
|
|
62
62
|
self.stores[store_name] = s
|
|
@@ -71,8 +71,8 @@ class mkdb:
|
|
|
71
71
|
print("Starting servers...")
|
|
72
72
|
self._started_at = time.time()
|
|
73
73
|
if self.config.servers.http_server.enabled:
|
|
74
|
-
from
|
|
75
|
-
from
|
|
74
|
+
from mkdb.server.coms.http import HTTPServer
|
|
75
|
+
from mkdb.server.coms.http_handlers import HTTPDataHandler
|
|
76
76
|
HTTPDataHandler.database = self
|
|
77
77
|
self._servers["http"] = HTTPServer(
|
|
78
78
|
name="Communication-HTTP",
|
|
@@ -82,7 +82,7 @@ class mkdb:
|
|
|
82
82
|
)
|
|
83
83
|
|
|
84
84
|
if self.config.servers.socket_server.enabled:
|
|
85
|
-
from
|
|
85
|
+
from mkdb.server.coms.socket import SocketServer
|
|
86
86
|
_sock_srv = SocketServer(
|
|
87
87
|
host=self.config.servers.socket_server.address.host,
|
|
88
88
|
port=self.config.servers.socket_server.address.port,
|
|
@@ -95,7 +95,7 @@ class mkdb:
|
|
|
95
95
|
self._servers["socket"] = _sock_srv
|
|
96
96
|
|
|
97
97
|
if self.config.servers.control_server.enabled:
|
|
98
|
-
from
|
|
98
|
+
from mkdb.server.control.server import start_control_server
|
|
99
99
|
self._servers["control"] = start_control_server(
|
|
100
100
|
host=self.config.servers.control_server.address.host,
|
|
101
101
|
port=self.config.servers.control_server.address.port,
|
|
@@ -143,8 +143,8 @@ class mkdb:
|
|
|
143
143
|
if name == "http":
|
|
144
144
|
if not cfg.http_server.enabled:
|
|
145
145
|
return
|
|
146
|
-
from
|
|
147
|
-
from
|
|
146
|
+
from mkdb.server.coms.http import HTTPServer
|
|
147
|
+
from mkdb.server.coms.http_handlers import HTTPDataHandler
|
|
148
148
|
HTTPDataHandler.database = self
|
|
149
149
|
self._servers["http"] = HTTPServer(
|
|
150
150
|
name="Communication-HTTP",
|
|
@@ -155,7 +155,7 @@ class mkdb:
|
|
|
155
155
|
elif name == "socket":
|
|
156
156
|
if not cfg.socket_server.enabled:
|
|
157
157
|
return
|
|
158
|
-
from
|
|
158
|
+
from mkdb.server.coms.socket import SocketServer
|
|
159
159
|
srv = SocketServer(
|
|
160
160
|
host=cfg.socket_server.address.host,
|
|
161
161
|
port=cfg.socket_server.address.port,
|
|
@@ -169,7 +169,7 @@ class mkdb:
|
|
|
169
169
|
elif name == "control":
|
|
170
170
|
if not cfg.control_server.enabled:
|
|
171
171
|
return
|
|
172
|
-
from
|
|
172
|
+
from mkdb.server.control.server import start_control_server
|
|
173
173
|
self._servers["control"] = start_control_server(
|
|
174
174
|
host=cfg.control_server.address.host,
|
|
175
175
|
port=cfg.control_server.address.port,
|
|
@@ -49,7 +49,7 @@ class TaskScheduler:
|
|
|
49
49
|
store = self._store
|
|
50
50
|
if store.log_manager is None or store._write_queue is None:
|
|
51
51
|
return
|
|
52
|
-
from
|
|
52
|
+
from mkdb.db.maintenance.compactor import Compactor
|
|
53
53
|
compactor = Compactor(store)
|
|
54
54
|
|
|
55
55
|
segments = store.log_manager.list_segments()
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from
|
|
6
|
-
from
|
|
7
|
-
from
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
11
|
-
from
|
|
12
|
-
from
|
|
13
|
-
from
|
|
14
|
-
from
|
|
15
|
-
from
|
|
3
|
+
from mkdb.db import mkdb
|
|
4
|
+
from mkdb.config.db import store_config as _store_config
|
|
5
|
+
from mkdb.db.query_workers import QueryDispatcher
|
|
6
|
+
from mkdb.db.storage.log_manager import LogManager
|
|
7
|
+
from mkdb.db.storage.index_manager import IndexManager
|
|
8
|
+
from mkdb.db.storage import blob_store
|
|
9
|
+
from mkdb.db.storage import serializer as _serializer
|
|
10
|
+
from mkdb.db.cache.ram_cache import RamCache
|
|
11
|
+
from mkdb.db.cache.write_queue import WriteQueue
|
|
12
|
+
from mkdb.db.query.query_engine import QueryEngine, QuerySyntaxError
|
|
13
|
+
from mkdb.db.maintenance.compactor import Compactor
|
|
14
|
+
from mkdb.db.maintenance.task_scheduler import TaskScheduler
|
|
15
|
+
from mkdb.db.parity.parity_manager import ParityManager
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class store:
|
|
@@ -60,7 +60,7 @@ class store:
|
|
|
60
60
|
service=self.config.name,
|
|
61
61
|
)
|
|
62
62
|
print(f"Store '{self.config.name}' initialized at {self.store_path}")
|
|
63
|
-
from
|
|
63
|
+
from mkdb.server.event_log import emit as _emit
|
|
64
64
|
_emit("info", f"store:{self.config.name}", f"Store loaded from {self.store_path}")
|
|
65
65
|
|
|
66
66
|
# Parity manager — boot verification runs at startup
|
|
@@ -218,8 +218,8 @@ class store:
|
|
|
218
218
|
if self.log_manager is None or self.index_manager is None:
|
|
219
219
|
raise RuntimeError("Store is not set up. Call setup() first.")
|
|
220
220
|
blob_threshold = getattr(self.config.file_config, "blob_threshold", 5 * 1024 * 1024)
|
|
221
|
-
from
|
|
222
|
-
from
|
|
221
|
+
from mkdb.db.storage import serializer as _serializer
|
|
222
|
+
from mkdb.db.storage import blob_store
|
|
223
223
|
line_str = _serializer.serialize_record(record_id, flat_dict)
|
|
224
224
|
if len(line_str.encode("utf-8")) > blob_threshold:
|
|
225
225
|
seg, offset, size = blob_store.write_blob(self.store_path, record_id, line_str)
|
|
@@ -241,7 +241,7 @@ class store:
|
|
|
241
241
|
seg, offset, size = entry
|
|
242
242
|
if self.log_manager is None:
|
|
243
243
|
raise RuntimeError("Store is not set up. Call setup() first.")
|
|
244
|
-
from
|
|
244
|
+
from mkdb.db.storage import serializer as _serializer
|
|
245
245
|
line_str = self.log_manager.read(seg, offset, size)
|
|
246
246
|
_, flat_dict = _serializer.deserialize_record(line_str)
|
|
247
247
|
if self._ram_cache is not None:
|
|
@@ -264,7 +264,7 @@ class store:
|
|
|
264
264
|
|
|
265
265
|
def teardown(self) -> None:
|
|
266
266
|
"""Flush and close storage handles. Called during server shutdown."""
|
|
267
|
-
from
|
|
267
|
+
from mkdb.server.event_log import emit as _emit
|
|
268
268
|
_emit("info", f"store:{self.config.name}", "Store shutting down — flushing writes")
|
|
269
269
|
if self._task_scheduler is not None:
|
|
270
270
|
self._task_scheduler.stop()
|
|
@@ -142,7 +142,7 @@ class ParityManager:
|
|
|
142
142
|
"verify_and_repair: segment %03d had corruption — repaired and rewritten",
|
|
143
143
|
seq_int,
|
|
144
144
|
)
|
|
145
|
-
from
|
|
145
|
+
from mkdb.server.event_log import emit as _emit
|
|
146
146
|
_emit("recovery", f"store:{self.service}",
|
|
147
147
|
f"Segment {self.service}_{seq_int:03d}.log had corruption — repaired via Reed-Solomon")
|
|
148
148
|
tmp_path = log_path + ".tmp"
|
|
@@ -160,7 +160,7 @@ class ParityManager:
|
|
|
160
160
|
because it is still being appended to — its parity is always regenerated
|
|
161
161
|
fresh instead so subsequent rollover-based parity generation is correct.
|
|
162
162
|
"""
|
|
163
|
-
from
|
|
163
|
+
from mkdb.server.event_log import emit as _emit
|
|
164
164
|
all_segs = log_manager.list_segments()
|
|
165
165
|
active = log_manager.active_segment
|
|
166
166
|
for seq_int in all_segs:
|
|
@@ -53,8 +53,8 @@ class QueryEngine:
|
|
|
53
53
|
kept on disk only — queries read from the file; mutations are buffered
|
|
54
54
|
and flushed before each query.
|
|
55
55
|
"""
|
|
56
|
-
from
|
|
57
|
-
from
|
|
56
|
+
from mkdb.db.query.full_text_index import FullTextIndex
|
|
57
|
+
from mkdb.db.query.numeric_index import NumericIndex
|
|
58
58
|
|
|
59
59
|
schema = getattr(self._store.config, "schema_config", None)
|
|
60
60
|
if schema is None:
|
|
@@ -142,9 +142,9 @@ class QueryEngine:
|
|
|
142
142
|
Backfill the index for a single field by scanning all log segments.
|
|
143
143
|
Safe to call from a background thread — reads only, no writes to log.
|
|
144
144
|
"""
|
|
145
|
-
from
|
|
146
|
-
from
|
|
147
|
-
from
|
|
145
|
+
from mkdb.db.query.full_text_index import FullTextIndex
|
|
146
|
+
from mkdb.db.query.numeric_index import NumericIndex
|
|
147
|
+
from mkdb.db.storage import serializer as _ser
|
|
148
148
|
|
|
149
149
|
store = self._store
|
|
150
150
|
if store.log_manager is None or store.index_manager is None:
|
|
@@ -10,7 +10,7 @@ QueryTask — the picklable unit of work; mostly internal
|
|
|
10
10
|
OPERATIONS — frozenset of valid operation strings
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
from
|
|
14
|
-
from
|
|
13
|
+
from mkdb.db.query_workers.dispatcher import QueryDispatcher
|
|
14
|
+
from mkdb.db.query_workers.task import QueryTask, OPERATIONS
|
|
15
15
|
|
|
16
16
|
__all__ = ["QueryDispatcher", "QueryTask", "OPERATIONS"]
|
|
@@ -32,8 +32,8 @@ import threading
|
|
|
32
32
|
import uuid
|
|
33
33
|
from typing import Any
|
|
34
34
|
|
|
35
|
-
from
|
|
36
|
-
from
|
|
35
|
+
from mkdb.db.query_workers.task import QueryTask
|
|
36
|
+
from mkdb.db.query_workers.worker import (
|
|
37
37
|
WORKER_SENTINEL,
|
|
38
38
|
worker_process_main,
|
|
39
39
|
worker_thread_main,
|
|
@@ -139,8 +139,8 @@ def _read(store_name: str, params: dict, cache: _WorkerCache, base_path: str) ->
|
|
|
139
139
|
return cached
|
|
140
140
|
|
|
141
141
|
# TODO(WS-1): seek by byte offset from IndexManager / LogManager
|
|
142
|
-
# from
|
|
143
|
-
# from
|
|
142
|
+
# from mkdb.db.storage.index_manager import IndexManager
|
|
143
|
+
# from mkdb.db.storage.log_manager import LogManager
|
|
144
144
|
# idx = IndexManager(base_path, store_name); idx.load()
|
|
145
145
|
# lmgr = LogManager(base_path, store_name)
|
|
146
146
|
# seg, offset, size = idx.get(record_id)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
1
|
+
from mkdb.objects import runtime_options as __runtime_options__
|
|
2
|
+
from mkdb.objects import base_object
|
|
3
3
|
|
|
4
4
|
class runtime_args(base_object):
|
|
5
5
|
def __init__(self, data: dict = {}):
|
|
@@ -6,7 +6,7 @@ read / write / delete / query logic so nothing is duplicated.
|
|
|
6
6
|
|
|
7
7
|
Usage
|
|
8
8
|
-----
|
|
9
|
-
from
|
|
9
|
+
from mkdb.server.coms.actions import execute, ActionResult
|
|
10
10
|
|
|
11
11
|
result = execute(database, "read", store_name, {"record_id": rid},
|
|
12
12
|
client_key="alice", transport="http")
|
|
@@ -22,7 +22,7 @@ import time
|
|
|
22
22
|
from dataclasses import dataclass
|
|
23
23
|
from typing import Any, Callable, Optional
|
|
24
24
|
|
|
25
|
-
from
|
|
25
|
+
from mkdb.server.coms import metrics as _metrics
|
|
26
26
|
|
|
27
27
|
logger = logging.getLogger(__name__)
|
|
28
28
|
|
|
@@ -196,7 +196,7 @@ def _do_query(store_obj, store_name: str, params: dict, client_key: str, transpo
|
|
|
196
196
|
result.get("count", 0), client_key, transport,
|
|
197
197
|
)
|
|
198
198
|
try:
|
|
199
|
-
from
|
|
199
|
+
from mkdb.server.event_log import emit as _emit
|
|
200
200
|
_emit(
|
|
201
201
|
"warning", f"store:{store_name}",
|
|
202
202
|
f"Slow query ({duration_ms:.1f} ms ≥ {threshold_ms:.0f} ms threshold): "
|
|
@@ -20,8 +20,8 @@ import time
|
|
|
20
20
|
from http.server import BaseHTTPRequestHandler
|
|
21
21
|
from urllib.parse import urlparse
|
|
22
22
|
|
|
23
|
-
from
|
|
24
|
-
from
|
|
23
|
+
from mkdb.server.coms import metrics as _metrics
|
|
24
|
+
from mkdb.server.coms.actions import execute as _execute
|
|
25
25
|
|
|
26
26
|
logger = logging.getLogger(__name__)
|
|
27
27
|
|
|
@@ -240,7 +240,7 @@ class HTTPDataHandler(BaseHTTPRequestHandler):
|
|
|
240
240
|
self._json(401, {"status": "error", "message": "Invalid credentials format", "code": 401})
|
|
241
241
|
return True
|
|
242
242
|
|
|
243
|
-
from
|
|
243
|
+
from mkdb.server.control.server import verify_password
|
|
244
244
|
user = db.config.users.get(username)
|
|
245
245
|
if user is None or not verify_password(password, user.password_hash):
|
|
246
246
|
self._json(403, {"status": "error", "message": "Invalid username or password", "code": 403})
|
|
@@ -39,8 +39,8 @@ import uuid
|
|
|
39
39
|
from dataclasses import dataclass
|
|
40
40
|
from typing import Optional
|
|
41
41
|
|
|
42
|
-
from
|
|
43
|
-
from
|
|
42
|
+
from mkdb.server.coms.socket_protocol import read_frame, write_frame
|
|
43
|
+
from mkdb.server.coms.actions import execute as _execute
|
|
44
44
|
|
|
45
45
|
logger = logging.getLogger(__name__)
|
|
46
46
|
|
|
@@ -246,7 +246,7 @@ class SocketServer:
|
|
|
246
246
|
password = str(auth_msg.get("password", ""))
|
|
247
247
|
|
|
248
248
|
if has_users:
|
|
249
|
-
from
|
|
249
|
+
from mkdb.server.control.server import verify_password
|
|
250
250
|
user = db.config.users.get(username)
|
|
251
251
|
if user is None or not verify_password(password, user.password_hash):
|
|
252
252
|
write_frame(conn, {"type": "error", "error": "Invalid credentials"})
|