📄 mfd-access-container-cached-defines.m2i
字号:
rowreq_ctx = ${context}_allocate_rowreq_ctx($m2c_tmp); if (NULL == rowreq_ctx) { snmp_log(LOG_ERR, "memory allocation failed\n"); return MFD_RESOURCE_UNAVAILABLE; } if(MFD_SUCCESS != ${context}_indexes_set(rowreq_ctx@ foreach $node index@@ 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} data.\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}_container_load", "inserted %d records\n", count)); return MFD_SUCCESS;} /* ${context}_container_load *//** * container 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}_container_free(netsnmp_container *container){ DEBUGMSGTL(("verbose:${context}:${context}_container_free","called\n")); /* * TODO:380:M: Free $context container data. */} /* ${context}_container_free */@end@ // m2c_processing_type eq 'c'##########################################################################//######################################################################//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@if $m2c_processing_type eq 'i'@@ if $m2c_data_cache == 1@static void _container_free(netsnmp_container *container);/** * @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}_container_load((netsnmp_container*)cache->magic);} /* _cache_load *//** * @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; _container_free(container);} /* _cache_free */@ end@ # cache/** * @internal */static void_container_item_free(${context}_rowreq_ctx *rowreq_ctx, void *context){ DEBUGMSGTL(("internal:${context}:_container_item_free","called\n")); if(NULL == rowreq_ctx) return; ${context}_release_rowreq_ctx(rowreq_ctx);} /* _container_item_free *//** * @internal */static void_container_free(netsnmp_container *container){ DEBUGMSGTL(("internal:${context}:_container_free","called\n")); if (NULL == container) { snmp_log(LOG_ERR, "invalid container in ${context}_container_free\n"); return; } /* * call user code */ ${context}_container_free(container); /* * free all items. inefficient, but easy. */ CONTAINER_CLEAR(container, (netsnmp_container_obj_func *)_container_item_free, NULL);} /* _container_free *//** * @internal * initialize the container with functions or wrappers */void_${context}_container_init(${context}_interface_ctx *if_ctx){ DEBUGMSGTL(("internal:${context}:_${context}_container_init","called\n"));@ if $m2c_data_cache == 1@ /* * cache init */@ if 0@ if_ctx->cache = netsnmp_cache_find_by_oid(PARTNER_oid, OID_LENGTH(PARTNER_oid));@ else@ 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);@ else@ /* * container init */ ${context}_container_init(&if_ctx->container);@ end@ data 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 $m2c_data_cache == 1@ if (NULL != if_ctx->cache) if_ctx->cache->magic = (void*)if_ctx->container;@ end@} /* _${context}_container_init *//** * @internal * shutdown the container with functions or wrappers */void_${context}_container_shutdown(${context}_interface_ctx *if_ctx){ DEBUGMSGTL(("internal:${context}:_${context}_container_shutdown","called\n")); ${context}_container_shutdown(if_ctx->container); _container_free(if_ctx->container);} /* _${context}_container_shutdown */@end@ // m2c_processing_type eq 'i'##########################################################################//######################################################################//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@if $m2c_processing_type eq 'r'@## container summary ------------------------ The container data access code is for cases when you want to store your data in the agent/sub-agent. ... to be continued...@ if $m2c_data_cache == 1@ cache 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...@ end@@end@ // m2c_processing_type eq 'r'##########################################################################//####################################################################@if $m2c_mark_boundary == 1@/** END code generated by $RCSfile$ $Revision: 14170 $ */@end@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -