3. Описание MCP-сервера › 3.3 Движок › База данных

Раздел engine_db_* читает и меняет данные магазина прямо в его базе, минуя окна программы.

Инструменты

Инструмент Что делает
engine_db_tables структура таблиц: колонки, ключи, генератор
engine_db_select читает данные пулом шагов
engine_db_execute меняет данные пулом шагов
engine_db_locks кто взял таблицы в работу
engine_db_unlocks снимает блокировки, зависшие под своим логином

Чтение и изменение — разные права: владелец может выдать engine_db_select без engine_db_execute.

Пул шагов

Вся работа с данными идёт пулом — списком шагов, которые движок выполняет по порядку в одном соединении с базой. Только так временная таблица и LAST_INSERT_ID() доживают от шага к шагу: отдельные вызовы их не соединят.

{"pool": [
  {"do": "generate", "table": "store", "name": "new_id"},
  {"do": "insert", "table": "store", "rows": [{"id": "@new_id", "name": "Product"}]},
  {"do": "change", "tables": ["store"]}
]}

engine_db_select берёт только читающие шаги, engine_db_execute — любые; сами шаги описаны на страницах engine_db_select и engine_db_execute.

Значения — в params. В тексте запроса пишут :ИМЯ заглавными буквами, а значение кладут в params под этим именем в любом регистре. Так кавычка, апостроф или чужой алфавит запрос не ломают.

@имя подставляет результат более раннего шага с этим name: id из генератора, insert_id вставки, id нового узла дерева. Работает в params, в значениях строк insert, в id и parent_id шагов дерева и в ids шага dependent. Шаг select значений не одалживает.

Текст запроса уходит в базу как написан — одна команда на шаг. По пути с ним делают только две вещи. {DBNICK} заменяется везде, даже внутри строки в кавычках. :ИМЯ становится параметром, только если в params есть такое имя, — но тогда везде, и то же слово внутри строки в кавычках ломает шаг. Экранирование — самой базы: \', \\, ''.

Транзакции нет. Ошибка останавливает пул, но сделанное до неё остаётся. Таблицы, взятые пулом в работу, он отпускает и после ошибки SQL; если же запрос упал целиком, строка блокировки остаётся, и её снимает engine_db_unlocks.

Объём. Шаг, вернувший больше 5000 строк, отказывает — сузьте запрос или повторите шаг с "big": true. Строки тяжёлого шага — с big или с ответом больше 100 000 байт — уходят в файл mcp\melbis\queries\<дата_время>.<имя шага>.jsonl папки магазина, по объекту JSON на строку; в ответе шаг оставляет rows, путь file и head — три первые строки, обрезанные до 300 символов. Шаг с полем output пишет строки в названный файл при любом размере. big снимает только предел строк: широкая таблица, прочитанная целиком, может исчерпать память сервера.

Большой пул собирают скриптом на этом компьютере и передают файлом pool_source вместо pool: абсолютный путь или путь от папки магазина.

Имена таблиц

Что значит каждое поле, описано в папке Engine\Tables\ программы — по файлу на таблицу.

Блокировки

Melbis не пользуется блокировками СУБД. Взять таблицу в работу — значит пометить её занятой: какая таблица, какой операцией, каким пользователем, с какого времени; эти пометки показывает engine_db_locks. СУБД чужой запрос при этом не остановит, поэтому занятость таблиц проверяют сами.

В программе все блокировки видны и снимаются в диспетчере — «Диспетчер и блокировки».