Руководство Melbis Shop: оглавление
Меняет данные пулом шагов: любые запросы, вставки, узлы деревьев,
уборку и отметки для кеша витрины. Читающие шаги select и
dependent здесь тоже работают.
«Прямой доступ → База данных → Изменение данных»
(AGENT_ENGINE_DB_EXECUTE).
| Параметр | Тип | Что это |
|---|---|---|
[pool] |
список объектов | шаги пула — см. «База данных» |
[pool_source] |
строка | файл JSON на этом компьютере со списком шагов — абсолютный путь или
путь от папки магазина — вместо pool |
Нужен pool или pool_source, но не оба.
| Шаг | Поля | Что делает | Ответ шага |
|---|---|---|---|
lock |
tables |
берёт таблицы в работу — все сразу или ни одной | tables |
unlock |
tables; без них — всё, что взял пул |
отпускает взятое этим пулом раньше конца | tables |
generate |
table |
следующий id из генератора таблицы | value |
select |
как у engine_db_select, без
проверки на чтение |
строки запроса | rows, data |
modify |
sql, params |
любой запрос: UPDATE, DELETE, DDL |
affected, insert_id |
insert |
table, rows |
вставляет строки одним многострочным INSERT |
affected, insert_id |
tree_add |
table, parent_id |
добавляет узел дерева | value — id узла |
tree_move |
table, id, parent_id |
переносит узел с поддеревом под другого родителя | — |
tree_up, tree_down |
table, id |
сдвигает узел среди соседей | — |
tree_remove |
table, id |
удаляет узел вместе с поддеревом | deleted — сколько строк |
dependent |
table, ids |
как у engine_db_select |
depend, count |
clear_dependent |
table |
убирает строки зависимых таблиц, оставшиеся без владельца | cleared |
change |
tables |
отмечает таблицы изменёнными | tables |
У любого шага может быть name: тогда его
value или insert_id одалживается следующим
шагам как @имя.
generate берёт id из генератора.
Генератор есть у таблиц, у которых engine_db_tables
показывает gen; у остальных id выдаёт сама СУБД через
AUTO_INCREMENT, и шаг для них отказывает. Бывает генератор
и без таблицы: store_clann выдаёт номер клана товара для
поля clann таблицы store.
insert принимает rows —
список строк, каждая объектом с одинаковыми колонками. Один
INSERT вмещает не больше 65 535 значений — строк,
умноженных на колонки; больше — несколькими шагами
insert.
id и parent_id шагов
дерева — целое число или @имя. Слово отказывает, а не
читается как ноль: ноль — это верх дерева.
Деревом считается любая таблица с полями tindex,
tlevel и absindex: каталог topic,
справочники info, альтернативные каталоги
topic_alt, характеристики *_key и другие.
tree_*. Они пересчитывают эти три поля по всей
таблице, и обычные INSERT, UPDATE и
DELETE этого не повторят.oper,
orders_client_field и личные таблицы пользователей
u_*.tree_add создаёт пустую строку —
только id и место в дереве. Поля заполняет следующий modify
по одолженному id.topic или info видит
только администратор, пока у узла нет строк в
topic_right или info_right.id = 1.
parent_id = 0 ставит узел на верхний уровень; так создаётся
первый узел пустого справочника info.clear_dependent убирает строки зависимых таблиц, которые
остались без владельца, и идёт дальше по цепочке: вслед за
info чистятся хвосты info_value. Ответ
cleared называет по таблице, сколько строк снято; занятую
таблицу шаг пропускает и пишет у неё busy.
user и
user_group уборке закрыты.unlock или
запускают отдельным пулом.Витрина узнаёт об изменении таблицы по отметке. Шаг
change отмечает названные таблицы; шаги дерева и уборка
отмечают свои сами. Отметки ставятся один раз в конце пула — тысяча
вставок стоит одной отметки. Таблица, изменённая запросом без
change, не отмечается, и витрина продолжает отдавать
старое.
lock берёт все названные таблицы или
ни одной. Блокировку на мгновение он пережидает, а занятую дольше
таблицу отказывает — даже если её держит окно программы под тем же
логином.unlock отпускает только то, что взял
этот пул.unlock последним шагом не нужен. Отпущенное перечислено в
unlocked.{"ok": false,
"steps": [
{"num": 1, "do": "lock", "tables": ["store"]},
{"num": 2, "do": "generate", "value": 4187, "name": "new_id"},
{"num": 3, "do": "insert", "error": "Duplicate entry '4187' for key 'PRIMARY'"}
],
"changed": [], "unlocked": ["store"], "ms": 14}| Поле | Что это |
|---|---|
ok |
дошёл ли пул до конца |
steps |
шаги по порядку: номер num, шаг do,
name, если было, ответ шага или error у
остановившегося |
changed |
какие таблицы отмечены для кеша |
unlocked |
какие таблицы пул отпустил |
ms |
сколько длился вызов на сервере |
Шаг, который не прошёл, останавливает пул. Ответ приходит с признаком ошибки и тем же JSON; шаги до остановившегося выполнены, их изменения остались.
error шага |
Когда |
|---|---|
Table is busy: … - the lock is listed in the program and lifted there |
lock: таблица занята |
Not locked by this pool: … |
unlock: таблицу взял не этот пул |
Unknown table: … |
названа таблица, которой нет |
No generator for: … - a table without one takes its id from AUTO_INCREMENT |
generate: генератора с таким именем нет |
Nothing to insert: rows is empty,
rows takes a list of rows…,
Row … has other columns than the first one |
insert: строки не того вида |
This tree is not for the agent: … |
служебное дерево |
Not a tree table: … |
у таблицы нет полей дерева |
No parent … in …, No node … in … |
нет такого узла |
No such node, or the parent sits inside the moved branch |
tree_move: узла нет или новый родитель внутри
переносимой ветки |
The id of this step takes a whole number, and […] is not one,
The parent_id of this step… |
id или parent_id не целое число |
This sweep is not for the agent: … |
уборка user или user_group |
Unlock before this sweep: … |
уборка, пока пул держит таблицы |
No dependent list for … |
у таблицы нет записанных зависимых |
No step named … before this one |
@имя ссылается на шаг, которого раньше нет |
Unknown step: … |
такого шага нет |
| текст ошибки базы | ошибка в запросе |
Отказы до запуска пула — те же, что у engine_db_select.
Общие отказы — «Ответы и отказы».