-
Notifications
You must be signed in to change notification settings - Fork 378
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow to return not only tuples from C functions #4641
Comments
We should also provide an ability to send pushes ( |
Gerold103
added a commit
that referenced
this issue
Mar 8, 2020
Port_c is a new descendant of struct port. It is used now for public C functions to store their result. Currently they can return only a tuple, but it will change soon, they will be able to return arbitrary MessagePack. Port_tuple is not removed, because still is used for box_select(), for functional indexes, and in SQL as a base for port_sql. Although that may be changed later. Functional indexes really need only a single MessagePack object from their function. While box_select() working via port_tuple or port_c didn't show any significant difference during micro benchmarks. Part of #4641
Gerold103
added a commit
that referenced
this issue
Mar 8, 2020
Closes #4641 @TarantoolBot document Title: box_return_mp() public C function Stored C functions could return a result only via `box_return_tuple()` function. That made users create a tuple every time they wanted to return something from a C function. Now public C API offers another way to return - `box_return_mp()`. It allows to return arbitrary MessagePack, not wrapped into a tuple object. This is simpler to use for small results like a number, boolean, or a short string. Besides, `box_return_mp()` is much faster than `box_return_tuple()`, especially for small MessagePack. Note, that it is faster only if an alternative is to create a tuple by yourself. If an already existing tuple was obtained from an iterator, and you want to return it, then of course it is faster to return via `box_return_tuple()`, than via extraction of tuple data, and calling `box_return_mp()`. Here is the function declaration from module.h: ```C /** * Return MessagePack from a stored C procedure. The MessagePack * is copied, so it is safe to free/reuse the passed arguments * after the call. * MessagePack is not validated, for the sake of speed. It is * expected to be a single encoded object. An attempt to encode * and return multiple objects without wrapping them into an * MP_ARRAY or MP_MAP is undefined behaviour. * * \param ctx An opaque structure passed to the stored C procedure * by Tarantool. * \param mp Begin of MessagePack. * \param mp_end End of MessagePack. * \retval -1 Error. * \retval 0 Success. */ API_EXPORT int box_return_mp(box_function_ctx_t *ctx, const char *mp, const char *mp_end); ```
This was referenced Apr 7, 2020
Gerold103
added a commit
that referenced
this issue
Apr 23, 2020
Port_c is a new descendant of struct port. It is used now for public C functions to store their result. Currently they can return only a tuple, but it will change soon, they will be able to return arbitrary MessagePack. Port_tuple is not removed, because still is used for box_select(), for functional indexes, and in SQL as a base for port_sql. Although that may be changed later. Functional indexes really need only a single MessagePack object from their function. While box_select() working via port_tuple or port_c didn't show any significant difference during micro benchmarks. Part of #4641
Gerold103
added a commit
that referenced
this issue
Apr 23, 2020
Closes #4641 @TarantoolBot document Title: box_return_mp() public C function Stored C functions could return a result only via `box_return_tuple()` function. That made users create a tuple every time they wanted to return something from a C function. Now public C API offers another way to return - `box_return_mp()`. It allows to return arbitrary MessagePack, not wrapped into a tuple object. This is simpler to use for small results like a number, boolean, or a short string. Besides, `box_return_mp()` is much faster than `box_return_tuple()`, especially for small MessagePack. Note, that it is faster only if an alternative is to create a tuple by yourself. If an already existing tuple was obtained from an iterator, and you want to return it, then of course it is faster to return via `box_return_tuple()`, than via extraction of tuple data, and calling `box_return_mp()`. Here is the function declaration from module.h: ```C /** * Return MessagePack from a stored C procedure. The MessagePack * is copied, so it is safe to free/reuse the passed arguments * after the call. * MessagePack is not validated, for the sake of speed. It is * expected to be a single encoded object. An attempt to encode * and return multiple objects without wrapping them into an * MP_ARRAY or MP_MAP is undefined behaviour. * * \param ctx An opaque structure passed to the stored C procedure * by Tarantool. * \param mp Begin of MessagePack. * \param mp_end End of MessagePack. * \retval -1 Error. * \retval 0 Success. */ API_EXPORT int box_return_mp(box_function_ctx_t *ctx, const char *mp, const char *mp_end); ```
Gerold103
added a commit
that referenced
this issue
Apr 23, 2020
Port_tuple is exactly the same as port_c, but is not able to store raw MessagePack. I theory it sounds like port_tuple should be a bit simpler and therefore faster, but in fact it is not. Microbenchmarks didn't reveal any difference. So port_tuple is no longer needed, all its functionality is covered by port_c. Follow up #4641
Gerold103
added a commit
that referenced
this issue
Apr 24, 2020
Port_c is a new descendant of struct port. It is used now for public C functions to store their result. Currently they can return only a tuple, but it will change soon, they will be able to return arbitrary MessagePack. Port_tuple is not removed, because still is used for box_select(), for functional indexes, and in SQL as a base for port_sql. Although that may be changed later. Functional indexes really need only a single MessagePack object from their function. While box_select() working via port_tuple or port_c didn't show any significant difference during micro benchmarks. Part of #4641
Gerold103
added a commit
that referenced
this issue
Apr 24, 2020
Closes #4641 @TarantoolBot document Title: box_return_mp() public C function Stored C functions could return a result only via `box_return_tuple()` function. That made users create a tuple every time they wanted to return something from a C function. Now public C API offers another way to return - `box_return_mp()`. It allows to return arbitrary MessagePack, not wrapped into a tuple object. This is simpler to use for small results like a number, boolean, or a short string. Besides, `box_return_mp()` is much faster than `box_return_tuple()`, especially for small MessagePack. Note, that it is faster only if an alternative is to create a tuple by yourself. If an already existing tuple was obtained from an iterator, and you want to return it, then of course it is faster to return via `box_return_tuple()`, than via extraction of tuple data, and calling `box_return_mp()`. Here is the function declaration from module.h: ```C /** * Return MessagePack from a stored C procedure. The MessagePack * is copied, so it is safe to free/reuse the passed arguments * after the call. * MessagePack is not validated, for the sake of speed. It is * expected to be a single encoded object. An attempt to encode * and return multiple objects without wrapping them into an * MP_ARRAY or MP_MAP is undefined behaviour. * * \param ctx An opaque structure passed to the stored C procedure * by Tarantool. * \param mp Begin of MessagePack. * \param mp_end End of MessagePack. * \retval -1 Error. * \retval 0 Success. */ API_EXPORT int box_return_mp(box_function_ctx_t *ctx, const char *mp, const char *mp_end); ```
Gerold103
added a commit
that referenced
this issue
Apr 24, 2020
Port_tuple is exactly the same as port_c, but is not able to store raw MessagePack. I theory it sounds like port_tuple should be a bit simpler and therefore faster, but in fact it is not. Microbenchmarks didn't reveal any difference. So port_tuple is no longer needed, all its functionality is covered by port_c. Follow up #4641
Gerold103
added a commit
that referenced
this issue
Apr 26, 2020
Port_tuple is exactly the same as port_c, but is not able to store raw MessagePack. In theory it sounds like port_tuple should be a bit simpler and therefore faster, but in fact it is not. Microbenchmarks didn't reveal any difference. So port_tuple is no longer needed, all its functionality is covered by port_c. Follow up #4641
kyukhin
pushed a commit
that referenced
this issue
Apr 28, 2020
Port_c is a new descendant of struct port. It is used now for public C functions to store their result. Currently they can return only a tuple, but it will change soon, they will be able to return arbitrary MessagePack. Port_tuple is not removed, because still is used for box_select(), for functional indexes, and in SQL as a base for port_sql. Although that may be changed later. Functional indexes really need only a single MessagePack object from their function. While box_select() working via port_tuple or port_c didn't show any significant difference during micro benchmarks. Part of #4641
kyukhin
pushed a commit
that referenced
this issue
Apr 28, 2020
Port_tuple is exactly the same as port_c, but is not able to store raw MessagePack. In theory it sounds like port_tuple should be a bit simpler and therefore faster, but in fact it is not. Microbenchmarks didn't reveal any difference. So port_tuple is no longer needed, all its functionality is covered by port_c. Follow up #4641
ligurio
pushed a commit
that referenced
this issue
Jul 22, 2020
Port_c is a new descendant of struct port. It is used now for public C functions to store their result. Currently they can return only a tuple, but it will change soon, they will be able to return arbitrary MessagePack. Port_tuple is not removed, because still is used for box_select(), for functional indexes, and in SQL as a base for port_sql. Although that may be changed later. Functional indexes really need only a single MessagePack object from their function. While box_select() working via port_tuple or port_c didn't show any significant difference during micro benchmarks. Part of #4641
ligurio
pushed a commit
that referenced
this issue
Jul 22, 2020
Closes #4641 @TarantoolBot document Title: box_return_mp() public C function Stored C functions could return a result only via `box_return_tuple()` function. That made users create a tuple every time they wanted to return something from a C function. Now public C API offers another way to return - `box_return_mp()`. It allows to return arbitrary MessagePack, not wrapped into a tuple object. This is simpler to use for small results like a number, boolean, or a short string. Besides, `box_return_mp()` is much faster than `box_return_tuple()`, especially for small MessagePack. Note, that it is faster only if an alternative is to create a tuple by yourself. If an already existing tuple was obtained from an iterator, and you want to return it, then of course it is faster to return via `box_return_tuple()`, than via extraction of tuple data, and calling `box_return_mp()`. Here is the function declaration from module.h: ```C /** * Return MessagePack from a stored C procedure. The MessagePack * is copied, so it is safe to free/reuse the passed arguments * after the call. * MessagePack is not validated, for the sake of speed. It is * expected to be a single encoded object. An attempt to encode * and return multiple objects without wrapping them into an * MP_ARRAY or MP_MAP is undefined behaviour. * * \param ctx An opaque structure passed to the stored C procedure * by Tarantool. * \param mp Begin of MessagePack. * \param mp_end End of MessagePack. * \retval -1 Error. * \retval 0 Success. */ API_EXPORT int box_return_mp(box_function_ctx_t *ctx, const char *mp, const char *mp_end); ```
ligurio
pushed a commit
that referenced
this issue
Jul 22, 2020
Port_tuple is exactly the same as port_c, but is not able to store raw MessagePack. In theory it sounds like port_tuple should be a bit simpler and therefore faster, but in fact it is not. Microbenchmarks didn't reveal any difference. So port_tuple is no longer needed, all its functionality is covered by port_c. Follow up #4641
avtikhon
pushed a commit
that referenced
this issue
Aug 28, 2020
Port_c is a new descendant of struct port. It is used now for public C functions to store their result. Currently they can return only a tuple, but it will change soon, they will be able to return arbitrary MessagePack. Port_tuple is not removed, because still is used for box_select(), for functional indexes, and in SQL as a base for port_sql. Although that may be changed later. Functional indexes really need only a single MessagePack object from their function. While box_select() working via port_tuple or port_c didn't show any significant difference during micro benchmarks. Part of #4641 (cherry picked from commit 4c3c9bd)
avtikhon
pushed a commit
that referenced
this issue
Aug 28, 2020
Port_tuple is exactly the same as port_c, but is not able to store raw MessagePack. In theory it sounds like port_tuple should be a bit simpler and therefore faster, but in fact it is not. Microbenchmarks didn't reveal any difference. So port_tuple is no longer needed, all its functionality is covered by port_c. Follow up #4641 (cherry picked from commit 4d82478)
kyukhin
pushed a commit
that referenced
this issue
Aug 31, 2020
Port_c is a new descendant of struct port. It is used now for public C functions to store their result. Currently they can return only a tuple, but it will change soon, they will be able to return arbitrary MessagePack. Port_tuple is not removed, because still is used for box_select(), for functional indexes, and in SQL as a base for port_sql. Although that may be changed later. Functional indexes really need only a single MessagePack object from their function. While box_select() working via port_tuple or port_c didn't show any significant difference during micro benchmarks. Part of #4641 (cherry picked from commit 4c3c9bd)
kyukhin
pushed a commit
that referenced
this issue
Aug 31, 2020
Port_tuple is exactly the same as port_c, but is not able to store raw MessagePack. In theory it sounds like port_tuple should be a bit simpler and therefore faster, but in fact it is not. Microbenchmarks didn't reveal any difference. So port_tuple is no longer needed, all its functionality is covered by port_c. Follow up #4641 (cherry picked from commit 4d82478)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Currently, it's possible to return only a set of tuples from C functions (box_return_tuple). Please, add more serializer to return arbitrary msgpack.
The text was updated successfully, but these errors were encountered: