SASGIS - SAS.Планета
View Issue Details
0003447SAS.Планета[All Projects] Багpublic23-05-2019 19:4227-05-2019 13:52
zed 
zed 
normalminoralways
resolvedfixed 
181221 
190707190707 
0003447: TStorageStateInternal игнорирует опцию AllowScan
При создании хранилища с единственной целью - сканирование тайлов, получаем невалидный стейт, у которого нету доступа ни к чему.

Воспроизводится на тайловом хранилище, с ForceAbilities созданными таким образом:
TTileStorageAbilities.Create([tsatScan]).
No tags attached.
Issue History
23-05-2019 19:42zedNew Issue
23-05-2019 20:03zedNote Added: 0018709
24-05-2019 01:55vdemidovNote Added: 0018710
24-05-2019 04:59vdemidovNote Added: 0018711
24-05-2019 05:35vdemidovNote Edited: 0018711bug_revision_view_page.php?bugnote_id=18711#r7408
24-05-2019 06:33zedNote Added: 0018713
24-05-2019 06:42vdemidovNote Added: 0018714
24-05-2019 18:59zedNote Added: 0018715
24-05-2019 19:02zedAssigned To => zed
24-05-2019 19:02zedStatusnew => assigned
24-05-2019 19:05zedTarget Version => 190707
27-05-2019 13:51zedStatusassigned => resolved
27-05-2019 13:51zedFixed in Version => 190707
27-05-2019 13:51zedResolutionopen => fixed

Notes
(0018709)
zed   
23-05-2019 20:03   
И ещё мне кажется очень странным использование 3-х состояний TAccesState. Какой вообще смысл в использовании asUnknown?

По-моему, тут надо упростить, перейти на Boolean и по дефолту разрешать доступ ко всему, а уже ForceAbilities будут решать, что конкретно оставить.

Так же есть сомнение о необходимости свойств WriteAccess и IsReadOnly (у ITileStorageAbilities) - это вспомогательные свойства, которые могут быть получены из имеющихся. Их наличие усложняет код и по хорошему их надо либо убрать, либо заменить на одно свойство типа enum (возможно, даже только для чтения), со значениями (ReadOnly, WriteOnly, ReadWrite).
(0018710)
vdemidov   
24-05-2019 01:55   
Б.я. Пол часа писал, а оно ничго не сохранило, ибо долго писал.
(0018711)
vdemidov   
24-05-2019 04:59   
(edited on: 24-05-2019 05:35)
Пишу еще раз

> При создании хранилища с единственной целью - сканирование тайлов, получаем невалидный стейт, у которого нету доступа ни к чему.
А к чему там должен быть доступ. Вроде бы там и должен быть доступ только к скану. Но может быть и ошибка где-то.

Подразумевается, что это открытие только на один или несколько проходов сканирования всех тайлов, без возможности получения доступа к произвольному тайлу и без любых прав на изменение. Пример - проход по tar архиву.

>И ещё мне кажется очень странным использование 3-х состояний TAccesState. Какой вообще смысл в использовании asUnknown?
Смысл в том, что бы если запущена закачка, а доступа на запись в тайлохранилище нет, то что бы она могла понять, что запись не доступна и не качала тайлы без записи. И что бы инициализация была ленивая, тоесть оно не пытается узнать есть ли возможность записи пока не получит первую команду на запись. Но возможно, это действительно стоит выбросить и сделать только ленивую инициализацию всего тайлохранилища, а уже в ней сразу проверять и чтение, и запись.

>Так же есть сомнение о необходимости свойств WriteAccess и IsReadOnly (у ITileStorageAbilities)
Возможно. Скорее всего перемудрил. Поясню зачем это нужно. В первую очередь это нужно для типа тайлохранилища, что бы можно было указать какие типы операций оно поволяет. Причем все они практически ортогональны. И где ты наше WriteAccess у ITileStorageAbilities? Там есть:
AllowScan - проход по всем тайлам в тайлохранилище (например импорт tar архива)
AllowRead - произвольный доступ к тайлу - не обязательно подразумевает наличие AllowScan, так как это может быть какая-то база с АПИ позволяющим только одиночные запросы к тайлам
AllowAdd - возможность добавлять тайлы - может быть без любых других возможностей, например запись в tar - исключительно потоковый экспорт.
AllowDelete - возможность удялить тайлы - можно представить тайлохранилище даже просто в файловой системе, где есть право добавлять файлы, но нет права удалять. ХЗ надо ли оно такое.
AllowReplace - можно ли заменять тайлы. Кажется что можно заменить парой Add и Delete, но это только если обе возможности есть. Могу представить как случаи когда можно удалять и заменять существующие тайлы, но нельзя добавлять новые, так и случаи, когда можно добавлять новые и заменять существующие, но нельзя удалять (хотья, конечно это сомнительно)
IsReadOnly - добавлена, что бы можно было в параметрах тайлохранилища одной настройкой полностью отключить возможность изменения, но, думаю, можно было бы оставить ее чисто виртуальной на время чтения/записи настроек, а в рантайме хранить как отключение всех возможностей изменения.

(0018713)
zed   
24-05-2019 06:33   
Должен быть доступ к скану, но по факту его нету. И нет даже свойства ScanAccess, вместо которого от безысходности проверяется ReadAccess.

WriteAccess я в стейте нашёл. Просто оно такой же придаток, как и IsReadOnly.
(0018714)
vdemidov   
24-05-2019 06:42   
> Должен быть доступ к скану, но по факту его нету. И нет даже свойства ScanAccess, вместо которого от безысходности проверяется ReadAccess.
Значит нужно допиливать что-то. Когда это хозяйство писалось, тайлохранилищ только со сканом еще не было. Ты их вроде только недавно добавил. Вот и не учел я что-то.

> WriteAccess я в стейте нашёл. Просто оно такой же придаток, как и IsReadOnly.
Возможно в стейте стоит действительно сделать энам с несколькими состояниями. Смотри сам. Свои соображения я изложил. По хорошему, было бы неплохо в возможности тайлохранилища еще поддержку tne указывать, что бы можно было включать/отключать не на всю программу, а и для конкретной карты. И при операциях перемещения-копирования это учитывать и явно настраивать.
(0018715)
zed   
24-05-2019 18:59   
А самое интересное, что этот WriteAccess повсеместно ошибочно используется там, где надо проверять AddAccess. Видимо, название оказалось неудачным.

Займусь, наверное, небольшим рефакторингом этого класса на следующей неделе.