msave/mload/mdelete

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

Re: msave/mload/mdelete

Post by John Doe » Sat 20 Apr, 2013 18:03

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: 12291
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 165 times

msave/mload/mdelete

Post by John Doe » Tue 21 Oct, 2014 08:13

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

Shmuel
Posts: 5791
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 210 times

msave/mload/mdelete

Post by Shmuel » Tue 21 Oct, 2014 10:07

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

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

msave/mload/mdelete

Post by John Doe » Tue 21 Oct, 2014 10:52

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

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

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

msave/mload/mdelete

Post by John Doe » Wed 22 Oct, 2014 08:04

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: 5791
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 210 times

msave/mload/mdelete

Post by Shmuel » Wed 22 Oct, 2014 08:39

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: 12291
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 165 times

msave/mload/mdelete

Post by John Doe » Sun 16 Dec, 2018 14:01

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: 5791
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 210 times

msave/mload/mdelete

Post by Shmuel » Sun 16 Dec, 2018 15:41

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

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

msave/mload/mdelete

Post by John Doe » Sun 16 Dec, 2018 16:00

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

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

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

Shmuel
Posts: 5791
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 210 times

msave/mload/mdelete

Post by Shmuel » Sun 16 Dec, 2018 16:54

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

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

msave/mload/mdelete

Post by John Doe » Sun 16 Dec, 2018 18:11

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: 5791
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 210 times

msave/mload/mdelete

Post by Shmuel » Sun 16 Dec, 2018 18:18

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

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

msave/mload/mdelete

Post by DrKnS » Sun 16 Dec, 2018 19:49

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

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

msave/mload/mdelete

Post by John Doe » Sun 16 Dec, 2018 20:20

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

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

msave/mload/mdelete

Post by John Doe » Sun 16 Dec, 2018 20:22

DrKnS, местами даже есть (mf.AddExitHandler), но в данном случае речь о том, что раньше функция не бросала ошибки.

Post Reply

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