summaryrefslogtreecommitdiff
path: root/local/mib2c-conf.d/mfd-data-access.m2c
blob: bcff9bbed7857badd9c9dd6b84ddf3ce29731825 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
##//#########################################################  -*- c -*-
##//generic include for XXX. Do not use directly.
##
##//$Id$
##//####################################################################
##//####################################################################
##
## lower conf files get confused with multiple processing types, so
## set single options
@eval $mfd_data_access_processing_type = "$m2c_processing_type"@
@eval $m2c_processing_type = 'h'@
@open ${name}_data_access.h@
@eval $hack = "Id"@
/*
 * Note: this file originally auto-generated by mib2c using
 *       version $Revision$ of $RCSfile$
 *
 * $$hack:$
 */
@if $m2c_mark_boundary == 1@
/** START code generated by $RCSfile$ $Revision$ */
@end@
@eval $m2c_save = "$name"@
@eval $name = "${name}_DATA_ACCESS"@
@include generic-header-top.m2i@
@eval $name = "$m2c_save"@

/* *********************************************************************
 * function declarations
 */

/* *********************************************************************
 * Table declarations
 */
@foreach $table table@
@    include m2c_setup_table.m2i@
@    include details-table.m2i@

##@    eval $m2c_tmp=""@
##@    foreach $node index@
##@      include m2c_setup_node.m2i@
##@      eval $m2c_tmp="$m2c_tmp, $m2c_node_param_val"@
##@    end@ // for each index

    int ${context}_init_data(${context}_registration * ${context}_reg);

@    include mfd-access-${m2c_table_access}-defines.m2i@
    int ${context}_row_prep( ${context}_rowreq_ctx *rowreq_ctx);

@  if ($m2c_table_row_creation == 1) || ($m2c_table_persistent == 1)@
int ${context}_validate_index( ${context}_registration * ${context}_reg,
                               ${context}_rowreq_ctx *rowreq_ctx);
@    foreach $node externalindex@
@        include m2c_setup_node.m2i@
    int ${context}_${node}_check_index( ${context}_rowreq_ctx *rowreq_ctx ); /* external */
@    end@ # foreach externalindex
@    foreach $node internalindex@
@        include m2c_setup_node.m2i@
int ${node}_check_index( ${context}_rowreq_ctx *rowreq_ctx ); /* internal */
@    end@ # foreach internalindex
@  end@ # row creation/persistent
@end@

@eval $m2c_save = "$name"@
@eval $name = "${name}_DATA_ACCESS"@
@include generic-header-bottom.m2i@
@eval $name = "$m2c_save"@
##//##################################################################
##//Do the .c file
##//##################################################################
@eval $m2c_processing_type = 'c'@
@open ${name}_data_access.c@
/*
 * Note: this file originally auto-generated by mib2c using
 *       version $Revision$ of $RCSfile$ 
 *
 * $$hack:$
 */
@include generic-source-includes.m2i@

#include "${name}_data_access.h"

/** @ingroup interface
 * @addtogroup data_access data_access: Routines to access data
 *
 * These routines are used to locate the data used to satisfy
 * requests.
 * 
 * @{
 */
@foreach $table table@
@    include m2c_setup_table.m2i@
@    include details-table.m2i@

/**
 * initialization for ${context} data access
 *
 * This function is called during startup to allow you to
 * allocate any resources you need for the data table.
 *
 * @param ${context}_reg
 *        Pointer to ${context}_registration
 *
 * @retval MFD_SUCCESS : success.
 * @retval MFD_ERROR   : unrecoverable error.
 */
int
${context}_init_data(${context}_registration * ${context}_reg)
{
    DEBUGMSGTL(("verbose:${context}:${context}_init_data","called\n"));

    /*
     * TODO:303:o: Initialize $context data.
     */
@ifconf ${table}_init_data.m2i@
@   include ${table}_init_data.m2i@
@else@
@   if $m2c_include_examples == 1@
$example_start
    /*
     * if you are the sole writer for the file, you could
     * open it here. However, as stated earlier, we are assuming
     * the worst case, which in this case means that the file is
     * written to by someone else, and might not even exist when
     * we start up. So we can't do anything here.
     */
$example_end
@   end@

    return MFD_SUCCESS;
@end@ #ifconf
} /* ${context}_init_data */

@    include mfd-access-${m2c_table_access}-defines.m2i@
/**
 * prepare row for processing.
 *
 *  When the agent has located the row for a request, this function is
 *  called to prepare the row for processing. If you fully populated
 *  the data context during the index setup phase, you may not need to
 *  do anything.
 *
 * @param rowreq_ctx pointer to a context.
 *
 * @retval MFD_SUCCESS     : success.
 * @retval MFD_ERROR       : other error.
 */
