SASGIS - SAS.Планета
View Issue Details
0003869SAS.Планета[All Projects] Багpublic03-09-2023 07:1809-09-2023 18:18
foydogumlu 
zed 
immediatetweakalways
resolvedfixed 
Windows7Ultimate
220707 
230909230909 
0003869: Неправильные права при открытии sqlite базы
Не смотря на строчку IsReadOnly=1, база все равно открывается в режиме для записи
Сделать zmp-карту с флажком IsReadOnly=1 и желательно какой-то другой версией sqlite

Открыть карту в программе и убедиться, что рядом появились временные файлы:
*-shm
*-wal
Закрыть программу и убедиться, что эти файлы пропали.

Если на файловой системе поставить флажок Read Only (аттрибут файла), то в файле sasplanet\cache_sqlite\<title>\sqlite.log появляется запись:

2023-09-03 10:55:35.657 (init) 3.39.4 at c:\sasplanet\sqlite3.dll
2023-09-03 10:55:35.657 (init) attempt to write a readonly database ( error code: 8)

Временные файлы при этом не появляются, а сама карта не отображается.
sqlite надо сказать, что база не просто readonly, но и immutable

Нужно это для того, чтобы выложить на торренты большой кеш, но чтобы пользователям не приходилось держать по 2 копии файлов (одна для использования, вторая для продолжения раздачи на торрентах).

Если сделать md5sum файла для открытия и после, то будут изменены несколько байт. В моем случае это:
18 1 File format write version. 1 for legacy; 2 for WAL.
19 1 File format read version. 1 for legacy; 2 for WAL.
36 4 Total number of freelist pages.
92 4 The version-valid-for number.
96 4 SQLITE_VERSION_NUMBER

Увы, но это не позволяет нормально мне оформить раздачу, так как файлы постоянно меняются, а гонять туда-сюда сотни гигабайт крайне затратно.
No tags attached.
Issue History
03-09-2023 07:18foydogumluNew Issue
03-09-2023 07:24foydogumluNote Added: 0020420
03-09-2023 10:22zedNote Added: 0020421
03-09-2023 10:24zedNote Added: 0020422
03-09-2023 10:25zedProduct Version.Nightly => 220707
03-09-2023 10:25zedAssigned To => zed
03-09-2023 10:25zedStatusnew => feedback
03-09-2023 10:25zedTarget Version => 24xxxx
03-09-2023 10:34foydogumluNote Added: 0020423
03-09-2023 10:34foydogumluStatusfeedback => assigned
03-09-2023 10:44foydogumluNote Added: 0020424
03-09-2023 10:46foydogumluNote Edited: 0020423bug_revision_view_page.php?bugnote_id=20423#r7849
03-09-2023 11:00zedNote Added: 0020425
03-09-2023 11:00zedStatusassigned => resolved
03-09-2023 11:00zedFixed in Version => 24xxxx
03-09-2023 11:00zedResolutionopen => fixed
09-09-2023 18:14zedFixed in Version24xxxx => 230909
09-09-2023 18:18zedTarget Version24xxxx => 230909

Notes
(0020420)
foydogumlu   
03-09-2023 07:24   
immutable: The immutable parameter is a boolean query parameter that indicates that the database file is stored on read-only media. When immutable is set, SQLite assumes that the database file cannot be changed, even by a process with higher privilege, and so the database is opened read-only and all locking and change detection is disabled. Caution: Setting the immutable property on a database file that does in fact change can result in incorrect query results and/or SQLITE_CORRUPT errors. See also: **SQLITE_IOCAP_IMMUTABLE**.

*The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN flag indicates that a file cannot be deleted when open. The SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on read-only media and cannot be changed even by processes with elevated privileges.*
(0020421)
zed   
03-09-2023 10:22   
Протестируйте этот билд: https://cloud.mail.ru/public/HXEi/YSjwzPNeG

Сделал RO режим вот таким образом:
 
VOpenFlags := SQLITE_OPEN_READONLY or SQLITE_OPEN_URI;
FSQLite3DbHandler.Open('file:///' + FDBFilename + '?immutable=1', VOpenFlags, True);

нужно проверить, чтобы uri работал на путях со спец символами и пробелами. Вроде бы там никаких дополнительных экранирований делать не нужно, но я не уверен.
(0020422)
zed   
03-09-2023 10:24   
> Сделать zmp-карту с флажком IsReadOnly=1 и желательно какой-то другой версией sqlite

Про версию sqlite не понял. Последний релиз поставлялся с 3.38.3 - с ней что-то не так?
(0020423)
foydogumlu   
03-09-2023 10:34   
(edited on: 03-09-2023 10:46)
> Про версию sqlite не понял. Последний релиз поставлялся с 3.38.3 - с ней что-то не так?

С ней все так, просто скорее всего в будущем версии будут меняться и следовательно новые версии будут патчить sqlitedb-файлы, что не есть хорошо. У меня это вылезло от того, что я вообще кеш делаю своим софтом и таким образом sqlitedb-файлы были незамедлительно пропатчены при первом открытии Sas.Планетой из-за несовпадающей версии библиотеки.

(0020424)
foydogumlu   
03-09-2023 10:44   
> чтобы uri работал на путях со спец символами и пробелами

Пробелы в пути - работает
Кириллица в пути - работает (в zmp указана была в utf8, удивлен что сработало на win7)
Символы + и % - работает
(0020425)
zed   
03-09-2023 11:00   
Ок, будем считать, что всё работает как надо. Изменения ушли в ночную сборку.