blob: 02afe3df7396cce6c2db7c11b5fd1490dda83356 [file] [log] [blame]
############################################################# -*- c -*-
## generic include for XXX. Do not use directly.
##
## $Id$
########################################################################
@if $m2c_mark_boundary == 1@
/** START code generated by $RCSfile$ $Revision$ */
@end@
########################################################################
##//####################################################################
##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@if $m2c_processing_type eq 'h'@
int ${context}_undo_setup( ${context}_rowreq_ctx *rowreq_ctx);
int ${context}_undo_cleanup( ${context}_rowreq_ctx *rowreq_ctx);
int ${context}_undo( ${context}_rowreq_ctx *rowreq_ctx);
int ${context}_commit( ${context}_rowreq_ctx *rowreq_ctx);
int ${context}_undo_commit( ${context}_rowreq_ctx *rowreq_ctx);
@ if $m2c_irreversible_commit == 1@
int ${context}_irreversible_commit( ${context}_rowreq_ctx *rowreq_ctx);
@ end@
@end@ // m2c_processing_type eq 'h'
########################################################################
##//####################################################################
##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
##//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@if $m2c_processing_type eq 'c'@
##
## MASTER COPY OF THIS FLOWCHART IS IN agent/helpers/baby_steps.c
##
/*
* NOTE: if you update this chart, please update the versions in
* local/mib2c-conf.d/parent-set.m2i
* agent/mibgroup/helpers/baby_steps.c
* while you're at it.
*/
/*
***********************************************************************
* Baby Steps Flow Chart (2004.06.05) *
* *
* +--------------+ +================+ U = unconditional path *
* |optional state| ||required state|| S = path for success *
* +--------------+ +================+ E = path for error *
***********************************************************************
*
* +--------------+
* | pre |
* | request |
* +--------------+
* | U
@if $m2c_table_row_creation == 1@
* +-------------+ +==============+
* | row |f|<-------|| object ||
* | create |1| E || lookup ||
* +-------------+ +==============+
* E | | S | S
* | +------------------>|
* | +==============+
* | E || check ||
* |<---------------|| values ||
@else@
* +==============+
* +----------------|| object ||
* | E || lookup ||
* | +==============+
* | | S
* | +==============+
* | E || check ||
* |<---------------|| values ||
@end@ # row creation
* | +==============+
* | | S
* | +==============+
* | +<-------|| undo ||
* | | E || setup ||
* | | +==============+
* | | | S
* | | +==============+
* | | || set ||-------------------------->+
* | | || value || E |
* | | +==============+ |
* | | | S |
* | | +--------------+ |
* | | | check |-------------------------->|
* | | | consistency | E |
* | | +--------------+ |
* | | | S |
* | | +==============+ +==============+ |
* | | || commit ||-------->|| undo || |
* | | || || E || commit || |
* | | +==============+ +==============+ |
* | | | S U |<--------+
* | | +--------------+ +==============+
* | | | irreversible | || undo ||
* | | | commit | || set ||
* | | +--------------+ +==============+
* | | | U U |
* | +-------------->|<------------------------+
* | +==============+
* | || undo ||
* | || cleanup ||
* | +==============+
* +---------------------->| U
@if $m2c_table_row_creation == 1@
* |
* (err && f1)------------------->+
* | |
* +--------------+ +--------------+
* | post |<--------| row |
* | request | U | release |
* +--------------+ +--------------+
@else@
* +--------------+
* | post |
* | request |
* +--------------+
@end@ # row creation
*
*/
##----------------------------------------------------------------------
/**
* Setup up context with information needed to undo a set request.
*
* This function will be called before the individual node undo setup
* functions are called. If you need to do any undo setup that is not
* related to a specific column, you can do it here.
*
@if $m2c_undo_embed == 0@
@ if $m2c_data_init == 1@
* Note that the undo context has been allocated with
* ${context}_allocate_data(), but may need extra
* initialization similar to what you may have done in
* ${context}_rowreq_ctx_init().
@ end@
@end@
* Note that an individual node's undo_setup function will only be called
* if that node is being set to a new value.
*
* If there is any setup specific to a particular column (e.g. allocating
* memory for a string), you should do that setup in the node's undo_setup
* function, so it won't be done unless it is necessary.
*
* @param rowreq_ctx
* Pointer to the table context (${context}_rowreq_ctx)
*
* @retval MFD_SUCCESS : success
* @retval MFD_ERROR : error. set will fail.
*/
int
${context}_undo_setup( ${context}_rowreq_ctx *rowreq_ctx)
{
int rc = MFD_SUCCESS;
DEBUGMSGTL(("verbose:${context}:${context}_undo_setup","called\n"));
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != rowreq_ctx );
/*
* TODO:451:M: |-> Setup $context undo.
* set up $context undo information, in preparation for a set.
* Undo storage is in ${m2c_ctx_lh}*
*/
return rc;
} /* ${context}_undo_setup */
/**
* Undo a set request.
*
* This function will be called before the individual node undo
* functions are called. If you need to do any undo that is not
* related to a specific column, you can do it here.
*
* Note that an individual node's undo function will only be called
* if that node is being set to a new value.
*
* If there is anything specific to a particular column (e.g. releasing
* memory for a string), you should do that setup in the node's undo
* function, so it won't be done unless it is necessary.
*
* @param rowreq_ctx
* Pointer to the table context (${context}_rowreq_ctx)
*
* @retval MFD_SUCCESS : success
* @retval MFD_ERROR : error. set will fail.
*/
int
${context}_undo( ${context}_rowreq_ctx *rowreq_ctx)
{
int rc = MFD_SUCCESS;
DEBUGMSGTL(("verbose:${context}:${context}_undo","called\n"));
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != rowreq_ctx );
/*
* TODO:451:M: |-> $context undo.
* $context undo information, in response to a failed set.
* Undo storage is in ${m2c_ctx_lh}*
*/
return rc;
} /* ${context}_undo_setup */
/**
* Cleanup up context undo information.
*
* This function will be called after set/commit processing. If you
* allocated any resources in undo_setup, this is the place to release
* those resources.
*
* This function is called regardless of the success or failure of the set
* request. If you need to perform different steps for cleanup depending
* on success or failure, you can add a flag to the rowreq_ctx.
*
* @param rowreq_ctx
* Pointer to the table context (${context}_rowreq_ctx)
*
* @retval MFD_SUCCESS : success
* @retval MFD_ERROR : error
*/
int
${context}_undo_cleanup( ${context}_rowreq_ctx *rowreq_ctx)
{
int rc = MFD_SUCCESS;
DEBUGMSGTL(("verbose:${context}:${context}_undo_cleanup","called\n"));
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != rowreq_ctx );
/*
* TODO:452:M: |-> Cleanup $context undo.
* Undo storage is in ${m2c_ctx_lh}*
*/
return rc;
} /* ${context}_undo_cleanup */
##----------------------------------------------------------------------
/**
* commit new values.
*
* At this point, you should have done everything you can to ensure that
* this commit will not fail.
*
* Should you need different behavior depending on which columns were
* set, rowreq_ctx->column_set_flags will indicate which writeable columns were
* set. The definitions for the COLUMN_*_FLAG bits can be found in
@if $m2c_create_fewer_files != 1@
* ${context}_oids.h.
@else@
* ${context}.h.
@end@
* A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
*
* @param ${context}_rowreq_ctx
* Pointer to the users context.
*
* @retval MFD_SUCCESS : success
* @retval MFD_ERROR : error
*/
int
${context}_commit( ${context}_rowreq_ctx *rowreq_ctx)
{
int rc = MFD_SUCCESS;
int save_flags;
DEBUGMSGTL(("verbose:${context}:${context}_commit","called\n"));
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != rowreq_ctx );
/*
* save flags, then clear until we actually do something
*/
save_flags = rowreq_ctx->column_set_flags;
rowreq_ctx->column_set_flags = 0;
/*
* commit $context data
* 1) check the column's flag in save_flags to see if it was set.
* 2) clear the flag when you handle that column
* 3) set the column's flag in column_set_flags if it needs undo
* processing in case of a failure.
*/
@ foreach $node nonindex@
@ include m2c_setup_node.m2i@
@ if $node.settable == 0@
@ next@
@ end@
if (save_flags & COLUMN_$node.uc_FLAG) {
save_flags &= ~COLUMN_$node.uc_FLAG; /* clear $node */
/*
* TODO:482:o: |-> commit column $node.
*/
rc = -1;
if(-1 == rc) {
snmp_log(LOG_ERR,"$context column $node commit failed\n");
}
else {
/*
* set flag, in case we need to undo $node
*/
rowreq_ctx->column_set_flags |= COLUMN_$node.uc_FLAG;
}
}
@ end@ # foreach $node
/*
* if we successfully commited this row, set the dirty flag.
*/
if (MFD_SUCCESS == rc) {
rowreq_ctx->rowreq_flags |= MFD_ROW_DIRTY;
}
if (save_flags) {
snmp_log(LOG_ERR, "unhandled columns (0x%x) in commit\n", save_flags);
return MFD_ERROR;
}
return rc;
} /* ${context}_commit */
/**
* undo commit new values.
*
* Should you need different behavior depending on which columns were
* set, rowreq_ctx->column_set_flags will indicate which writeable columns were
* set. The definitions for the COLUMN_*_FLAG bits can be found in
@if $m2c_create_fewer_files != 1@
* ${context}_oids.h.
@else@
* ${context}.h.
@end@
* A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
*
* @param ${context}_rowreq_ctx
* Pointer to the users context.
*
* @retval MFD_SUCCESS : success
* @retval MFD_ERROR : error
*/
int
${context}_undo_commit( ${context}_rowreq_ctx *rowreq_ctx)
{
int rc = MFD_SUCCESS;
DEBUGMSGTL(("verbose:${context}:${context}_undo_commit","called\n"));
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != rowreq_ctx );
/*
* TODO:485:M: |-> Undo $context commit.
* check the column's flag in rowreq_ctx->column_set_flags to see
* if it was set during commit, then undo it.
*
* eg: if (rowreq_ctx->column_set_flags & COLUMN_$node.uc_FLAG) {}
*/
/*
* if we successfully un-commited this row, clear the dirty flag.
*/
if (MFD_SUCCESS == rc) {
rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY;
}
return rc;
} /* ${context}_undo_commit */
@if $m2c_irreversible_commit == 1@
##----------------------------------------------------------------------
/**
* perform commit actions that are not reversible
*
* THERE IS NO ATTEMPT AT RECOVERY FOR ERRORS FROM THIS STATE!
*
* @param ${context}_rowreq_ctx
* Pointer to the users context.
*
* @retval MFD_SUCCESS : success
* @retval MFD_ERROR : other error
*/
int
${context}_irreversible_commit( ${context}_rowreq_ctx *rowreq_ctx)
{
int rc;
DEBUGMSGTL(("verbose:${context}:${context}_irreversible_commit","called\n"));
/** we should have a non-NULL pointer */
netsnmp_assert( NULL != rowreq_ctx );
/*
* TODO:495:o: Irreversible $context commit.
*/
##$example_start
##$example_end
return MFD_SUCCESS;
} /* ${context}_irreversible_commit */
@end@ // irreversable commit
##
########################################################################
@end@ // m2c_processing_type eq 'c'
########################################################################
@if $m2c_mark_boundary == 1@
/** END code generated by $RCSfile$ $Revision$ */
@end@