Skip to content

Исправление повреждения базы при записи в формате 8.3.8, команды -ct/-dr и тесты#293

Merged
dmpas merged 7 commits into
e8tools:developfrom
AronMav:fix/format-838-readwrite
Jun 24, 2026
Merged

Исправление повреждения базы при записи в формате 8.3.8, команды -ct/-dr и тесты#293
dmpas merged 7 commits into
e8tools:developfrom
AronMav:fix/format-838-readwrite

Conversation

@AronMav

@AronMav AronMav commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Что и зачем

Запись в файловую базу формата 8.3.8 приводила к повреждению базы («Файл базы данных поврежден»): версия объекта писалась по смещению формата 8.0 поверх поля длины. Ветка чинит путь записи 8.3.8 и добавляет несколько связанных доработок.

Исправления

  • Версия объекта 8.3.8 пишется по верному для формата смещению (4), а не по смещению формата 8.0 (12), которое затирало длину объекта.
  • Корректное обновление числа блоков объекта при росте/усечении (fatlevel 0 и переход 0→1); добавлена защита от записи данных в нулевой блок (заголовок базы).
  • Аккуратное управление свободными блоками формата 8.3.8; устранена запись за границу вектора blocks (копирование с множителем * 4 вместо числа элементов) - она портила кучу.
  • Пропуск UTF-8 BOM при разборе значений потока - служебные файлы конфигурации после прерванного динамического обновления больше не ломают разбор.
  • 64-битный расчёт числа записей для больших таблиц.

Новое

  • Выгрузка конфигурации БД без применения динамического обновления — переменная окружения TOOL1CD_NODYNUP.
  • Консольные команды -ct/-ClearTable <таблица> и -dr/-DeleteRecord <таблица> <номер> (пометка записей удалёнными).
  • В GUI (gtool1cd) - пункты контекстного меню «Очистить таблицу» и «Удалить запись».
  • README: раздел поддерживаемых версий формата и описание команд -sts/-ct/-dr.

Тесты

Добавлены тесты (Catch2, testproject):

  • рост объекта при записи в формате 8.3.8 и чтение данных обратно;
  • установка версии объекта без затирания длины;
  • пометка записи удалённой с переоткрытием базы;
  • пропуск BOM при разборе дерева.

Тесты записи работают на эталонной базе tests/db838/db01.

Замечания

  • Запись разрешена только в монопольном режиме (форматы 8.1+); 8.0.x остаются только для чтения.
  • Изменения инфраструктуры (CI/релизы) в эту ветку намеренно не включены.

Связанные issue

  • Вероятно исправляет Ошибка при импорте таблицы: free(): invalid next size (fast) #290 (free(): invalid next size (fast) при импорте таблицы). Первопричина - запись за границу вектора blocks (* 4 вместо числа элементов) в V8Object; бэктрейс из issue (~V8Object()~vector<unsigned int>()free()) совпадает с этим механизмом. Падение по пути -eb/-ib устраняется этим PR. Желательно подтверждение на данных автора issue.
  • Связано с Работа с конфигурацией формата 8.3.8 #194 (работа с конфигурацией формата 8.3.8): PR заметно продвигает чтение/запись формата 8.3.8.

AronMav added 7 commits June 24, 2026 13:20
UTF-8 BOM в начале значения (встречается в служебных файлах конфигурации,
например DynamicallyUpdated) прерывал разбор ошибкой неизвестного типа.
Теперь метка пропускается.
Переменная окружения TOOL1CD_NODYNUP пропускает версии файлов от
динамического обновления и выгружает конфигурацию до обновления.
- число записей таблицы считается в 64 бит (таблицы больше 4 ГБ);
- версия объекта пишется по смещению формата 8.3.8 (ранее бралось
  смещение 8.0, из-за чего затиралось поле длины объекта);
- set_len: выделение блоков при росте без таблицы размещения, переход
  к таблице размещения для пустого объекта, усечение до нуля блоков;
- при усечении объекта список свободных блоков 8.3.8 не изменяется;
- проверка против записи данных в нулевой блок;
- пометка записи удалённой без перестроения индексов.
-ct (cleartable) помечает удалёнными все записи таблицы.
-dr (deleterecord) помечает удалённой запись по физическому номеру.
В контекстное меню списка таблиц добавлена очистка таблицы, в окно
данных — удаление записи через контекстное меню. Обе операции с
подтверждением, проверкой режима только-чтения и обновлением
представления; опираются на пометку записей удалёнными в библиотеке.
Добавлены проверки: рост числа блоков объекта при записи (set_data),
установка версии объекта без затирания длины (set_version), пометка
записи удалённой и пропуск UTF-8 BOM в начале потока. Тесты записи
работают на копии эталонной базы tests/db838/db01.
@AronMav AronMav marked this pull request as ready for review June 24, 2026 09:30
@AronMav

AronMav commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

Красный статус AppVeyor здесь, судя по логам, не связан с изменениями этого PR.

В Linux-образах (Ubuntu 20.04 / 22.04) сборка падает на этапе CMake configure - не находится Qt6 для подпроекта gtool1cd:

CMake Error at .../vcpkg/scripts/buildsystems/vcpkg.cmake:939 (_find_package):
  Could not find a package configuration file provided by "Qt6" ...
Call Stack (most recent call first):
  src/gtool1cd/CMakeLists.txt:9 (find_package)
-- Configuring incomplete, errors occurred!

Boost и ZLIB при этом находятся, до компиляции исходников дело не доходит — похоже, в окружении CI отсутствует Qt6.

Косвенные подтверждения, что причина в окружении CI, а не в изменениях:

  • джоба macOS в этой же сборке зелёная - проект, включая GUI, собирается и тесты проходят;
  • тот же сбой воспроизводится на не связанном с этим PR (Add WebAssembly build and browser runtime support #292).

Правок инфраструктуры/сборки этот PR не вносит (намеренно).

@dmpas dmpas self-assigned this Jun 24, 2026
@dmpas dmpas merged commit 1cd0ed1 into e8tools:develop Jun 24, 2026
1 check failed
@dmpas

dmpas commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator

Спасибо!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants