Page 3 of 4

Re: msave/mload/mdelete

Posted: Sat 20 Apr, 2013 18:03
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

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

msave/mload/mdelete

Posted: Tue 21 Oct, 2014 08:13
by John Doe
>mf.msave сохраняет связи между таблицами и их метатаблицами.
Нельзя ли пояснить на примере?

msave/mload/mdelete

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

msave/mload/mdelete

Posted: Tue 21 Oct, 2014 10:52
by John Doe
Понятно.
Подозреваю что в некоторых случаях это может оказаться нежелательным.
Ведь метатаблица может содержать функции, которые не сохранятся.
(Пошёл проверять свой код)

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

msave/mload/mdelete

Posted: Wed 22 Oct, 2014 08:04
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 }                                        ║
╚══════════════════════════════════════════════════════════════════════════════════════╝

msave/mload/mdelete

Posted: Wed 22 Oct, 2014 08:39
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        ║
╚══════════════════════════════════════════════════════════════════════════════════════╝
Спасибо, исправлено.

msave/mload/mdelete

Posted: Sun 16 Dec, 2018 14:01
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 аналогично.

msave/mload/mdelete

Posted: Sun 16 Dec, 2018 15:41
by Shmuel
- mload и msave без изменений API (но улучшены внутри)
- mdelete возвращает boolean
- возвращать текст ошибки вторым значением требует большей переделки, чем у меня сейчас позволяет время (там по 3 разных варианта ошибки на функцию)

msave/mload/mdelete

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

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

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

msave/mload/mdelete

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

msave/mload/mdelete

Posted: Sun 16 Dec, 2018 18:11
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 (или рефакторить).

msave/mload/mdelete

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

msave/mload/mdelete

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

msave/mload/mdelete

Posted: Sun 16 Dec, 2018 20:20
by John Doe
Shmuel, 1.
Или можно подумать и об изменении апи (завести новую функцию).

msave/mload/mdelete

Posted: Sun 16 Dec, 2018 20:22
by John Doe
DrKnS, местами даже есть (mf.AddExitHandler), но в данном случае речь о том, что раньше функция не бросала ошибки.

msave/mload/mdelete

Posted: Sun 14 Mar, 2021 17:25
by buniak_a_h
Сохранение поля таблицы, являющегося функцией, не предусмотрено. Поначалу я думал, что это - естественно. Но вдруг наткнулся на пару string.dump / loadstring(). И подумалось мне, что это какое-то необоснованное ограничение. Ну да, у string.dump есть ограничение(нельзя использовать upvalue). Проблема, на мой взгляд, только в том, чтобы отличить строку, сформированную string.dump-ом от обычной строки. Это никак не побороть?