diff --git a/src/lua/trigger.cc b/src/lua/trigger.cc index a3bd8303ed135dfbb6d432f978c647a0402bb26a..8cae6a8a7f2846c78263af1fdd2c17bf8a31793e 100644 --- a/src/lua/trigger.cc +++ b/src/lua/trigger.cc @@ -58,6 +58,19 @@ lbox_trigger_find(struct lua_State *L, int index, return NULL; } +void +lbox_trigger_table(struct lua_State *L, struct rlist *list) +{ + struct trigger *trigger; + uint32_t count = 1; + lua_newtable(L); + rlist_foreach_entry_reverse(trigger, list, link) { + lua_rawgeti(L, LUA_REGISTRYINDEX, (intptr_t) trigger->data); + lua_rawseti(L, -2, count); + count++; + } +} + void lbox_trigger_check_input(struct lua_State *L, int top) { @@ -68,9 +81,11 @@ lbox_trigger_check_input(struct lua_State *L, int top) /* (nil, function) is OK, * (function, nil), is OK, * (function, function) is OK, + * no arguments is OK, * anything else is error. */ - if ((lua_isfunction(L, top) && lua_isnil(L, top - 1)) || + if ((lua_isnil(L, top) && lua_isnil(L, top - 1)) || + (lua_isfunction(L, top) && lua_isnil(L, top - 1)) || (lua_isnil(L, top) && lua_isfunction(L, top - 1)) || (lua_isfunction(L, top) && lua_isfunction(L, top - 1))) return; @@ -83,6 +98,11 @@ lbox_trigger_reset(struct lua_State *L, int top, struct rlist *list, trigger_f run) { lbox_trigger_check_input(L, top); + // if no args - return triggers table + if(lua_isnil(L, top) && lua_isnil(L, top - 1)){ + lbox_trigger_table(L, list); + return 1; + } struct trigger *trg = lbox_trigger_find(L, top, list, run); @@ -113,6 +133,8 @@ lbox_trigger_reset(struct lua_State *L, int top, /* Reference. */ trg->data = (void *) (intptr_t) luaL_ref(L, LUA_REGISTRYINDEX); + lua_rawgeti(L, LUA_REGISTRYINDEX, (intptr_t) trg->data); + return 1; } else { trigger_clear(trg); diff --git a/test/box/bad_trigger.result b/test/box/bad_trigger.result index 5740f76833df897d234d482b85063b3b325d19f3..f31568c9bc53ffaebf17434c3b8cd7aa1e1c1d0a 100644 --- a/test/box/bad_trigger.result +++ b/test/box/bad_trigger.result @@ -6,8 +6,9 @@ function f1() nosuchfunction() end --- ... -box.session.on_connect(f1) +type(box.session.on_connect(f1)) --- +- function ... greeting: True fixheader: True diff --git a/test/box/bad_trigger.test.py b/test/box/bad_trigger.test.py index 6fc55982725404b70f2d6cd77e7984c8d718250d..3615ccb9dfdff7ace242a331f6a5b5673f1d3c8d 100644 --- a/test/box/bad_trigger.test.py +++ b/test/box/bad_trigger.test.py @@ -13,7 +13,7 @@ print """ """ server.admin("function f1() nosuchfunction() end") -server.admin("box.session.on_connect(f1)") +server.admin("type(box.session.on_connect(f1))") unpacker = msgpack.Unpacker(use_list = False) diff --git a/test/box/on_replace.result b/test/box/on_replace.result index 35daaceb3337486b8423ada116855fabb470f577..8b7b5d33311cf8aed8a7a84ccef53bc5a5bbb91b 100644 --- a/test/box/on_replace.result +++ b/test/box/on_replace.result @@ -14,7 +14,7 @@ ts.on_replace() ... ts:on_replace() --- -- error: 'trigger reset: incorrect arguments' +- [] ... ts:on_replace(123) --- @@ -23,8 +23,9 @@ ts:on_replace(123) function fail(old_tuple, new_tuple) error('test') end --- ... -ts:on_replace(fail) +type(ts:on_replace(fail)) --- +- function ... ts:insert{1, 'b', 'c'} --- @@ -47,8 +48,9 @@ ts:get{1} function fail(old_tuple, new_tuple) error('abc') end --- ... -ts:on_replace(fail) +type(ts:on_replace(fail)) --- +- function ... ts:insert{2, 'b', 'c'} --- @@ -60,8 +62,9 @@ ts:get{2} function save_out(told, tnew) o = told n = tnew end --- ... -ts:on_replace(save_out, fail) +type(ts:on_replace(save_out, fail)) --- +- function ... ts:insert{2, 'a', 'b', 'c'} --- @@ -87,6 +90,14 @@ n --- - [2, 'd', 'e', 'f'] ... +type(ts:on_replace(function() test = 1 end)) +--- +- function +... +#ts:on_replace() +--- +- 2 +... ts:drop() --- ... diff --git a/test/box/on_replace.test.lua b/test/box/on_replace.test.lua index 2ec3138c2dc18ee666171bc9e487fb60bef3a83a..c67c86928748303ff98867463ea6e6b0813222a0 100644 --- a/test/box/on_replace.test.lua +++ b/test/box/on_replace.test.lua @@ -7,7 +7,7 @@ ts:on_replace() ts:on_replace(123) function fail(old_tuple, new_tuple) error('test') end -ts:on_replace(fail) +type(ts:on_replace(fail)) ts:insert{1, 'b', 'c'} ts:get{1} @@ -18,13 +18,13 @@ ts:insert{1, 'b', 'c'} ts:get{1} function fail(old_tuple, new_tuple) error('abc') end -ts:on_replace(fail) +type(ts:on_replace(fail)) ts:insert{2, 'b', 'c'} ts:get{2} function save_out(told, tnew) o = told n = tnew end -ts:on_replace(save_out, fail) +type(ts:on_replace(save_out, fail)) ts:insert{2, 'a', 'b', 'c'} o @@ -34,4 +34,6 @@ ts:replace{2, 'd', 'e', 'f'} o n +type(ts:on_replace(function() test = 1 end)) +#ts:on_replace() ts:drop() diff --git a/test/box/session.result b/test/box/session.result index dead886005596ab1d45d415b5849938099a761b8..edffc0a900c531f26410d7a848775044f5c7a4c4 100644 --- a/test/box/session.result +++ b/test/box/session.result @@ -53,30 +53,34 @@ session.peer() == session.peer(session.id()) function noop() end --- ... -session.on_connect(noop) +type(session.on_connect(noop)) --- +- function ... -session.on_disconnect(noop) +type(session.on_disconnect(noop)) --- +- function ... -- check it's possible to reset these triggers function fail() error('hear') end --- ... -session.on_connect(fail, noop) +type(session.on_connect(fail, noop)) --- +- function ... -session.on_disconnect(fail, noop) +type(session.on_disconnect(fail, noop)) --- +- function ... -- check on_connect/on_disconnect argument count and type -session.on_connect() +type(session.on_connect()) --- -- error: 'trigger reset: incorrect arguments' +- table ... -session.on_disconnect() +type(session.on_disconnect()) --- -- error: 'trigger reset: incorrect arguments' +- table ... session.on_connect(function() end, function() end) --- @@ -119,11 +123,13 @@ function dec() active_connections = active_connections - 1 end net = { box = require('net.box') } --- ... -session.on_connect(inc) +type(session.on_connect(inc)) --- +- function ... -session.on_disconnect(dec) +type(session.on_disconnect(dec)) --- +- function ... active_connections = 0 --- @@ -177,11 +183,13 @@ function audit_connect() box.space['tweedledum']:insert{session.id()} end function audit_disconnect() box.space['tweedledum']:delete{session.id()} end --- ... -session.on_connect(audit_connect) +type(session.on_connect(audit_connect)) --- +- function ... -session.on_disconnect(audit_disconnect) +type(session.on_disconnect(audit_disconnect)) --- +- function ... box.schema.user.grant('guest', 'read,write,execute', 'universe') --- diff --git a/test/box/session.test.lua b/test/box/session.test.lua index 56e5a0c35016c45117d2066664115a646b18ef90..fe68b7edc8ecd280baadf45cd3773c96c573aac5 100644 --- a/test/box/session.test.lua +++ b/test/box/session.test.lua @@ -19,17 +19,17 @@ session.peer() == session.peer(session.id()) -- check on_connect/on_disconnect triggers function noop() end -session.on_connect(noop) -session.on_disconnect(noop) +type(session.on_connect(noop)) +type(session.on_disconnect(noop)) -- check it's possible to reset these triggers function fail() error('hear') end -session.on_connect(fail, noop) -session.on_disconnect(fail, noop) +type(session.on_connect(fail, noop)) +type(session.on_disconnect(fail, noop)) -- check on_connect/on_disconnect argument count and type -session.on_connect() -session.on_disconnect() +type(session.on_connect()) +type(session.on_disconnect()) session.on_connect(function() end, function() end) session.on_disconnect(function() end, function() end) @@ -48,8 +48,8 @@ session.on_disconnect(nil, fail) function inc() active_connections = active_connections + 1 end function dec() active_connections = active_connections - 1 end net = { box = require('net.box') } -session.on_connect(inc) -session.on_disconnect(dec) +type(session.on_connect(inc)) +type(session.on_disconnect(dec)) active_connections = 0 LISTEN = require('uri').parse(box.cfg.listen) c = net.box:new(LISTEN.host, LISTEN.service) @@ -69,8 +69,8 @@ session.on_disconnect(nil, dec) -- write audit trail of connect/disconnect into a space function audit_connect() box.space['tweedledum']:insert{session.id()} end function audit_disconnect() box.space['tweedledum']:delete{session.id()} end -session.on_connect(audit_connect) -session.on_disconnect(audit_disconnect) +type(session.on_connect(audit_connect)) +type(session.on_disconnect(audit_disconnect)) box.schema.user.grant('guest', 'read,write,execute', 'universe') a = net.box:new(LISTEN.host, LISTEN.service)