int
${context}_row_prep( ${context}_rowreq_ctx *rowreq_ctx)
{
    DEBUGMSGTL(("verbose:${context}:${context}_row_prep","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:390:o: Prepare row for request.
     * If populating row data was delayed, this is the place to
     * fill in the row for this request.
     */

    return MFD_SUCCESS;
} /* ${context}_row_prep */

##//####################################################################
@  if ($m2c_table_row_creation == 1) || ($m2c_table_persistent == 1)@
/*
 * TODO:420:r: Implement $context index validation.
 */
@    foreach $node externalindex@
@        include m2c_setup_node.m2i@
@        if $m2c_report_progress == 1@
@           print | |   +-> Processing index $node@
@        end@
@        include details-node.m2i@
/**
 * check validity of ${node} external index portion
 *
 * NOTE: this is not the place to do any checks for the sanity
 *       of multiple indexes. Those types of checks should be done in the
 *       ${context}_validate_index() function.
 *
 * @retval MFD_SUCCESS   : the incoming value is legal
 * @retval MFD_ERROR     : the incoming value is NOT legal
 */
int
${context}_${node}_check_index( ${context}_rowreq_ctx *rowreq_ctx )
{
    DEBUGMSGTL(("verbose:${context}:${context}_${node}_check_index","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:424:M: |-> Check $context external index $node.
     * check that index value in the table context (rowreq_ctx)
     * for the external index $node is legal.
     */

    return MFD_SUCCESS; /*  external index $node ok */
} /* ${context}_${node}_check_index */

@    end@ # foreach externalindex
@    foreach $node internalindex@
@        include m2c_setup_node.m2i@
@        if $m2c_report_progress == 1@
@           print | |   +-> Processing index $node@
@        end@
@        include details-node.m2i@
/**
 * check validity of ${node} index portion
 *
 * @retval MFD_SUCCESS   : the incoming value is legal
 * @retval MFD_ERROR     : the incoming value is NOT legal
 *
 * @note this is not the place to do any checks for the sanity
 *       of multiple indexes. Those types of checks should be done in the
 *       ${context}_validate_index() function.
 *
 * @note Also keep in mind that if the index refers to a row in this or
 *       some other table, you can't check for that row here to make
 *       decisions, since that row might not be created yet, but may
 *       be created during the processing this request. If you have
 *       such checks, they should be done in the check_dependencies
 *       function, because any new/deleted/changed rows should be
 *       available then.
 *
 * The following checks have already been done for you:
@if $node.enums == 1@
 *    The value is one of $m2c_evals
@elsif $node.ranges == 1@
@    if ("$node.decl" eq "long") || ("$node.decl" eq "u_long")@
@        eval $m2c_tmp_ns = "value"@
@    else@
@        eval $m2c_tmp_ns = "length"@
@    end@
 *    The $m2c_tmp_ns is in (one of) the range set(s): $m2c_evals
@end@
 *
 * If there a no other checks you need to do, simply return MFD_SUCCESS.
 */
int
${node}_check_index( ${context}_rowreq_ctx *rowreq_ctx )
{
    DEBUGMSGTL(("verbose:${context}:${node}_check_index","called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:426:M: |-> Check $context index $node.
     * check that index value in the table context is legal.
     * (rowreq_ctx->tbl_index.$node)
     */

    return MFD_SUCCESS; /* $node index ok */
} /* ${node}_check_index */

@    end@ # foreach internalindex
/**
 * verify specified index is valid.
 *
 * This check is independent of whether or not the values specified for
 * the columns of the new row are valid. Column values and row consistency
 * will be checked later. At this point, only the index values should be
 * checked.
 *
 * All of the individual index validation functions have been called, so this
 * is the place to make sure they are valid as a whole when combined. If
 * you only have one index, then you probably don't need to do anything else
 * here.
 * 
 * @note Keep in mind that if the indexes refer to a row in this or
 *       some other table, you can't check for that row here to make
 *       decisions, since that row might not be created yet, but may
 *       be created during the processing this request. If you have
 *       such checks, they should be done in the check_dependencies
 *       function, because any new/deleted/changed rows should be
 *       available then.
 *
 *
 * @param ${context}_reg
 *        Pointer to the user registration data
 * @param ${context}_rowreq_ctx
 *        Pointer to the users context.
 * @retval MFD_SUCCESS            : success
 * @retval MFD_CANNOT_CREATE_NOW  : index not valid right now
 * @retval MFD_CANNOT_CREATE_EVER : index never valid
 */
int
${context}_validate_index( ${context}_registration * ${context}_reg,
                           ${context}_rowreq_ctx *rowreq_ctx)
{
    int rc = MFD_SUCCESS;

    DEBUGMSGTL(("verbose:${context}:${context}_validate_index","called\n"));

    /** we should have a non-NULL pointer */
    netsnmp_assert( NULL != rowreq_ctx );

    /*
     * TODO:430:M: |-> Validate potential $context index.
     */
    if(1) {
        snmp_log(LOG_WARNING,"invalid index for a new row in the "
                 "${context} table.\n");
        /*
         * determine failure type.
         *
         * If the index could not ever be created, return MFD_NOT_EVER
         * If the index can not be created under the present circumstances
         * (even though it could be created under other circumstances),
         * return MFD_NOT_NOW.
         */
        if(0) {
            return MFD_CANNOT_CREATE_EVER;
        }
        else {
            return MFD_CANNOT_CREATE_NOW;
        }
    }

    return rc;
} /* ${context}_validate_index */

@  end@ # persistent/row creation
@end@
##
/** @} */
##//####################################################################
@if $m2c_mark_boundary == 1@
/** END code generated by $RCSfile$ $Revision$ */
@end@
@eval $m2c_processing_type = "$mfd_data_access_processing_type"@