@@ -204,13 +204,19 @@ static z_result_t _z_trigger_queryables_inner(_z_session_rc_t *zsrc, _z_msg_quer
204
204
uint32_t qid ) {
205
205
_z_session_t * zn = _Z_RC_IN_VAL (zsrc );
206
206
_z_queryable_cache_data_t qle_infos = _z_queryable_cache_data_null ();
207
- qle_infos .ke_in = _z_keyexpr_alias (q_key );
207
+ qle_infos .ke_in = _z_keyexpr_steal (q_key );
208
208
// Retrieve sub infos
209
- _Z_RETURN_IF_ERR (_z_session_queryable_get_infos (zn , & qle_infos ));
209
+ _Z_CLEAN_RETURN_IF_ERR (_z_session_queryable_get_infos (zn , & qle_infos ), _z_keyexpr_clear (& qle_infos .ke_in );
210
+ _z_value_clear (& msgq -> _ext_value ); _z_bytes_drop (& msgq -> _ext_attachment );
211
+ _z_slice_clear (& msgq -> _parameters ););
210
212
// Check if there are queryables
211
213
_Z_DEBUG ("Triggering %ju queryables for key %d - %.*s" , (uintmax_t )qle_infos .qle_nb , qle_infos .ke_out ._id ,
212
214
(int )_z_string_len (& qle_infos .ke_out ._suffix ), _z_string_data (& qle_infos .ke_out ._suffix ));
213
215
if (qle_infos .qle_nb == 0 ) {
216
+ _z_keyexpr_clear (& qle_infos .ke_in );
217
+ _z_value_clear (& msgq -> _ext_value );
218
+ _z_bytes_drop (& msgq -> _ext_attachment );
219
+ _z_slice_clear (& msgq -> _parameters );
214
220
_z_keyexpr_clear (& qle_infos .ke_out );
215
221
#if Z_FEATURE_RX_CACHE == 0
216
222
_z_queryable_infos_svec_release (& qle_infos .infos ); // Otherwise it's released with cache
@@ -238,34 +244,30 @@ static z_result_t _z_trigger_queryables_inner(_z_session_rc_t *zsrc, _z_msg_quer
238
244
239
245
z_result_t ret = _Z_RES_OK ;
240
246
// Parse session_queryable svec
241
- for (size_t i = 1 ; i < qle_infos .qle_nb ; i ++ ) {
242
- _z_query_rc_t query_copy ;
243
- ret = _z_query_rc_copy (& query_copy , & query );
244
- if (ret != _Z_RES_OK ) {
245
- break ;
246
- }
247
+ for (size_t i = 0 ; i < qle_infos .qle_nb ; i ++ ) {
247
248
_z_queryable_infos_t * qle_info = _z_queryable_infos_svec_get (& qle_infos .infos , i );
248
- qle_info -> callback (& query_copy , qle_info -> arg );
249
- _z_query_rc_drop (& query_copy );
249
+ if (i + 1 == qle_infos .qle_nb ) {
250
+ qle_info -> callback (& query , qle_info -> arg );
251
+ } else {
252
+ _z_query_rc_t query_copy ;
253
+ ret = _z_query_rc_copy (& query_copy , & query );
254
+ if (ret != _Z_RES_OK ) {
255
+ break ;
256
+ }
257
+ qle_info -> callback (& query_copy , qle_info -> arg );
258
+ _z_query_rc_drop (& query_copy );
259
+ }
250
260
}
251
-
252
- _z_queryable_infos_t * qle_info = _z_queryable_infos_svec_get (& qle_infos .infos , 0 );
253
- qle_info -> callback (& query , qle_info -> arg );
254
261
_z_query_rc_drop (& query );
255
262
#if Z_FEATURE_RX_CACHE == 0
256
263
_z_queryable_infos_svec_release (& qle_infos .infos ); // Otherwise it's released with cache
257
264
#endif
265
+ _z_keyexpr_clear (& qle_infos .ke_in );
258
266
return ret ;
259
267
}
260
268
261
269
z_result_t _z_trigger_queryables (_z_session_rc_t * zsrc , _z_msg_query_t * msgq , _z_keyexpr_t * q_key , uint32_t qid ) {
262
- z_result_t ret = _z_trigger_queryables_inner (zsrc , msgq , q_key , qid );
263
- // Clean up
264
- _z_keyexpr_clear (q_key );
265
- _z_value_clear (& msgq -> _ext_value );
266
- _z_bytes_drop (& msgq -> _ext_attachment );
267
- _z_slice_clear (& msgq -> _parameters );
268
- return ret ;
270
+ return _z_trigger_queryables_inner (zsrc , msgq , q_key , qid );
269
271
}
270
272
271
273
void _z_unregister_session_queryable (_z_session_t * zn , _z_session_queryable_rc_t * qle ) {
0 commit comments