📄 mfd-access-container-cached-defines.m2i
字号:
@ include m2c_setup_node.m2i@@ if $m2c_node_needlength == 1@ , $node, ${node}_len@ else@ , $node@ end@@ end@ # foreach index )) { snmp_log(LOG_ERR,"error setting index while loading " "${context} cache.\n"); ${context}_release_rowreq_ctx(rowreq_ctx); continue; } /* * TODO:352:r: | |-> populate $context data context. * Populate data context here. (optionally, delay until row prep) */@if $m2c_data_transient == 0@ # persistent /* non-TRANSIENT data: no need to copy. set pointer to data */@else@ /* * TRANSIENT or semi-TRANSIENT data: * copy data or save any info needed to do it in row_prep. */@ foreach $node nonindex@@ include m2c_setup_node.m2i@ /* * setup/save data for $node * $m2c_node_summary */@ if "$m2c_data_context" eq "generated"@@ eval $m2c_ctx_lh = "$m2c_ctx_rh"@@ eval $m2c_ctx_lhs = "$m2c_ctx_rhs"@@ eval $m2c_ctx_rh = "$node"@@ eval $m2c_ctx_rhs = "${node}_len"@@ include generic-value-map.m2i@ @ end@ # data_context ! generated@ end@ // for each@end@ # transient /* * insert into table container */ CONTAINER_INSERT(container, rowreq_ctx); ++count; }@if $m2c_include_examples == 1@$example_start if(NULL != filep) fclose(filep);$example_end@end@ # example DEBUGMSGT(("verbose:${context}:${context}_cache_load", "inserted %d records\n", count)); return MFD_SUCCESS;} /* ${context}_cache_load *//** * cache clean up * * @param container container with all current items * * This optional callback is called prior to all * item's being removed from the container. If you * need to do any processing before that, do it here. * * @note * The MFD helper will take care of releasing all the row contexts.@ if ($m2c_data_allocate == 1) && ($m2c_data_transient == 0)@ * If you did not pass a data context pointer when allocating * the rowreq context, the one that was allocated will be deleted. * If you did pass one in, it will not be deleted and that memory * is your responsibility.@ end@ * */void${context}_cache_free(netsnmp_container *container){ DEBUGMSGTL(("verbose:${context}:${context}_cache_free","called\n")); /* * TODO:380:M: Free $context cache. */} /* ${context}_cache_free */@end@ // m2c_processing_type eq 'c'##########################################################################//######################################################################//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@if $m2c_processing_type eq 'i'@/** * @internal */static int_cache_load(netsnmp_cache *cache, void *vmagic){ DEBUGMSGTL(("internal:${context}:_cache_load","called\n")); if((NULL == cache) || (NULL == cache->magic)) { snmp_log(LOG_ERR, "invalid cache for ${context}_cache_load\n"); return -1; } /** should only be called for an invalid or expired cache */ netsnmp_assert((0 == cache->valid) || (1 == cache->expired)); /* * call user code */ return ${context}_cache_load((netsnmp_container*)cache->magic);} /* _cache_load *//** * @internal */static void_cache_item_free(${context}_rowreq_ctx *rowreq_ctx, void *context){ DEBUGMSGTL(("internal:${context}:_cache_item_free","called\n")); if(NULL == rowreq_ctx) return; ${context}_release_rowreq_ctx(rowreq_ctx);} /* _cache_item_free *//** * @internal */static void_cache_free(netsnmp_cache *cache, void *magic){ netsnmp_container *container; DEBUGMSGTL(("internal:${context}:_cache_free","called\n")); if((NULL == cache) || (NULL == cache->magic)) { snmp_log(LOG_ERR, "invalid cache in ${context}_cache_free\n"); return; } container = (netsnmp_container*)cache->magic; /* * call user code */ ${context}_cache_free(container); /* * free all items. inefficient, but easy. */ CONTAINER_CLEAR(container, (netsnmp_container_obj_func *)_cache_item_free, NULL);} /* _cache_free *//** * @internal * initialize the iterator container with functions or wrappers */void_${context}_container_init(${context}_interface_ctx *if_ctx){ DEBUGMSGTL(("internal:${context}:_${context}_container_init","called\n")); @ if 0@ /* * find cache */ if_ctx->cache = netsnmp_cache_find_by_oid(PARTNER_oid, OID_LENGTH(PARTNER_oid));@ else@ /* * set up the cache */ if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */ _cache_load, _cache_free, ${context}_oid, ${context}_oid_size);@ end@ // shared cache if(NULL == if_ctx->cache) { snmp_log(LOG_ERR, "error creating cache for ${context}\n"); return; } if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET; ${context}_container_init(&if_ctx->container, if_ctx->cache); if(NULL == if_ctx->container) if_ctx->container = netsnmp_container_find("${context}:table_container"); if(NULL == if_ctx->container) { snmp_log(LOG_ERR,"error creating container in " "${context}_container_init\n"); return; } if_ctx->cache->magic = (void*)if_ctx->container;} /* _${context}_container_init */@end@ // m2c_processing_type eq 'i'##########################################################################//######################################################################//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@if $m2c_processing_type eq 'r'@## container-cached summary ------------------------ The container-cached data access code is for cases when you want to cache your data in the agent/sub-agent. ... to be continued...######################################################################## Updating the Index ------------------ TODO : update index for the raw data FUNC : ${context}_indexes_set WHERE: ${context}_data_access.c This is a convenience function for setting the index context from the native C data. Where necessary, value mapping should be done. @if $mfd_readme_verbose == 1@ This function should update the table index values (found in tbl_idx) for the given raw data. @end@@end@ // m2c_processing_type eq 'r'##########################################################################//####################################################################@if $m2c_mark_boundary == 1@/** END code generated by $RCSfile: mfd-access-container-cached-defines.m2i,v $ $Revision: 1.16.2.1 $ */@end@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -