msave/mload/mdelete

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

Re: msave/mload/mdelete

Post by John Doe »

Latest post of the previous page:

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: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

msave/mload/mdelete

Post by John Doe »

>mf.msave сохраняет связи между таблицами и их метатаблицами.
Нельзя ли пояснить на примере?
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

msave/mload/mdelete

Post by Shmuel »

John Doe wrote:>mf.msave сохраняет связи между таблицами и их метатаблицами.
Нельзя ли пояснить на примере?
Это значит, что если сохраняемая таблица T имеет метатаблицу MT, то метатаблица также будет сохранена, вместе со своим содержимым. А когда mf.mload запросит таблицу T, таблица MT будет также воссоздана, и установлена как метатаблица для воссозданной таблицы T.
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

msave/mload/mdelete

Post by John Doe »

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

P.S.
Функции можно было бы сохранять, но тут опять же: смысл есть только если функции не используют upvalues.
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 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: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

msave/mload/mdelete

Post by Shmuel »

- mload и msave без изменений API (но улучшены внутри)
- mdelete возвращает boolean
- возвращать текст ошибки вторым значением требует большей переделки, чем у меня сейчас позволяет время (там по 3 разных варианта ошибки на функцию)
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

msave/mload/mdelete

Post by John Doe »

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

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

Я понимаю, что это различие вносится во имя сохранения прежнего АПИ, но как для меня - АПИ изменилось.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 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: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

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: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

msave/mload/mdelete

Post by Shmuel »

Ладно, убедили.
Какой из 2-х вариантов на ваш взгляд лучше:
1. val, errmsg = mf.mload()
или
2. val, ok, errmsg = mf.mload()
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

msave/mload/mdelete

Post by DrKnS »

John Doe wrote: Sun 16 Dec, 2018 18:11До последних изменений это был "безопасный" код, теперь же его надо оборачивать в pcall
А что, в lua нет концепции деструкторов или другого способа исполнения кода при выходе из блока?
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

msave/mload/mdelete

Post by John Doe »

Shmuel, 1.
Или можно подумать и об изменении апи (завести новую функцию).
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

msave/mload/mdelete

Post by John Doe »

DrKnS, местами даже есть (mf.AddExitHandler), но в данном случае речь о том, что раньше функция не бросала ошибки.
User avatar
buniak_a_h
Posts: 4269
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

msave/mload/mdelete

Post by buniak_a_h »

Сохранение поля таблицы, являющегося функцией, не предусмотрено. Поначалу я думал, что это - естественно. Но вдруг наткнулся на пару string.dump / loadstring(). И подумалось мне, что это какое-то необоснованное ограничение. Ну да, у string.dump есть ограничение(нельзя использовать upvalue). Проблема, на мой взгляд, только в том, чтобы отличить строку, сформированную string.dump-ом от обычной строки. Это никак не побороть?
Post Reply

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