SASGIS - SAS.Планета
View Issue Details
0003435SAS.Планета[All Projects] Багpublic16-04-2019 14:3314-06-2019 13:04
RedRat 
zed 
urgentmajoralways
resolvedfixed 
Windows8.1x64
181221 
190707190707 
0003435: Удаление всех вложенных категорий при удалении одной из одноимённых родительских категорий
Структура категорий основана исключительно на их именах, поэтому если у нас есть две родительские категории с одинаковыми именами, то при удалении любой из них будут удалены все дочерние категории независимо от того как они отображаются в деерве категорий. Программа об этом честно предупреждает, но все равно это опасное поведение.
1. Создаем две категории с одинаковыми именами Cat1
2. Создаем метку с категорией с названием Cat1\Cat2 - такая категория будет созадана автоматически.
3. В дереве меток дочерняя категория отображается как дочерняя для одной из созданных категорий Cat1
4. Удаляем одну из категорий Cat1, у которой не отображаетсядочерних категорий.
5. Программа предупреждает, что будет удалена дочерняя категория и удаляет категорию Cat1\Cat2 вместе с вложенной меткой.
No tags attached.
related to 0003454resolved zed Невозможно изменить свойства категории меток 
? Test.db3 (73,728) 16-04-2019 14:33
http://www.sasgis.org/mantis/file_download.php?file_id=2288&type=bug
? CategoryTest.sml (751) 20-04-2019 13:47
http://www.sasgis.org/mantis/file_download.php?file_id=2289&type=bug
? Test.sml (2,149) 20-04-2019 13:47
http://www.sasgis.org/mantis/file_download.php?file_id=2290&type=bug
Issue History
16-04-2019 14:33RedRatNew Issue
16-04-2019 14:33RedRatFile Added: Test.db3
20-04-2019 13:37RedRatNote Added: 0018674
20-04-2019 13:45RedRatNote Edited: 0018674bug_revision_view_page.php?bugnote_id=18674#r7405
20-04-2019 13:47RedRatFile Added: CategoryTest.sml
20-04-2019 13:47RedRatFile Added: Test.sml
20-04-2019 13:51RedRatNote Added: 0018675
20-04-2019 14:10zedNote Added: 0018676
22-04-2019 11:18RedRatNote Added: 0018684
29-05-2019 08:30vdemidovSeveritycrash => major
29-05-2019 08:30vdemidovStatusnew => confirmed
29-05-2019 08:30vdemidovProduct Version.Nightly => 181221
29-05-2019 08:30vdemidovTarget Version => 190707
29-05-2019 08:30vdemidovSummaryСамопроизвольное удаление точек при удалении одноимённых категорий => Удаление всех вложенных категорий при удалении одной из одноимённых родительских категорий
29-05-2019 08:30vdemidovDescription Updatedbug_revision_view_page.php?rev_id=7410#r7410
29-05-2019 08:30vdemidovSteps to Reproduce Updatedbug_revision_view_page.php?rev_id=7412#r7412
29-05-2019 08:33vdemidovNote Added: 0018716
04-06-2019 07:14zedNote Added: 0018726
04-06-2019 07:25zedNote Added: 0018727
04-06-2019 07:53zedNote Added: 0018730
04-06-2019 08:16vdemidovNote Added: 0018731
04-06-2019 08:27zedNote Added: 0018732
04-06-2019 09:52zedAssigned To => zed
04-06-2019 09:52zedStatusconfirmed => assigned
04-06-2019 12:31zedNote Added: 0018733
04-06-2019 12:31zedStatusassigned => feedback
11-06-2019 11:38zedRelationship addedrelated to 0003454
14-06-2019 13:03zedStatusfeedback => resolved
14-06-2019 13:03zedFixed in Version => 190707
14-06-2019 13:03zedResolutionopen => fixed

Notes
(0018674)
RedRat   
20-04-2019 13:37   
(edited on: 20-04-2019 13:45)
Пара уточнений:

1. При переносе любой категории на уровень с одноимённой, подкатегории из последней попадают в переносимую, а точки остаются на месте.

2. Данный баг стабильно повторяется как на SQLite, так и на SML базах данных.

По всей видимости, проблема заключается в том, что в БД все подкатегории связаны с родительскими категориями только параметром пути, а не ссылкой на индекс родителя, поэтому при наличии двух или более одноимённых категорий программа просто не знает, какие подкатегории куда совать. Ошибка дизайна БД?

(0018675)
RedRat   
20-04-2019 13:51   
Для быстрой демонстрации бага сделал маленькую базу в SML и приложил её к этому репорту. Достаточно открыть её и переименовать категорию Cat3 в Cat1 - всё сами увидите.

До полноценного решения этой проблемы предлагаю в ночных сборках пока запретить создание одноимённых категорий, чтобы избежать непредвиденной потери данных.
(0018676)
zed   
20-04-2019 14:10   
В SML так было by design, а SQLite и прочие унаследовали поведение. Поэтому, запрет создания одноимённых категорий - по-моему единственный способ решения этого бага.
(0018684)
RedRat   
22-04-2019 11:18   
Либо, как вариант, при появлении одноимённых категорий на одном уровне объединять их в одну с переносом всех точек и подкатегорий.
(0018716)
vdemidov   
29-05-2019 08:33   
Предлагаю фикс попроще. При удалении категории, проверять есть ли с еще категории с таким же именем. И если есть, то просто не запускать удаления дочерних категорий.
(0018726)
zed   
04-06-2019 07:14   
А может добавить в интерфейс поле NameInternal, сделать его уникальным (Name + ID) и использовать его, а для гуя оставить Name? Придётся залезть в реализацию SML и ORM (без изменения схемы), зато должно получиться надёжно.

Кроме того, в интерфейсе меток/категорий метод GetByName надо переделать так, чтобы он возвращал список. GetMarkByName по сути используется только в одном месте, при импорте меток, когда установлен флаг не импортировать, если метка с таким именем существует. И результат функции вообще не используется, а только проверяется на nil. А вот GetCategoryByName - сплошь и всюду.
(0018727)
zed   
04-06-2019 07:25   
А, нет. Надо менять схему и добавлять ParentID.
(0018730)
zed   
04-06-2019 07:53   
Значит, буду делать так:

Методы GetXXXByName переименую в GetFirstXXXByName, поскольку списки одноимённых меток/категорий нам пока нигде не нужны, но имя метода будет явно говорить, что могут быть и Next.

Добавлю методы GetXXXByNameCount - который будет возвращать число одноимённых меток, чтобы где надо, можно было просто проверить есть/нету или есть ли дубликаты.

В гуе сделаю запрет на создание (в том числе и методом переименования) одноимённых категорий и сделаю запрет удаления категории, если есть одноимённая. Для удаления такой категории, её надо будет сперва переименовать.
(0018731)
vdemidov   
04-06-2019 08:16   
> В гуе сделаю запрет на создание (в том числе и методом переименования) одноимённых категорий и сделаю запрет удаления категории, если есть одноимённая. Для удаления такой категории, её надо будет сперва переименовать.
Старые базы все еще будут жить с дублирующимися метками. Но хозяин - барин.
(0018732)
zed   
04-06-2019 08:27   
Одинаковые имена - не проблема БД, ведь если изменять схему, то имена так и останутся одинаковыми. По хорошему, да, схему надо менять, но это слишком калечащее изменение для поддержки не очень частого случая.
(0018733)
zed   
04-06-2019 12:31   
Сделал, тестируйте следующую ночную версию.