@ -48,6 +48,7 @@ static void *sorcery_memory_retrieve_fields(const struct ast_sorcery *sorcery, v
static void sorcery_memory_retrieve_multiple ( const struct ast_sorcery * sorcery , void * data , const char * type , struct ao2_container * objects ,
static void sorcery_memory_retrieve_multiple ( const struct ast_sorcery * sorcery , void * data , const char * type , struct ao2_container * objects ,
const struct ast_variable * fields ) ;
const struct ast_variable * fields ) ;
static void sorcery_memory_retrieve_regex ( const struct ast_sorcery * sorcery , void * data , const char * type , struct ao2_container * objects , const char * regex ) ;
static void sorcery_memory_retrieve_regex ( const struct ast_sorcery * sorcery , void * data , const char * type , struct ao2_container * objects , const char * regex ) ;
static void sorcery_memory_retrieve_prefix ( const struct ast_sorcery * sorcery , void * data , const char * type , struct ao2_container * objects , const char * prefix , const size_t prefix_len ) ;
static int sorcery_memory_update ( const struct ast_sorcery * sorcery , void * data , void * object ) ;
static int sorcery_memory_update ( const struct ast_sorcery * sorcery , void * data , void * object ) ;
static int sorcery_memory_delete ( const struct ast_sorcery * sorcery , void * data , void * object ) ;
static int sorcery_memory_delete ( const struct ast_sorcery * sorcery , void * data , void * object ) ;
static void sorcery_memory_close ( void * data ) ;
static void sorcery_memory_close ( void * data ) ;
@ -60,6 +61,7 @@ static struct ast_sorcery_wizard memory_object_wizard = {
. retrieve_fields = sorcery_memory_retrieve_fields ,
. retrieve_fields = sorcery_memory_retrieve_fields ,
. retrieve_multiple = sorcery_memory_retrieve_multiple ,
. retrieve_multiple = sorcery_memory_retrieve_multiple ,
. retrieve_regex = sorcery_memory_retrieve_regex ,
. retrieve_regex = sorcery_memory_retrieve_regex ,
. retrieve_prefix = sorcery_memory_retrieve_prefix ,
. update = sorcery_memory_update ,
. update = sorcery_memory_update ,
. delete = sorcery_memory_delete ,
. delete = sorcery_memory_delete ,
. close = sorcery_memory_close ,
. close = sorcery_memory_close ,
@ -76,6 +78,12 @@ struct sorcery_memory_fields_cmp_params {
/*! \brief Regular expression for checking object id */
/*! \brief Regular expression for checking object id */
regex_t * regex ;
regex_t * regex ;
/*! \brief Prefix for matching object id */
const char * prefix ;
/*! \brief Prefix length in bytes for matching object id */
const size_t prefix_len ;
/*! \brief Optional container to put object into */
/*! \brief Optional container to put object into */
struct ao2_container * container ;
struct ao2_container * container ;
} ;
} ;
@ -127,6 +135,11 @@ static int sorcery_memory_fields_cmp(void *obj, void *arg, int flags)
ao2_link ( params - > container , obj ) ;
ao2_link ( params - > container , obj ) ;
}
}
return 0 ;
return 0 ;
} else if ( params - > prefix ) {
if ( ! strncmp ( params - > prefix , ast_sorcery_object_get_id ( obj ) , params - > prefix_len ) ) {
ao2_link ( params - > container , obj ) ;
}
return 0 ;
} else if ( params - > fields & &
} else if ( params - > fields & &
( ! ( objset = ast_sorcery_objectset_create ( params - > sorcery , obj ) ) | |
( ! ( objset = ast_sorcery_objectset_create ( params - > sorcery , obj ) ) | |
( ! ast_variable_lists_match ( objset , params - > fields , 0 ) ) ) ) {
( ! ast_variable_lists_match ( objset , params - > fields , 0 ) ) ) ) {
@ -200,6 +213,18 @@ static void sorcery_memory_retrieve_regex(const struct ast_sorcery *sorcery, voi
regfree ( & expression ) ;
regfree ( & expression ) ;
}
}
static void sorcery_memory_retrieve_prefix ( const struct ast_sorcery * sorcery , void * data , const char * type , struct ao2_container * objects , const char * prefix , const size_t prefix_len )
{
struct sorcery_memory_fields_cmp_params params = {
. sorcery = sorcery ,
. container = objects ,
. prefix = prefix ,
. prefix_len = prefix_len ,
} ;
ao2_callback ( data , 0 , sorcery_memory_fields_cmp , & params ) ;
}
static int sorcery_memory_update ( const struct ast_sorcery * sorcery , void * data , void * object )
static int sorcery_memory_update ( const struct ast_sorcery * sorcery , void * data , void * object )
{
{
RAII_VAR ( void * , existing , NULL , ao2_cleanup ) ;
RAII_VAR ( void * , existing , NULL , ao2_cleanup ) ;