You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
### Проблема 7: Отсутствие escaping '/' в path-сегментах
73
+
### ~~Проблема 7: Отсутствие escaping '/' в path-сегментах~~ ✅
74
74
75
-
**Файл:**`pjson_db_pmm.h`, метод `_walk_path()`
76
-
77
-
Символ `/` используется как разделитель пути, но не поддерживается экранирование. Если ключ объекта содержит `/`, обратиться к нему через path-адресацию невозможно:
78
-
79
-
```cpp
80
-
db.put("/config", R"({"a/b": 42})");
81
-
db.get("/config/a/b"); // ищет config → "a" → "b" вместо config → "a/b"
82
-
```
83
-
84
-
**Решение:** Поддержать RFC 6901 (JSON Pointer): символ `~` экранируется как `~0`, `/` как `~1`.
75
+
**Решено в Этапе 10.2:** Реализована поддержка RFC 6901 (JSON Pointer) для путей. Добавлена функция `pjson_decode_rfc6901_segment()` в `pjson_db_helpers.h`, которая декодирует `~1` → `/` и `~0` → `~`. Декодирование применяется в `_walk_path()` и `pjson_split_path()`. Ключи, содержащие `/` и `~`, теперь доступны через path-адресацию с экранированием. Добавлены 17 тестов.
85
76
86
77
---
87
78
@@ -190,7 +181,7 @@ pvector был бы предпочтительнее **только** при ч
Copy file name to clipboardExpand all lines: readme.md
+16-3Lines changed: 16 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -51,7 +51,7 @@ int main() {
51
51
|**Два типа строк**| readonly (`pstringview_pmm`): ключи объектов, пути `$ref`, интернированы, сравнение O(1); readwrite (`PamManager::pstring`): строковые значения JSON, изменяемые на лету |
52
52
|**Нет SSO**| Ни `pstringview_pmm`, ни `PamManager::pstring` не используют SSO — все строки хранятся в ПАП (необходимо для сквозного поиска) |
53
53
|**jsonRVM-совместимость**|`pstring`-узлы могут модифицироваться непосредственно в БД библиотекой [jsonRVM](https://github.com/netkeep80/jsonRVM); `node_id`-ссылки стабильны при resize array/object |
54
-
|**Path-адресация**| Доступ к узлам через строковые пути вида `/a/b/0/c`|
54
+
|**Path-адресация**| Доступ к узлам через строковые пути вида `/a/b/0/c`; RFC 6901 escaping (`~1` для `/`, `~0` для `~`)|
55
55
|**$ref как указатели**|`{ "$ref": "/path" }` при разборе становится прямым указателем в ПАП |
56
56
|**Метрики**| Персистная структура `db_metrics_pmm` в ПАМ; обновляется при каждой мутации; доступ через `/$metrics/...`|
57
57
|**pmap-интерфейс**|`operator[]`, `find`, `insert` для доступа по пути без явного указания типа |
|`CMakeLists.txt`| — | Система сборки (CMake 3.16+, C++20) |
144
144
145
145
---
@@ -195,6 +195,19 @@ node_view age = db.get("/users/alice/age");
195
195
// age.as_int() -> 30
196
196
```
197
197
198
+
### RFC 6901 — ключи с `/` и `~`
199
+
200
+
```cpp
201
+
// Ключ "a/b" экранируется как "a~1b" в пути (RFC 6901 JSON Pointer)
202
+
db.put("/config/a~1b", 42);
203
+
node_view v = db.get("/config/a~1b");
204
+
// v.as_int() -> 42; фактический ключ в объекте — "a/b"
205
+
206
+
// Ключ "x~y" экранируется как "x~0y"
207
+
db.put("/data/x~0y", "hello");
208
+
// фактический ключ — "x~y"
209
+
```
210
+
198
211
### Работа с `$ref`
199
212
200
213
```cpp
@@ -439,7 +452,7 @@ db.put("/copy/name", "Bob");
439
452
## Известные ограничения
440
453
441
454
-**Глобальное состояние PMM** — в одном процессе может быть открыта только одна БД (см. [plan.md](plan.md), Проблема 3); состояние инкапсулировано в `pam_pmm_state`, передача как параметра — в будущих версиях
442
-
-**Нет escaping `/` в путях** — ключи объектов, содержащие `/`, недоступны через path-адресацию (см. [plan.md](plan.md), Проблема 7)
455
+
-~~**Нет escaping `/` в путях**~~ — **Исправлено** в Этапе 10.2: поддержка RFC 6901 (JSON Pointer) — `~1` для `/`, `~0` для `~` в сегментах путей
443
456
-~~**Утечка временных узлов метрик**~~ — **Исправлено** в Этапе 8.4: один pre-allocated узел переиспользуется для всех вызовов метрик
444
457
-**Не потокобезопасно** — CacheManagerConfig (по умолчанию) использует NoLock; для многопоточности нужен PersistentDataConfig
445
458
-**Строки не освобождаются** — словарь `pstringview_pmm` только растёт
0 commit comments