Тема: библиотека lua_share (обмен данными между скриптами lua)
данная либа - альтернатива StaticVar. не то, чтобы она мне не нравилась, просто возникла идея использовать отдельный стейт луа в качестве хранилища, что позволяет делать с ним разные прикольные штуки. в том числе, обмениваться данными между несколькими терминалами QUIK.
собранная либа тут: [url]https://www.dropbox.com/s/7safwoyyuwxl2gr/lua_share_binaries.zip?dl=1[/url]
публичный репозиторий на гитхабе: [url]https://github.com/untoxa/lua_share[/url]
пожелания? предложения? welcome, в каменты.
ОПИСАНИЕ:
========
комплект состоит из библиотеки lua_share.dll и файла lua_share_boot.lua, который должен находиться в том же каталоге. если файл lua_share_boot.lua отсутствует, то библиотека ведет себя несколько иначе, но тоже работает, о чем ниже.
инициализация:
-------------------
package.cpath = getScriptPath() .. "\\lua_share.dll"
sh = require "share"
запись и чтение:
-------------------
sh["hello"] = "world" -- запись
val = sh["hello"] -- чтение
пространства имен:
-----------------------
local ns = sh.GetNameSpace("test_name_space") -- создать пространство имен test_name_space
ns["hello"] = "world" -- запись
val = ns["hello"] -- чтение
получение снапшота:
-------------------------
local ns = sh.GetNameSpace("test_name_space") -- создать пространство имен test_name_space
ns["hello"] = "hello" -- 1 значение
ns["world"] = "world" -- 2 значение
val = ns:DeepCopy() -- получение снапшота
"bootstrap":
-------------
файл lua_share_boot.lua содержит код, который кастомизирует поведение хранилища. в текущей реализации реализовано сравнение таблиц-ключей по содержимому. например:
local ns = sh.GetNameSpace("test_name_space")
ns[{1, 2, {3, 4}}] = "{1, 2, {3, 4}}"
ns[{1, 2, {3, 4}}] = "{1, 2, {3, 4}} overwrite"
tmp = ns[{1, 2, {3, 4}}]
если файл lua_share_boot.lua существует, то в результате значение tmp будет содержать только строку "{1, 2, {3, 4}} overwrite", иначе обе строки: "{1, 2, {3, 4}}" и "{1, 2, {3, 4}} overwrite", так как ключ {1, 2, {3, 4}} - это всегда копия, а по-умолчанию сравниваются ссылки.
в lua_share_boot.lua можно запрограммировать свое поведение, а так же добавить свои метаметоды, например __gc. см комментарии в коде lua.
IPC:
-----
есть возможность создавать "удаленное" пространство имен, общие для нескольких запущенных приложений (терминалов QUIK). для этого необходимо запустить сервер lua_share_server.exe, который хранит общие данные. сервер запускает lua-скрипт, который хранится в файле lua_share_server.lua и который можно, при желании, кастомизировать. общее хранилище существует, пока запущен сервер.
удаленное пространство имен создается следующим образом:
local ns = sh.GetIPCNameSpace("test_name_space")
способ работы с ним не отличается.