msave/mload/mdelete

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

Re: msave/mload/mdelete

Post by John Doe »

Latest post of the previous page:

Сейчас в распоряжении скрипта есть как семейство функций mf(msave/mload/mdelete), так и семейство FAR API (SettingsControl).

Хочется разобраться со спецификой, в каких случаях что использовать для хранения настроек (и вообще любых данных, требующих между сессиями фар).
  • msave/mload/mdelete однозначно проще в использовании, и позволяют хранить таблицы
    Но как у них с производительностью?
  • Функции SettingsControl зато позволяют хранить данные в отдельной базе (а не в базе плагина).
    Вопрос это не актуален для персональных скриптов, но ведь скрипты выкладываются и в публичное пользование, подобно плагинам.
На первый взгляд стоит отдать предпочтение использованию msave/mload/mdelete.
Но что посоветует автор этой функциональности?

Shmuel
Posts: 5972
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 25 times
Been thanked: 257 times

Re: msave/mload/mdelete

Post by Shmuel »

John Doe wrote:
  • msave/mload/mdelete однозначно проще в использовании, и позволяют хранить таблицы
    Но как у них с производительностью?
  • Функции SettingsControl зато позволяют хранить данные в отдельной базе (а не в базе плагина).
На первый взгляд стоит отдать предпочтение использованию msave/mload/mdelete.
Но что посоветует автор этой функциональности?
1. С производительностью у msave/mload/mdelete всё в порядке.

2. "Функции SettingsControl зато позволяют хранить данные в отдельной базе" - это неверно.
Фар ищет по гуиду только среди баз плагинов. Да, можно хранить в базе чужого плагина, или создать отдельный плагин специально для этого (не пробовал ни того, ни другого).

3. msave/mload/mdelete - это просто оболочки над SettingsControl, реализованные на Lua, что можно видеть в файле api.lua. Нравятся эти оболочки - пользуйтесь, не нравятся - сделайте лучше.

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

Re: msave/mload/mdelete

Post by John Doe »

Shmuel wrote:Нравятся эти оболочки - пользуйтесь, не нравятся - сделайте лучше.
Не будем пока что изобретать колесо )

Сейчас хотелось бы обсудить организацию хранения msave/mload, учитывая тот факт, что в одной базе могут храниться данные разных скриптов, составленных разными авторами.
msave/mload предполагают одноуровневую организацию, и на её основе необходимо построить более детальную иерархию.
Тут есть варианты, которые и хотелось бы обсудить (чтобы заново не решать давно решённые проблемы).

Рассмотрим для примера вопрос хранения опций моего скрипта.
Полагаю для своих скриптов удобно завести отдельный ключ (1 уровень)
Скриптов может быть много, нужен второй уровень, название скрипта.
У каждого скрипта может быть несколько опций, это третий уровень.

(1) Можно сделать так:
JD/RecentScreens
Здесь "JD" - таблица для всех моих скриптов
"RecentScreens" параметр lua-таблица, вмещающая все опции скрипа RecentScreens

(2) Можно сделать иначе:
JD.RecentScreens/Param1
JD.RecentScreens/Param2

(3) Или так:
JD/RecentScreens.Param1
JD/RecentScreens.Param2

Или как-то иначе?

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

msave/mload/mdelete

Post by John Doe »

>mf.msave сохраняет связи между таблицами и их метатаблицами.
Нельзя ли пояснить на примере?

Shmuel
Posts: 5972
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 25 times
Been thanked: 257 times

msave/mload/mdelete

Post by Shmuel »

John Doe wrote:>mf.msave сохраняет связи между таблицами и их метатаблицами.
Нельзя ли пояснить на примере?
Это значит, что если сохраняемая таблица T имеет метатаблицу MT, то метатаблица также будет сохранена, вместе со своим содержимым. А когда mf.mload запросит таблицу T, таблица MT будет также воссоздана, и установлена как метатаблица для воссозданной таблицы T.

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

msave/mload/mdelete

Post by John Doe »

Понятно.
Подозреваю что в некоторых случаях это может оказаться нежелательным.
Ведь метатаблица может содержать функции, которые не сохранятся.
(Пошёл проверять свой код)

P.S.
Функции можно было бы сохранять, но тут опять же: смысл есть только если функции не используют upvalues.

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

msave/mload/mdelete

Post by John Doe »

mf.msave("a","b",setmetatable({},{}))

Code: Select all

