Исправление повреждения базы при записи в формате 8.3.8, команды -ct/-dr и тесты#293
Merged
Merged
Conversation
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.
Contributor
Author
|
Красный статус AppVeyor здесь, судя по логам, не связан с изменениями этого PR. В Linux-образах (Ubuntu 20.04 / 22.04) сборка падает на этапе CMake configure - не находится Qt6 для подпроекта Boost и ZLIB при этом находятся, до компиляции исходников дело не доходит — похоже, в окружении CI отсутствует Qt6. Косвенные подтверждения, что причина в окружении CI, а не в изменениях:
Правок инфраструктуры/сборки этот PR не вносит (намеренно). |
Collaborator
|
Спасибо! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что и зачем
Запись в файловую базу формата
8.3.8приводила к повреждению базы («Файл базы данных поврежден»): версия объекта писалась по смещению формата 8.0 поверх поля длины. Ветка чинит путь записи 8.3.8 и добавляет несколько связанных доработок.Исправления
blocks(копирование с множителем* 4вместо числа элементов) - она портила кучу.Новое
TOOL1CD_NODYNUP.-ct/-ClearTable <таблица>и-dr/-DeleteRecord <таблица> <номер>(пометка записей удалёнными).gtool1cd) - пункты контекстного меню «Очистить таблицу» и «Удалить запись».-sts/-ct/-dr.Тесты
Добавлены тесты (Catch2,
testproject):Тесты записи работают на эталонной базе
tests/db838/db01.Замечания
Связанные issue
free(): invalid next size (fast)при импорте таблицы). Первопричина - запись за границу вектораblocks(* 4вместо числа элементов) вV8Object; бэктрейс из issue (~V8Object()→~vector<unsigned int>()→free()) совпадает с этим механизмом. Падение по пути-eb/-ibустраняется этим PR. Желательно подтверждение на данных автора issue.