#############################################################  -*- c -*-
## generic include for XXX. Do not use directly.
##
## $Id$
########################################################################
@if $m2c_mark_boundary == 1@
/** START code generated by $RCSfile$ $Revision$ */
@end@
########################################################################
## {
    /*
     * check RowStatus dependencies
     */
    if (rowreq_ctx->column_set_flags & COLUMN_$node.uc_FLAG) {
        /*
         * check for valid RowStatus transition (old, new)
         * (Note: move transition check to $node_check_value
         *  to catch errors earlier)
         */
        rc = check_rowstatus_transition( ${m2c_undo_item}$node,
                                         ${m2c_data_item}$node );
        if (MFD_SUCCESS != rc)
            return rc;
        
@if $m2c_table_row_creation == 1@
        /*
         * row creation requirements
         */
        if (rowreq_ctx->rowreq_flags & MFD_ROW_CREATED) {
            if (ROWSTATUS_DESTROY ==  ${m2c_data_item}$node) {
                rowreq_ctx->rowreq_flags |= MFD_ROW_DELETED;
            }
            else if (ROWSTATUS_CREATEANDGO ==  ${m2c_data_item}$node) {
                if ((rowreq_ctx->column_set_flags & $context.uc_REQUIRED_COLS)
                    != $context.uc_REQUIRED_COLS) {
                    DEBUGMSGTL(("${context}",
                                "required columns missing (0x%0x != 0x%0x)\n",
                                rowreq_ctx->column_set_flags, $context.uc_REQUIRED_COLS));
                    return MFD_CANNOT_CREATE_NOW;
                }
                ${m2c_data_item}$node = ROWSTATUS_ACTIVE;
            }
        } /* row creation */
        else {
@end@
            /*
             * row change requirements
             */
            /*
             * don't allow a destroy if any other value was changed, since
             * that might call data access routines with bad info.
             *
             * you may or may not require the row be notInService before it
             * can be destroyed.
             */
            if (ROWSTATUS_DESTROY == ${m2c_data_item}$node) {
@if $m2c_table_refcounts == 1@
                if (0 != rowreq_ctx->ref_count) {
                    DEBUGMSGTL(("$context",
                                "can't delete row, %d references\n",
                                rowreq_ctx->ref_count));
                    return MFD_NOT_VALID_NOW;
                }
@end@
                if (rowreq_ctx->column_set_flags & ~COLUMN_$node.uc_FLAG) {
                    DEBUGMSGTL(("$context",
                                "destroy must be only varbind for row\n"));
                    return MFD_NOT_VALID_NOW;
                }
                rowreq_ctx->rowreq_flags |= MFD_ROW_DELETED;

            } /* row destroy */
@if $m2c_table_refcounts == 1@
            else if(ROWSTATUS_NOTINSERVICE == ${m2c_data_item}$node) {
                if (0 != rowreq_ctx->ref_count) {
                    DEBUGMSGTL(("$context",
                                "can't deactivate row, %d references\n",
                                rowreq_ctx->ref_count));
                    return MFD_NOT_VALID_NOW;
                }
            } /* notInService */
@end@
@if $m2c_table_row_creation == 1@
        } /* row change */
@end@
    }
    else {
@if $m2c_table_row_creation == 1@
        /*
         * must have row status to create a row
         */
        if (rowreq_ctx->rowreq_flags & MFD_ROW_CREATED) {
            DEBUGMSGTL(("$context",
                        "must use RowStatus to create rows\n"));
            return MFD_CANNOT_CREATE_NOW;
        }
@else@
        /*
         * row creation not supported
         */
        if (rowreq_ctx->rowreq_flags & MFD_ROW_CREATED) {
            DEBUGMSGTL(("$context",
                        "row creation not supported\n"));
            return MFD_CANNOT_CREATE_EVER;
        }
@end@
    } /* row status not set */

## }
########################################################################
@if $m2c_mark_boundary == 1@
/** END code generated by $RCSfile$ $Revision$ */
@end@