╔══════════════════════════════════════ LuaMacro ══════════════════════════════════════╗
║ C:\APPs\Far3\Plugins\LuaMacro\api.lua:497: attempt to concatenate a nil value        ║
║ stack traceback:                                                                     ║
║    C:\APPs\Far3\Plugins\LuaMacro\api.lua: in function 'tableSerialize'               ║
║    C:\APPs\Far3\Plugins\LuaMacro\api.lua:508: in function 'serialize'                ║
║    C:\APPs\Far3\Plugins\LuaMacro\api.lua:525: in function 'msave'                    ║
║    [string "mf.msave("a","b",setmetatable({},{}))"]:1: in function 'f'               ║
║    ...file\Macros\scripts\Macro\Macro_Check_Reload_Execute.lua:120: in function <... ║
║ file\Macros\scripts\Macro\Macro_Check_Reload_Execute.lua:96>                         ║
╟──────────────────────────────────────────────────────────────────────────────────────╢
║                                        { OK }                                        ║
╚══════════════════════════════════════════════════════════════════════════════════════╝

Shmuel
Posts: 5972
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 25 times
Been thanked: 257 times

msave/mload/mdelete

Post by Shmuel »

John Doe wrote:mf.msave("a","b",setmetatable({},{}))

Code: Select all

╔══════════════════════════════════════ LuaMacro ══════════════════════════════════════╗
║ C:\APPs\Far3\Plugins\LuaMacro\api.lua:497: attempt to concatenate a nil value        ║
╚══════════════════════════════════════════════════════════════════════════════════════╝
Спасибо, исправлено.

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

msave/mload/mdelete

Post by John Doe »

Code: Select all

shmuel 15.12.2018 16:35:39 +0200 - build 679

1. mf.msave() возвращает булевое значение.

2. mf.mload() "бросает" ошибку, если не удаётся установить соединение с базой данных.
Смущает, что теперь надо по-разному обрабатывать эти функции (для "безопасного" вызова mf.mload потребуется pcall).
Как вариант, ошибку можно было бы возвращать вторым значением.

И предлагаю для mf.msave текст ошибки возвращать вторым значением, например для такого использования: assert(mf.msave(...

И с mf.mdelete аналогично.

Shmuel
Posts: 5972
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 25 times
Been thanked: 257 times

msave/mload/mdelete

Post by Shmuel »

- mload и msave без изменений API (но улучшены внутри)
- mdelete возвращает boolean
- возвращать текст ошибки вторым значением требует большей переделки, чем у меня сейчас позволяет время (там по 3 разных варианта ошибки на функцию)

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

msave/mload/mdelete

Post by John Doe »

Shmuel wrote:
Sun 16 Dec, 2018 15:41
- mload и msave без изменений API (но улучшены внутри)
Тем не менее использовать mload как прежде не получится: я собираюсь пересмотреть существующий код, и найти места, где ошибка при вызове mload породит незакрытые хэндлы.

Собственно, я вовсе не против это сделать, больше смущает, что использование 3х функций одного семейства отличается, не вполне оправданно: неудачи работы с базой могут быть в каждой из 3х функций, но ошибку времени выполнения вызывает лишь одна.

Я понимаю, что это различие вносится во имя сохранения прежнего АПИ, но как для меня - АПИ изменилось.

Shmuel
Posts: 5972
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 25 times
Been thanked: 257 times

msave/mload/mdelete

Post by Shmuel »

John Doe wrote:
Sun 16 Dec, 2018 16:00
я собираюсь пересмотреть существующий код, и найти места, где ошибка при вызове mload породит незакрытые хэндлы.
Может быть описание следовало бы расширить, но mload бросает ошибку только в одном случак - если far.CreateSettings() обламывается, поэтому незакрытых хэндлов она не создаёт.

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

msave/mload/mdelete

Post by John Doe »

Shmuel wrote:
Sun 16 Dec, 2018 16:54
поэтому незакрытых хэндлов она не создаёт.
Имел ввиду "хэндлы" не связанные с настройками, в коде пользователя.
Условно, так:

Code: Select all

local f= io.open("file"))
local a = mf.mload(b,c)
До последних изменений это был "безопасный" код, теперь же его надо оборачивать в pcall (или рефакторить).

Shmuel
Posts: 5972
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 25 times
Been thanked: 257 times

msave/mload/mdelete

Post by Shmuel »

Ладно, убедили.
Какой из 2-х вариантов на ваш взгляд лучше:
1. val, errmsg = mf.mload()
или
2. val, ok, errmsg = mf.mload()

User avatar
DrKnS
Posts: 5490
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 273 times

msave/mload/mdelete

Post by DrKnS »

John Doe wrote:
Sun 16 Dec, 2018 18:11
До последних изменений это был "безопасный" код, теперь же его надо оборачивать в pcall
А что, в lua нет концепции деструкторов или другого способа исполнения кода при выходе из блока?

User avatar
John Doe
Бюрократ
Posts: 12601
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 260 times

msave/mload/mdelete

Post by John Doe »

Shmuel, 1.
Или можно подумать и об изменении апи (завести новую функцию).

Post Reply

Return to “Обсуждение макросов”