/** * @retval NULL error * @retval !NULL pointer to container */ netsnmp_container* netsnmp_access_route_container_load(netsnmp_container* container, u_int load_flags) { int rc; DEBUGMSGTL(("access:route:container", "load\n")); if (NULL == container) { container = netsnmp_container_find("access:_route:fifo"); if (NULL == container) { snmp_log(LOG_ERR, "no container specified/found for access_route\n"); return NULL; } } container->container_name = strdup("_route"); rc = netsnmp_access_route_container_arch_load(container, load_flags); if (0 != rc) { netsnmp_access_route_container_free(container, NETSNMP_ACCESS_ROUTE_FREE_NOFLAGS); container = NULL; } return container; }
/** * load initial data * * TODO:350:M: Implement inetCidrRouteTable data load * This function will also be called by the cache helper to load * the container again (after the container free function has been * called to free the previous contents). * * @param container container to which items should be inserted * * @retval MFD_SUCCESS : success. * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source * @retval MFD_ERROR : other error. * * This function is called to load the index(es) (and data, optionally) * for the every row in the data set. * * @remark * While loading the data, the only important thing is the indexes. * If access to your data is cheap/fast (e.g. you have a pointer to a * structure in memory), it would make sense to update the data here. * If, however, the accessing the data invovles more work (e.g. parsing * some other existing data, or peforming calculations to derive the data), * then you can limit yourself to setting the indexes and saving any * information you will need later. Then use the saved information in * inetCidrRouteTable_row_prep() for populating data. * * @note * If you need consistency between rows (like you want statistics * for each row to be from the same time frame), you should set all * data here. * */ int inetCidrRouteTable_container_load(netsnmp_container *container) { netsnmp_container *route_container; DEBUGMSGTL(("verbose:inetCidrRouteTable:inetCidrRouteTable_container_load", "called\n")); /* * TODO:351:M: |-> Load/update data in the inetCidrRouteTable container. * loop over your inetCidrRouteTable data, allocate a rowreq context, * set the index(es) [and data, optionally] and insert into * the container. * * we use the netsnmp data access api to get the data */ route_container = netsnmp_access_route_container_load(NULL, NETSNMP_ACCESS_ROUTE_LOAD_NOFLAGS); DEBUGMSGT(("verbose:inetCidrRouteTable:inetCidrRouteTable_cache_load", "%d records\n", (int)CONTAINER_SIZE(route_container))); if (NULL == route_container) return MFD_RESOURCE_UNAVAILABLE; /* msg already logged */ /* * we just got a fresh copy of route data. snarf data */ CONTAINER_FOR_EACH(route_container, (netsnmp_container_obj_func *) _snarf_route_entry, container); /* * free the container. we've either claimed each ifentry, or released it, * so the dal function doesn't need to clear the container. */ netsnmp_access_route_container_free(route_container, NETSNMP_ACCESS_ROUTE_FREE_DONT_CLEAR); DEBUGMSGT(("verbose:inetCidrRouteTable:inetCidrRouteTable_cache_load", "%d records\n", (int)CONTAINER_SIZE(container))); return MFD_SUCCESS; } /* inetCidrRouteTable_container_load */