summaryrefslogtreecommitdiff
path: root/RDBMS-MIB_src/rdbmsDbTable
diff options
context:
space:
mode:
authorJoshua Tolley2010-11-26 17:22:01 +0000
committerJoshua Tolley2010-11-26 17:22:01 +0000
commitfe9d8f21bbdfb442b8233b4627a0c67dc458a8bd (patch)
treea88daa49fc47e64777af3d331cf142e0604c2d48 /RDBMS-MIB_src/rdbmsDbTable
Import from CVSHEADmaster
Diffstat (limited to 'RDBMS-MIB_src/rdbmsDbTable')
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.c124
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.h220
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.c377
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.h64
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.c763
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.h66
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.c517
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.h77
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_enums.h47
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.c1238
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.h50
-rw-r--r--RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_oids.h46
12 files changed, 3589 insertions, 0 deletions
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.c b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.c
new file mode 100644
index 0000000..aac7c37
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.c
@@ -0,0 +1,124 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable.c
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable.c,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "pgsnmpd.h"
+
+/* include our parent header */
+#include "rdbmsDbTable.h"
+#include "rdbmsDbTable_interface.h"
+
+oid rdbmsDbTable_oid[] = { RDBMSDBTABLE_OID };
+int rdbmsDbTable_oid_size = OID_LENGTH(rdbmsDbTable_oid);
+
+void initialize_table_rdbmsDbTable(void);
+
+
+/**
+ * Initializes the rdbmsDbTable module
+ */
+void
+init_rdbmsDbTable(void)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:init_rdbmsDbTable","called\n"));
+
+ /*
+ * TODO:300:o: Perform rdbmsDbTable one-time module initialization.
+ */
+
+ /*
+ * here we initialize all the tables we're planning on supporting
+ */
+ if (should_init("rdbmsDbTable"))
+ initialize_table_rdbmsDbTable();
+
+} /* init_rdbmsDbTable */
+
+/**
+ * Initialize the table rdbmsDbTable
+ * (Define its contents and how it's structured)
+ */
+void
+initialize_table_rdbmsDbTable(void)
+{
+ rdbmsDbTable_registration_ptr user_context;
+ u_long flags;
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:initialize_table_rdbmsDbTable","called\n"));
+
+ /*
+ * TODO:301:o: Perform rdbmsDbTable one-time table initialization.
+ */
+
+ /*
+ * TODO:302:o: |->Initialize rdbmsDbTable user context
+ * if you'd like to pass in a pointer to some data for this
+ * table, allocate or set it up here.
+ */
+ /*
+ * a netsnmp_data_list is a simple way to store void pointers. A simple
+ * string token is used to add, find or remove pointers.
+ */
+ user_context = netsnmp_create_data_list("rdbmsDbTable", NULL, NULL);
+
+ /*
+ * No support for any flags yet, but in the future you would
+ * set any flags here.
+ */
+ flags = 0;
+
+ /*
+ * call interface initialization code
+ */
+ _rdbmsDbTable_initialize_interface(user_context, flags);
+} /* initialize_table_rdbmsDbTable */
+
+/**
+ * pre-request callback
+ *
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error
+ */
+int
+rdbmsDbTable_pre_request(rdbmsDbTable_registration_ptr user_context)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_pre_request","called\n"));
+
+ /*
+ * TODO:510:o: Perform rdbmsDbTable pre-request actions.
+ */
+
+ return MFD_SUCCESS;
+} /* rdbmsDbTable_pre_request */
+
+/**
+ * post-request callback
+ *
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error (ignored)
+ */
+int
+rdbmsDbTable_post_request(rdbmsDbTable_registration_ptr user_context)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_post_request","called\n"));
+
+ /*
+ * TODO:511:o: Perform rdbmsDbTable pos-request actions.
+ */
+
+ return MFD_SUCCESS;
+} /* rdbmsDbTable_post_request */
+
+
+/** @{ */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.h b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.h
new file mode 100644
index 0000000..1dbdbe2
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable.h
@@ -0,0 +1,220 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable.h
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable.h,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RDBMSDBTABLE_H
+#define RDBMSDBTABLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** @defgroup misc misc: Miscelaneous routines
+ *
+ * @{
+ */
+#include <net-snmp/library/asn1.h>
+
+/* other required module components */
+ /* *INDENT-OFF* */
+config_require(RDBMS-MIB/rdbmsDbTable/rdbmsDbTable_interface);
+config_require(RDBMS-MIB/rdbmsDbTable/rdbmsDbTable_data_access);
+config_require(RDBMS-MIB/rdbmsDbTable/rdbmsDbTable_data_get);
+config_require(RDBMS-MIB/rdbmsDbTable/rdbmsDbTable_data_set);
+ /* *INDENT-ON* */
+
+/* OID and column number definitions for */
+#include "rdbmsDbTable_oids.h"
+
+/* enum definions */
+#include "rdbmsDbTable_enums.h"
+
+/* *********************************************************************
+ * function declarations
+ */
+void init_rdbmsDbTable(void);
+
+/* *********************************************************************
+ * Table declarations
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+/* *********************************************************************
+ * When you register your mib, you get to provide a generic
+ * pointer that will be passed back to you for most of the
+ * functions calls.
+ *
+ * TODO:100:r: Review all context structures
+ */
+ /*
+ * TODO:101:o: |-> Review rdbmsDbTable registration context.
+ */
+typedef netsnmp_data_list * rdbmsDbTable_registration_ptr;
+
+/**********************************************************************/
+/*
+ * TODO:110:r: |-> Review rdbmsDbTable data context structure.
+ * This structure is used to represent the data for rdbmsDbTable.
+ */
+/*
+ * This structure contains storage for all the columns defined in the
+ * rdbmsDbTable.
+ */
+typedef struct rdbmsDbTable_data_s {
+
+ /*
+ * rdbmsDbPrivateMibOID(2)/OBJECTID/ASN_OBJECT_ID/oid(oid)//L/A/w/e/r/d/h
+ */
+ oid rdbmsDbPrivateMibOID[128];
+size_t rdbmsDbPrivateMibOID_len; /* # of oid elements, not bytes */
+
+ /*
+ * rdbmsDbVendorName(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+ */
+ char rdbmsDbVendorName[255];
+size_t rdbmsDbVendorName_len; /* # of char elements, not bytes */
+
+ /*
+ * rdbmsDbName(4)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H
+ */
+ char rdbmsDbName[255];
+size_t rdbmsDbName_len; /* # of char elements, not bytes */
+
+ /*
+ * rdbmsDbContact(5)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H
+ */
+ char rdbmsDbContact[255];
+size_t rdbmsDbContact_len; /* # of char elements, not bytes */
+
+} rdbmsDbTable_data;
+
+
+/* *********************************************************************
+ * TODO:115:o: |-> Review rdbmsDbTable undo context.
+ * We're just going to use the same data structure for our
+ * undo_context. If you want to do something more efficent,
+ * define your typedef here.
+ */
+typedef rdbmsDbTable_data rdbmsDbTable_undo_data;
+
+/*
+ * TODO:120:r: |-> Review rdbmsDbTable mib index.
+ * This structure is used to represent the index for rdbmsDbTable.
+ */
+typedef struct rdbmsDbTable_mib_index_s {
+
+ /*
+ * rdbmsDbIndex(1)/INTEGER/ASN_INTEGER/long(long)//l/a/w/e/R/d/h
+ */
+ long rdbmsDbIndex;
+
+
+} rdbmsDbTable_mib_index;
+
+ /*
+ * TODO:121:r: | |-> Review rdbmsDbTable max index length.
+ * If you KNOW that your indexes will never exceed a certain
+ * length, update this macro to that length.
+*/
+#define MAX_rdbmsDbTable_IDX_LEN 1
+
+
+/* *********************************************************************
+ * TODO:130:o: |-> Review rdbmsDbTable Row request (rowreq) context.
+ * When your functions are called, you will be passed a
+ * rdbmsDbTable_rowreq_ctx pointer.
+ */
+typedef struct rdbmsDbTable_rowreq_ctx_s {
+
+ /** this must be first for container compare to work */
+ netsnmp_index oid_idx;
+ oid oid_tmp[MAX_rdbmsDbTable_IDX_LEN];
+
+ rdbmsDbTable_mib_index tbl_idx;
+
+ rdbmsDbTable_data data;
+ rdbmsDbTable_undo_data * undo;
+ unsigned int column_set_flags; /* flags for set columns */
+
+
+ /*
+ * flags per row. Currently, the first (lower) 8 bits are reserved
+ * for the user. See mfd.h for other flags.
+ */
+ u_int rowreq_flags;
+
+ /*
+ * implementor's context pointer (provided during registration)
+ */
+ rdbmsDbTable_registration_ptr rdbmsDbTable_reg;
+
+ /*
+ * TODO:131:o: | |-> Add useful data to rdbmsDbTable rowreq context.
+ */
+
+ /*
+ * storage for future expansion
+ */
+ netsnmp_data_list *rdbmsDbTable_data_list;
+
+} rdbmsDbTable_rowreq_ctx;
+
+typedef struct rdbmsDbTable_ref_rowreq_ctx_s {
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx;
+} rdbmsDbTable_ref_rowreq_ctx;
+
+/* *********************************************************************
+ * function prototypes
+ */
+ int rdbmsDbTable_pre_request(rdbmsDbTable_registration_ptr user_context);
+ int rdbmsDbTable_post_request(rdbmsDbTable_registration_ptr user_context);
+
+ int rdbmsDbTable_check_dependencies(rdbmsDbTable_rowreq_ctx * rowreq_ctx);
+ int rdbmsDbTable_commit(rdbmsDbTable_rowreq_ctx * rowreq_ctx);
+
+ void initialize_table_rdbmsDbTable(void);
+
+extern oid rdbmsDbTable_oid[];
+extern int rdbmsDbTable_oid_size;
+
+
+#include "rdbmsDbTable_interface.h"
+#include "rdbmsDbTable_data_access.h"
+#include "rdbmsDbTable_data_get.h"
+#include "rdbmsDbTable_data_set.h"
+
+/*
+ * DUMMY markers, ignore
+ *
+ * TODO:099:x: *************************************************************
+ * TODO:199:x: *************************************************************
+ * TODO:299:x: *************************************************************
+ * TODO:399:x: *************************************************************
+ * TODO:499:x: *************************************************************
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RDBMSDBTABLE_H */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.c b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.c
new file mode 100644
index 0000000..d15c924
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.c
@@ -0,0 +1,377 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_data_access.c
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_data_access.c,v 1.5 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "pgsnmpd.h"
+
+/* include our parent header */
+#include "rdbmsDbTable.h"
+#include "rdbmsDbTable_data_access.h"
+
+/** @defgroup data_access data_access: Routines to access data
+ *
+ * These routines are used to locate the data used to satisfy
+ * requests.
+ *
+ * @{
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+
+/**
+ * initialization for rdbmsDbTable data access
+ *
+ * This function is called during startup to allow you to
+ * allocate any resources you need for the data table.
+ *
+ * @param rdbmsDbTable_reg
+ * Pointer to rdbmsDbTable_registration
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : unrecoverable error.
+ */
+int
+rdbmsDbTable_init_data(rdbmsDbTable_registration_ptr rdbmsDbTable_reg)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_init_data","called\n"));
+
+ return MFD_SUCCESS;
+} /* rdbmsDbTable_init_data */
+
+/**
+ * container-cached overview
+ *
+ */
+
+/***********************************************************************
+ *
+ * cache
+ *
+ ***********************************************************************/
+/**
+ * container initialization
+ *
+ * @param container_ptr_ptr A pointer to a container pointer. If you
+ * create a custom container, use this parameter to return it
+ * to the MFD helper. If set to NULL, the MFD helper will
+ * allocate a container for you.
+ * @param cache A pointer to a cache structure. You can set the timeout
+ * and other cache flags using this pointer.
+ *
+ * This function is called at startup to allow you to customize certain
+ * aspects of the access method. For the most part, it is for advanced
+ * users. The default code should suffice for most cases. If no custom
+ * container is allocated, the MFD code will create one for your.
+ *
+ * This is also the place to set up cache behavior. The default, to
+ * simply set the cache timeout, will work well with the default
+ * container. If you are using a custom container, you may want to
+ * look at the cache helper documentation to see if there are any
+ * flags you want to set.
+ *
+ * @remark
+ * This would also be a good place to do any initialization needed
+ * for you data source. For example, opening a connection to another
+ * process that will supply the data, opening a database, etc.
+ */
+void
+rdbmsDbTable_container_init(netsnmp_container **container_ptr_ptr,
+ netsnmp_cache *cache)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_container_init","called\n"));
+
+ if((NULL == cache) || (NULL == container_ptr_ptr)) {
+ snmp_log(LOG_ERR,"bad params to rdbmsDbTable_container_init\n");
+ return;
+ }
+
+ /*
+ * For advanced users, you can use a custom container. If you
+ * do not create one, one will be created for you.
+ */
+ *container_ptr_ptr = NULL;
+
+ /*
+ * TODO:345:A: Set up rdbmsDbTable cache properties.
+ *
+ * Also for advanced users, you can set parameters for the
+ * cache. Do not change the magic pointer, as it is used
+ * by the MFD helper. To completely disable caching, set
+ * cache->enabled to 0.
+ */
+ cache->timeout = RDBMSDBTABLE_CACHE_TIMEOUT; /* seconds */
+
+ /* JWT-TODO: Initialize cache with cache->flags here */
+} /* rdbmsDbTable_container_init */
+
+/**
+ * load cache data
+ *
+ * TODO:350:M: Implement rdbmsDbTable cache load
+ *
+ * @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 cache the index(es) (and data, optionally)
+ * for the every row in the data set.
+ *
+ * @remark
+ * While loading the cache, 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
+ * rdbmsDbTable_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
+rdbmsDbTable_cache_load(netsnmp_container *container)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx;
+ oid rdbmsDbPrivateMibOID[128] = { 1,3,6,1,4,1,27645 };
+ int i, resultCount, errorcode = MFD_SUCCESS, tmpInt;
+ PGresult *pg_db_qry, *pgsnmpd_tbl_qry;
+ char *tmpString, *db_oid, *vendor_name, *contact_name;
+ int vendor_name_len, contact_name_len;
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_cache_load","called\n"));
+
+ /*
+ * TODO:351:M: |-> Load/update data in the rdbmsDbTable container.
+ * loop over your rdbmsDbTable data, allocate a rowreq context,
+ * set the index(es) [and data, optionally] and insert into
+ * the container. */
+
+ if (PQstatus(dbconn) == CONNECTION_OK)
+ pg_db_qry = PQexec(dbconn, "SELECT oid, datname FROM pg_database");
+ else {
+ snmp_log(LOG_ERR, "Can't get connected to the database");
+ return MFD_RESOURCE_UNAVAILABLE;
+ }
+ if (PQresultStatus(pg_db_qry) != PGRES_TUPLES_OK) {
+ snmp_log(LOG_ERR, "Didn't get any results from the database");
+ PQclear(pg_db_qry);
+ /*PQfinish(dbconn); */
+ /* It's probably an error if I didn't find *any* databases */
+ return MFD_RESOURCE_UNAVAILABLE;
+ }
+
+ resultCount = PQntuples(pg_db_qry);
+
+ for (i = 0; i < resultCount; i++) {
+
+ /*
+ * TODO:352:M: | |-> set indexes in new rdbmsDbTable rowreq context.
+ */
+ rowreq_ctx = rdbmsDbTable_allocate_rowreq_ctx();
+ if (NULL == rowreq_ctx) {
+ snmp_log(LOG_ERR, "memory allocation failed\n");
+ errorcode = MFD_RESOURCE_UNAVAILABLE;
+ break;
+ }
+ db_oid = PQgetvalue(pg_db_qry, i, 0);
+ if(MFD_SUCCESS != rdbmsDbTable_indexes_set(rowreq_ctx
+ ,atol(db_oid)
+ )) {
+ snmp_log(LOG_ERR,"error setting index while loading "
+ "rdbmsDbTable cache.\n");
+ rdbmsDbTable_release_rowreq_ctx(rowreq_ctx);
+ continue;
+ }
+
+ /*
+ * TODO:352:r: | |-> populate rdbmsDbTable data context.
+ * Populate data context here. (optionally, delay until row prep)
+ */
+
+ rowreq_ctx->data.rdbmsDbPrivateMibOID_len = 128;
+ rowreq_ctx->data.rdbmsDbVendorName_len = 255;
+ rowreq_ctx->data.rdbmsDbName_len = 255;
+ rowreq_ctx->data.rdbmsDbContact_len = 255;
+
+ contact_name = NULL;
+ contact_name_len = 0;
+ vendor_name = NULL;
+ vendor_name_len = 0;
+
+ /* Note that this queries pgsnmpd_rdbmsDbTable once per database. This could
+ * be more efficient by only querying once if it can't find the table (being
+ * sure that the table didn't exist, as opposed to simply an entry for that
+ * database not existing in the table). It could also be rewritten so that
+ * only one query is issued, joining pg_database and pgsnmpd_rdbmsDbTable, but
+ * that would have to be smart enough to know of the pgsnmpd table existed
+ * and not do the join if it didn't */
+ pgsnmpd_tbl_qry = NULL;
+ tmpInt = sizeof("SELECT vendor_name, contact_name FROM pgsnmpd_rdbmsDbTable WHERE database_oid = ") + sizeof(*db_oid);
+ tmpString = calloc(tmpInt, sizeof(char*));
+ if (tmpString == NULL) snmp_log(LOG_ERR, "Couldn't allocate memory to query pgsnmpd-specific database table\n");
+ else {
+ snmp_log(LOG_INFO, "Gathering rdbmsDbTable information from pgsnmpd_rdbmsDbTable\n");
+ snprintf(tmpString, sizeof(char*) * tmpInt, "SELECT vendor_name, contact_name FROM pgsnmpd_rdbmsDbTable WHERE database_oid = %s", db_oid);
+ pgsnmpd_tbl_qry = PQexec(dbconn, tmpString);
+ /* Ignore errors so that pgsnmpd will run without this table being available */
+ if (PQresultStatus(pgsnmpd_tbl_qry) == PGRES_TUPLES_OK && PQntuples(pgsnmpd_tbl_qry) > 0) {
+ vendor_name = PQgetvalue(pgsnmpd_tbl_qry, 0, 0);
+ vendor_name_len = strlen(vendor_name);
+ contact_name = PQgetvalue(pgsnmpd_tbl_qry, 0, 1);
+ contact_name_len = strlen(contact_name);
+ }
+ /* Note that this error is INFO level, instead of something higher, because we're designed to work without this table */
+ else snmp_log(LOG_INFO, "Unable to find relevant data in pgsnmpd_rdbmsDbTable\n");
+ }
+
+ /*
+ * TODO:246:r: |-> Define rdbmsDbPrivateMibOID mapping.
+ * Map values between raw/native values and MIB values
+ *
+ * if(MFD_SUCCESS !=
+ * rdbmsDbPrivateMibOID_map(&rowreq_ctx->data.rdbmsDbPrivateMibOID, &rowreq_ctx->data.rdbmsDbPrivateMibOID_len,
+ * rdbmsDbPrivateMibOID, rdbmsDbPrivateMibOID_len, 0)) {
+ * return MFD_ERROR;
+ * }
+ */
+ if ((NULL == rowreq_ctx->data.rdbmsDbPrivateMibOID) ||
+ (rowreq_ctx->data.rdbmsDbPrivateMibOID_len < (1 * sizeof(rowreq_ctx->data.rdbmsDbPrivateMibOID[0])))) {
+ snmp_log(LOG_ERR,"not enough space for rdbmsDbTable.rdbmsDbPrivateMibOID value.\n");
+ errorcode = MFD_ERROR;
+ break;
+ }
+ rowreq_ctx->data.rdbmsDbPrivateMibOID_len = 8;
+ rdbmsDbPrivateMibOID[7] = (oid) atoi(PQgetvalue(pg_db_qry, i, 0));
+ memcpy( rowreq_ctx->data.rdbmsDbPrivateMibOID, rdbmsDbPrivateMibOID, 8 * sizeof(rdbmsDbPrivateMibOID[0]));
+
+ /*
+ * TODO:246:r: |-> Define rdbmsDbVendorName mapping.
+ */
+ if ((NULL == rowreq_ctx->data.rdbmsDbVendorName) ||
+ (rowreq_ctx->data.rdbmsDbVendorName_len < (10 * sizeof(rowreq_ctx->data.rdbmsDbVendorName[0])))) {
+ snmp_log(LOG_ERR,"not enough space for rdbmsDbTable.rdbmsDbVendorName value\n");
+ errorcode = MFD_ERROR;
+ break;
+ }
+ rowreq_ctx->data.rdbmsDbVendorName_len = vendor_name_len;
+ memcpy( rowreq_ctx->data.rdbmsDbVendorName, vendor_name, vendor_name_len);
+
+ /*
+ * TODO:246:r: |-> Define rdbmsDbName mapping.
+ */
+ if ((NULL == rowreq_ctx->data.rdbmsDbName) ||
+ (rowreq_ctx->data.rdbmsDbName_len < (100 * sizeof(rowreq_ctx->data.rdbmsDbName[0])))) {
+ snmp_log(LOG_ERR,"not enough space for rdbmsDbTable.rdbmsDbName value\n");
+ errorcode = MFD_ERROR;
+ break;
+ }
+ tmpString = PQgetvalue(pg_db_qry, i, 1);
+ rowreq_ctx->data.rdbmsDbName_len = strlen(tmpString) * sizeof(rowreq_ctx->data.rdbmsDbName[0]);
+ strncpy(rowreq_ctx->data.rdbmsDbName, tmpString, rowreq_ctx->data.rdbmsDbName_len);
+
+ /*
+ * TODO:246:r: |-> Define rdbmsDbContact mapping.
+ */
+ if ((NULL == rowreq_ctx->data.rdbmsDbContact) ||
+ (rowreq_ctx->data.rdbmsDbContact_len < (100 * sizeof(rowreq_ctx->data.rdbmsDbContact[0])))) {
+ snmp_log(LOG_ERR,"not enough space for rdbmsDbTable.rdbmsDbContact value\n");
+ errorcode = MFD_ERROR;
+ break;
+ }
+ rowreq_ctx->data.rdbmsDbContact_len = contact_name_len;
+ memcpy( rowreq_ctx->data.rdbmsDbContact, contact_name, contact_name_len);
+
+
+ /*
+ * insert into table container
+ */
+ CONTAINER_INSERT(container, rowreq_ctx);
+
+ if (pgsnmpd_tbl_qry != NULL) PQclear(pgsnmpd_tbl_qry);
+ }
+
+ DEBUGMSGT(("verbose:rdbmsDbTable:rdbmsDbTable_cache_load",
+ "inserted some records\n"));
+
+ PQclear(pg_db_qry);
+ return errorcode;
+} /* rdbmsDbTable_cache_load */
+
+/**
+ * cache 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.
+ *
+ */
+void
+rdbmsDbTable_cache_free(netsnmp_container *container)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_cache_free","called\n"));
+
+ /*
+ * TODO:380:M: Free rdbmsDbTable cache.
+ */
+} /* rdbmsDbTable_cache_free */
+
+/**
+ * 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
+rdbmsDbTable_row_prep( rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_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;
+} /* rdbmsDbTable_row_prep */
+
+/** @} */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.h b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.h
new file mode 100644
index 0000000..cdf1cac
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_access.h
@@ -0,0 +1,64 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_data_access.h
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_data_access.h,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RDBMSDBTABLE_DATA_ACCESS_H
+#define RDBMSDBTABLE_DATA_ACCESS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* *********************************************************************
+ * function declarations
+ */
+
+/* *********************************************************************
+ * Table declarations
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+
+
+ int rdbmsDbTable_init_data(rdbmsDbTable_registration_ptr rdbmsDbTable_reg);
+
+
+/*
+ * TODO:180:o: Review rdbmsDbTable cache timeout.
+ * The number of seconds before the cache times out
+ */
+#define RDBMSDBTABLE_CACHE_TIMEOUT 60
+
+void rdbmsDbTable_container_init(netsnmp_container **container_ptr_ptr,
+ netsnmp_cache *cache);
+int rdbmsDbTable_cache_load(netsnmp_container *container);
+void rdbmsDbTable_cache_free(netsnmp_container *container);
+
+int rdbmsDbTable_row_prep( rdbmsDbTable_rowreq_ctx *rowreq_ctx);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RDBMSDBTABLE_DATA_ACCESS_H */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.c b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.c
new file mode 100644
index 0000000..b6a7207
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.c
@@ -0,0 +1,763 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_data_get.c
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_data_get.c,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "pgsnmpd.h"
+
+/* include our parent header */
+#include "rdbmsDbTable.h"
+
+
+/** @defgroup data_get data_get: Routines to get data
+ *
+ * TODO:230:M: Implement rdbmsDbTable get routines.
+ * TODO:240:M: Implement rdbmsDbTable mapping routines (if any).
+ *
+ * These routine are used to get the value for individual objects. The
+ * row context is passed, along with a pointer to the memory where the
+ * value should be copied.
+ *
+ * @{
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+
+/* ---------------------------------------------------------------------
+ * TODO:200:r: Implement rdbmsDbTable data context functions.
+ */
+
+/*---------------------------------------------------------------------
+ * RDBMS-MIB::rdbmsDbEntry.rdbmsDbIndex
+ * rdbmsDbIndex is subid 1 of rdbmsDbEntry.
+ * Its status is Current, and its access level is NoAccess.
+ * OID: .1.3.6.1.2.1.39.1.1.1.1
+ * Description:
+A numeric index, unique among all the databases from all
+ products on this host. This value is a surrogate for the
+ conceptually unique key, which is {PrivateMibOID,
+ databasename}
+ *
+ * Attributes:
+ * accessible 0 isscalar 0 enums 0 hasdefval 0
+ * readable 0 iscolumn 1 ranges 1 hashint 0
+ * settable 0
+ *
+ * Ranges: 1 - 2147483647;
+ *
+ * Its syntax is INTEGER (based on perltype INTEGER)
+ * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
+ *
+ *
+ *
+ * NOTE: NODE rdbmsDbIndex IS NOT ACCESSIBLE
+ *
+ *
+ */
+/**
+ * map a value from its original native format to the MIB format.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : Any other error
+ *
+ * @note parameters follow the memset convention (dest, src).
+ *
+ * @note generation and use of this function can be turned off by re-running
+ * mib2c after adding the following line to the file
+ * default-node-rdbmsDbIndex.m2d :
+ * @eval $m2c_node_skip_mapping = 1@
+ *
+ * @remark
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them here.
+ * Otherwise, just do a direct copy.
+ */
+int
+rdbmsDbIndex_map(long *mib_rdbmsDbIndex_val_ptr, long raw_rdbmsDbIndex_val)
+{
+ netsnmp_assert(NULL != mib_rdbmsDbIndex_val_ptr);
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbIndex_map","called\n"));
+
+ /*
+ * TODO:241:o: |-> Implement rdbmsDbIndex mapping.
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them here.
+ */
+ (*mib_rdbmsDbIndex_val_ptr) = raw_rdbmsDbIndex_val;
+
+ return MFD_SUCCESS;
+} /* rdbmsDbIndex_map */
+
+
+/**
+ * set mib index(es)
+ *
+ * @param tbl_idx mib index structure
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error.
+ *
+ * @remark
+ * This convenience function is useful for setting all the MIB index
+ * components with a single function call. It is assume that the C values
+ * have already been mapped from their native/rawformat to the MIB format.
+ */
+int
+rdbmsDbTable_indexes_set_tbl_idx(rdbmsDbTable_mib_index *tbl_idx, long rdbmsDbIndex_val)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_indexes_set_tbl_idx","called\n"));
+
+ /* rdbmsDbIndex(1)/INTEGER/ASN_INTEGER/long(long)//l/a/w/e/R/d/h */
+ tbl_idx->rdbmsDbIndex = rdbmsDbIndex_val;
+
+
+ return MFD_SUCCESS;
+} /* rdbmsDbTable_indexes_set_tbl_idx */
+
+/**
+ * @internal
+ * set row context indexes
+ *
+ * @param reqreq_ctx the row context that needs updated indexes
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error.
+ *
+ * @remark
+ * This function sets the mib indexs, then updates the oid indexs
+ * from the mib index.
+ */
+int
+rdbmsDbTable_indexes_set(rdbmsDbTable_rowreq_ctx *rowreq_ctx, long rdbmsDbIndex_val)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_indexes_set","called\n"));
+
+ if(MFD_SUCCESS != rdbmsDbTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx
+ , rdbmsDbIndex_val
+ ))
+ return MFD_ERROR;
+
+ /*
+ * convert mib index to oid index
+ */
+ rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
+ if(0 != rdbmsDbTable_index_to_oid(&rowreq_ctx->oid_idx,
+ &rowreq_ctx->tbl_idx)) {
+ return MFD_ERROR;
+ }
+
+ return MFD_SUCCESS;
+} /* rdbmsDbTable_indexes_set */
+
+
+/*---------------------------------------------------------------------
+ * RDBMS-MIB::rdbmsDbEntry.rdbmsDbPrivateMibOID
+ * rdbmsDbPrivateMibOID is subid 2 of rdbmsDbEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.39.1.1.1.2
+ * Description:
+The authoritative identification for the private MIB for
+ this database, presumably based on the vendor, e.g., {
+ enterprises 111 <optional subidentifiers>} for Oracle
+ databases, {enterprises 757 <optional subidentifiers>} for
+ Ingres databases, { enterprises 897 <optional
+ subidentifiers>} for Sybase databases, etc.
+
+ If no OBJECT IDENTIFIER exists for the private MIB, attempts
+
+ to access this object will return noSuchName (SNMPv1)
+ or noSuchInstance (SNMPv2).
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is OBJECTID (based on perltype OBJECTID)
+ * The net-snmp type is ASN_OBJECT_ID. The C type decl is oid (oid)
+ * This data type requires a length. (Max 2147483647)
+ */
+/**
+ * map a value from its original native format to the MIB format.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : Any other error
+ *
+ * @note parameters follow the memset convention (dest, src).
+ *
+ * @note generation and use of this function can be turned off by re-running
+ * mib2c after adding the following line to the file
+ * default-node-rdbmsDbPrivateMibOID.m2d :
+ * @eval $m2c_node_skip_mapping = 1@
+ *
+ * @remark
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them here.
+ * Otherwise, just do a direct copy.
+ */
+int
+rdbmsDbPrivateMibOID_map(oid **mib_rdbmsDbPrivateMibOID_val_ptr_ptr, size_t *mib_rdbmsDbPrivateMibOID_val_ptr_len_ptr,
+ oid *raw_rdbmsDbPrivateMibOID_val_ptr, size_t raw_rdbmsDbPrivateMibOID_val_ptr_len, int allow_realloc)
+{
+ int converted_len;
+
+ netsnmp_assert(NULL != raw_rdbmsDbPrivateMibOID_val_ptr);
+ netsnmp_assert((NULL != mib_rdbmsDbPrivateMibOID_val_ptr_ptr) && (NULL != mib_rdbmsDbPrivateMibOID_val_ptr_len_ptr));
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbPrivateMibOID_map","called\n"));
+
+ /*
+ * TODO:241:r: |-> Implement rdbmsDbPrivateMibOID non-integer mapping
+ * it is hard to autogenerate code for mapping types that are not simple
+ * integers, so here is an idea of what you might need to do. It will
+ * probably need some tweaking to get right.
+ */
+ /*
+ * if the length of the raw data doesn't directly correspond with
+ * the length of the mib data, set converted_len to the
+ * space required.
+ */
+ converted_len = raw_rdbmsDbPrivateMibOID_val_ptr_len; /* assume equal */
+ if((NULL == *mib_rdbmsDbPrivateMibOID_val_ptr_ptr) || (*mib_rdbmsDbPrivateMibOID_val_ptr_len_ptr < converted_len)) {
+ if(! allow_realloc) {
+ snmp_log(LOG_ERR,"not enough space for value mapping\n");
+ return SNMP_ERR_GENERR;
+ }
+ *mib_rdbmsDbPrivateMibOID_val_ptr_ptr = realloc( *mib_rdbmsDbPrivateMibOID_val_ptr_ptr, converted_len * sizeof(**mib_rdbmsDbPrivateMibOID_val_ptr_ptr));
+ if(NULL == *mib_rdbmsDbPrivateMibOID_val_ptr_ptr) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return SNMP_ERR_GENERR;
+ }
+ }
+ *mib_rdbmsDbPrivateMibOID_val_ptr_len_ptr = converted_len;
+ memcpy( *mib_rdbmsDbPrivateMibOID_val_ptr_ptr, raw_rdbmsDbPrivateMibOID_val_ptr, converted_len );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbPrivateMibOID_map */
+
+/**
+ * Extract the current value of the rdbmsDbPrivateMibOID data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param rdbmsDbPrivateMibOID_val_ptr_ptr
+ * Pointer to storage for a oid variable
+ * @param rdbmsDbPrivateMibOID_val_ptr_len_ptr
+ * Pointer to a size_t. On entry, it will contain the size (in bytes)
+ * pointed to by rdbmsDbPrivateMibOID.
+ * On exit, this value should contain the data size (in bytes).
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+*
+ * @note If you need more than (*rdbmsDbPrivateMibOID_val_ptr_len_ptr) bytes of memory,
+ * allocate it using malloc() and update rdbmsDbPrivateMibOID_val_ptr_ptr.
+ * <b>DO NOT</b> free the previous pointer.
+ * The MFD helper will release the memory you allocate.
+ *
+ * @remark If you call this function yourself, you are responsible
+ * for checking if the pointer changed, and freeing any
+ * previously allocated memory. (Not necessary if you pass
+ * in a pointer to static memory, obviously.)
+ */
+int
+rdbmsDbPrivateMibOID_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, oid **rdbmsDbPrivateMibOID_val_ptr_ptr, size_t *rdbmsDbPrivateMibOID_val_ptr_len_ptr )
+{
+ /** we should have a non-NULL pointer and enough storage */
+ netsnmp_assert( (NULL != rdbmsDbPrivateMibOID_val_ptr_ptr) && (NULL != *rdbmsDbPrivateMibOID_val_ptr_ptr));
+ netsnmp_assert( NULL != rdbmsDbPrivateMibOID_val_ptr_len_ptr );
+
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbPrivateMibOID_get","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+/*
+ * TODO:231:o: |-> Extract the current value of the rdbmsDbPrivateMibOID data.
+ * set (* rdbmsDbPrivateMibOID_val_ptr_ptr ) and (* rdbmsDbPrivateMibOID_val_ptr_len_ptr ) from rowreq_ctx->data
+ */
+ /*
+ * make sure there is enough space for rdbmsDbPrivateMibOID data
+ */
+ if ((NULL == (* rdbmsDbPrivateMibOID_val_ptr_ptr )) ||
+ ((* rdbmsDbPrivateMibOID_val_ptr_len_ptr ) < (rowreq_ctx->data.rdbmsDbPrivateMibOID_len * sizeof((* rdbmsDbPrivateMibOID_val_ptr_ptr )[0])))) {
+ /*
+ * allocate space for rdbmsDbPrivateMibOID data
+ */
+ (* rdbmsDbPrivateMibOID_val_ptr_ptr ) = malloc(rowreq_ctx->data.rdbmsDbPrivateMibOID_len * sizeof((* rdbmsDbPrivateMibOID_val_ptr_ptr )[0]));
+ if(NULL == (* rdbmsDbPrivateMibOID_val_ptr_ptr )) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return MFD_ERROR;
+ }
+ }
+ (* rdbmsDbPrivateMibOID_val_ptr_len_ptr ) = rowreq_ctx->data.rdbmsDbPrivateMibOID_len * sizeof((* rdbmsDbPrivateMibOID_val_ptr_ptr )[0]);
+ memcpy( (* rdbmsDbPrivateMibOID_val_ptr_ptr ), rowreq_ctx->data.rdbmsDbPrivateMibOID, (* rdbmsDbPrivateMibOID_val_ptr_len_ptr ) );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbPrivateMibOID_get */
+
+/*---------------------------------------------------------------------
+ * RDBMS-MIB::rdbmsDbEntry.rdbmsDbVendorName
+ * rdbmsDbVendorName is subid 3 of rdbmsDbEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.39.1.1.1.3
+ * Description:
+The name of the vendor whose RDBMS manages this database,
+ for informational purposes.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 1 hashint 1
+ * settable 0
+ * hint: 255a
+ *
+ * Ranges: 0 - 255;
+ *
+ * Its syntax is DisplayString (based on perltype OCTETSTR)
+ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+ * This data type requires a length. (Max 255)
+ */
+/**
+ * map a value from its original native format to the MIB format.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : Any other error
+ *
+ * @note parameters follow the memset convention (dest, src).
+ *
+ * @note generation and use of this function can be turned off by re-running
+ * mib2c after adding the following line to the file
+ * default-node-rdbmsDbVendorName.m2d :
+ * @eval $m2c_node_skip_mapping = 1@
+ *
+ * @remark
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them here.
+ * Otherwise, just do a direct copy.
+ */
+int
+rdbmsDbVendorName_map(char **mib_rdbmsDbVendorName_val_ptr_ptr, size_t *mib_rdbmsDbVendorName_val_ptr_len_ptr, char *raw_rdbmsDbVendorName_val_ptr, size_t raw_rdbmsDbVendorName_val_ptr_len, int allow_realloc)
+{
+ int converted_len;
+
+ netsnmp_assert(NULL != raw_rdbmsDbVendorName_val_ptr);
+ netsnmp_assert((NULL != mib_rdbmsDbVendorName_val_ptr_ptr) && (NULL != mib_rdbmsDbVendorName_val_ptr_len_ptr));
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbVendorName_map","called\n"));
+
+ /*
+ * TODO:241:r: |-> Implement rdbmsDbVendorName non-integer mapping
+ * it is hard to autogenerate code for mapping types that are not simple
+ * integers, so here is an idea of what you might need to do. It will
+ * probably need some tweaking to get right.
+ */
+ /*
+ * if the length of the raw data doesn't directly correspond with
+ * the length of the mib data, set converted_len to the
+ * space required.
+ */
+ converted_len = raw_rdbmsDbVendorName_val_ptr_len; /* assume equal */
+ if((NULL == *mib_rdbmsDbVendorName_val_ptr_ptr) || (*mib_rdbmsDbVendorName_val_ptr_len_ptr < converted_len)) {
+ if(! allow_realloc) {
+ snmp_log(LOG_ERR,"not enough space for value mapping\n");
+ return SNMP_ERR_GENERR;
+ }
+ *mib_rdbmsDbVendorName_val_ptr_ptr = realloc( *mib_rdbmsDbVendorName_val_ptr_ptr, converted_len * sizeof(**mib_rdbmsDbVendorName_val_ptr_ptr));
+ if(NULL == *mib_rdbmsDbVendorName_val_ptr_ptr) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return SNMP_ERR_GENERR;
+ }
+ }
+ *mib_rdbmsDbVendorName_val_ptr_len_ptr = converted_len;
+ memcpy( *mib_rdbmsDbVendorName_val_ptr_ptr, raw_rdbmsDbVendorName_val_ptr, converted_len );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbVendorName_map */
+
+/**
+ * Extract the current value of the rdbmsDbVendorName data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param rdbmsDbVendorName_val_ptr_ptr
+ * Pointer to storage for a char variable
+ * @param rdbmsDbVendorName_val_ptr_len_ptr
+ * Pointer to a size_t. On entry, it will contain the size (in bytes)
+ * pointed to by rdbmsDbVendorName.
+ * On exit, this value should contain the data size (in bytes).
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+*
+ * @note If you need more than (*rdbmsDbVendorName_val_ptr_len_ptr) bytes of memory,
+ * allocate it using malloc() and update rdbmsDbVendorName_val_ptr_ptr.
+ * <b>DO NOT</b> free the previous pointer.
+ * The MFD helper will release the memory you allocate.
+ *
+ * @remark If you call this function yourself, you are responsible
+ * for checking if the pointer changed, and freeing any
+ * previously allocated memory. (Not necessary if you pass
+ * in a pointer to static memory, obviously.)
+ */
+int
+rdbmsDbVendorName_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char **rdbmsDbVendorName_val_ptr_ptr, size_t *rdbmsDbVendorName_val_ptr_len_ptr )
+{
+ /** we should have a non-NULL pointer and enough storage */
+ netsnmp_assert( (NULL != rdbmsDbVendorName_val_ptr_ptr) && (NULL != *rdbmsDbVendorName_val_ptr_ptr));
+ netsnmp_assert( NULL != rdbmsDbVendorName_val_ptr_len_ptr );
+
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbVendorName_get","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+/*
+ * TODO:231:o: |-> Extract the current value of the rdbmsDbVendorName data.
+ * set (* rdbmsDbVendorName_val_ptr_ptr ) and (* rdbmsDbVendorName_val_ptr_len_ptr ) from rowreq_ctx->data
+ */
+ /*
+ * make sure there is enough space for rdbmsDbVendorName data
+ */
+ if ((NULL == (* rdbmsDbVendorName_val_ptr_ptr )) ||
+ ((* rdbmsDbVendorName_val_ptr_len_ptr ) < (rowreq_ctx->data.rdbmsDbVendorName_len * sizeof((* rdbmsDbVendorName_val_ptr_ptr )[0])))) {
+ /*
+ * allocate space for rdbmsDbVendorName data
+ */
+ (* rdbmsDbVendorName_val_ptr_ptr ) = malloc(rowreq_ctx->data.rdbmsDbVendorName_len * sizeof((* rdbmsDbVendorName_val_ptr_ptr )[0]));
+ if(NULL == (* rdbmsDbVendorName_val_ptr_ptr )) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return MFD_ERROR;
+ }
+ }
+ (* rdbmsDbVendorName_val_ptr_len_ptr ) = rowreq_ctx->data.rdbmsDbVendorName_len * sizeof((* rdbmsDbVendorName_val_ptr_ptr )[0]);
+ memcpy( (* rdbmsDbVendorName_val_ptr_ptr ), rowreq_ctx->data.rdbmsDbVendorName, (* rdbmsDbVendorName_val_ptr_len_ptr ) );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbVendorName_get */
+
+/*---------------------------------------------------------------------
+ * RDBMS-MIB::rdbmsDbEntry.rdbmsDbName
+ * rdbmsDbName is subid 4 of rdbmsDbEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.39.1.1.1.4
+ * Description:
+The name of this database, in a product specific format. The
+ product may need to qualify the name in some way to resolve
+ conflicts if it is possible for a database name to be
+ duplicated on a host. It might be necessary to construct a
+ hierarchical name embedding the RDBMS instance/installation
+ on the host, and/or the owner of the database. For instance,
+ '/test-installation/database-owner/database-name'.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 1 hashint 1
+ * settable 0
+ * hint: 255a
+ *
+ * Ranges: 0 - 255;
+ *
+ * Its syntax is DisplayString (based on perltype OCTETSTR)
+ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+ * This data type requires a length. (Max 255)
+ */
+/**
+ * map a value from its original native format to the MIB format.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : Any other error
+ *
+ * @note parameters follow the memset convention (dest, src).
+ *
+ * @note generation and use of this function can be turned off by re-running
+ * mib2c after adding the following line to the file
+ * default-node-rdbmsDbName.m2d :
+ * @eval $m2c_node_skip_mapping = 1@
+ *
+ * @remark
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them here.
+ * Otherwise, just do a direct copy.
+ */
+int
+rdbmsDbName_map(char **mib_rdbmsDbName_val_ptr_ptr, size_t *mib_rdbmsDbName_val_ptr_len_ptr, char *raw_rdbmsDbName_val_ptr, size_t raw_rdbmsDbName_val_ptr_len, int allow_realloc)
+{
+ int converted_len;
+
+ netsnmp_assert(NULL != raw_rdbmsDbName_val_ptr);
+ netsnmp_assert((NULL != mib_rdbmsDbName_val_ptr_ptr) && (NULL != mib_rdbmsDbName_val_ptr_len_ptr));
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbName_map","called\n"));
+
+ /*
+ * TODO:241:r: |-> Implement rdbmsDbName non-integer mapping
+ * it is hard to autogenerate code for mapping types that are not simple
+ * integers, so here is an idea of what you might need to do. It will
+ * probably need some tweaking to get right.
+ */
+ /*
+ * if the length of the raw data doesn't directly correspond with
+ * the length of the mib data, set converted_len to the
+ * space required.
+ */
+ converted_len = raw_rdbmsDbName_val_ptr_len; /* assume equal */
+ if((NULL == *mib_rdbmsDbName_val_ptr_ptr) || (*mib_rdbmsDbName_val_ptr_len_ptr < converted_len)) {
+ if(! allow_realloc) {
+ snmp_log(LOG_ERR,"not enough space for value mapping\n");
+ return SNMP_ERR_GENERR;
+ }
+ *mib_rdbmsDbName_val_ptr_ptr = realloc( *mib_rdbmsDbName_val_ptr_ptr, converted_len * sizeof(**mib_rdbmsDbName_val_ptr_ptr));
+ if(NULL == *mib_rdbmsDbName_val_ptr_ptr) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return SNMP_ERR_GENERR;
+ }
+ }
+ *mib_rdbmsDbName_val_ptr_len_ptr = converted_len;
+ memcpy( *mib_rdbmsDbName_val_ptr_ptr, raw_rdbmsDbName_val_ptr, converted_len );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbName_map */
+
+/**
+ * Extract the current value of the rdbmsDbName data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param rdbmsDbName_val_ptr_ptr
+ * Pointer to storage for a char variable
+ * @param rdbmsDbName_val_ptr_len_ptr
+ * Pointer to a size_t. On entry, it will contain the size (in bytes)
+ * pointed to by rdbmsDbName.
+ * On exit, this value should contain the data size (in bytes).
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+*
+ * @note If you need more than (*rdbmsDbName_val_ptr_len_ptr) bytes of memory,
+ * allocate it using malloc() and update rdbmsDbName_val_ptr_ptr.
+ * <b>DO NOT</b> free the previous pointer.
+ * The MFD helper will release the memory you allocate.
+ *
+ * @remark If you call this function yourself, you are responsible
+ * for checking if the pointer changed, and freeing any
+ * previously allocated memory. (Not necessary if you pass
+ * in a pointer to static memory, obviously.)
+ */
+int
+rdbmsDbName_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char **rdbmsDbName_val_ptr_ptr, size_t *rdbmsDbName_val_ptr_len_ptr )
+{
+ /** we should have a non-NULL pointer and enough storage */
+ netsnmp_assert( (NULL != rdbmsDbName_val_ptr_ptr) && (NULL != *rdbmsDbName_val_ptr_ptr));
+ netsnmp_assert( NULL != rdbmsDbName_val_ptr_len_ptr );
+
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbName_get","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+/*
+ * TODO:231:o: |-> Extract the current value of the rdbmsDbName data.
+ * set (* rdbmsDbName_val_ptr_ptr ) and (* rdbmsDbName_val_ptr_len_ptr ) from rowreq_ctx->data
+ */
+ /*
+ * make sure there is enough space for rdbmsDbName data
+ */
+ if ((NULL == (* rdbmsDbName_val_ptr_ptr )) ||
+ ((* rdbmsDbName_val_ptr_len_ptr ) < (rowreq_ctx->data.rdbmsDbName_len * sizeof((* rdbmsDbName_val_ptr_ptr )[0])))) {
+ /*
+ * allocate space for rdbmsDbName data
+ */
+ (* rdbmsDbName_val_ptr_ptr ) = malloc(rowreq_ctx->data.rdbmsDbName_len * sizeof((* rdbmsDbName_val_ptr_ptr )[0]));
+ if(NULL == (* rdbmsDbName_val_ptr_ptr )) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return MFD_ERROR;
+ }
+ }
+ (* rdbmsDbName_val_ptr_len_ptr ) = rowreq_ctx->data.rdbmsDbName_len * sizeof((* rdbmsDbName_val_ptr_ptr )[0]);
+ memcpy( (* rdbmsDbName_val_ptr_ptr ), rowreq_ctx->data.rdbmsDbName, (* rdbmsDbName_val_ptr_len_ptr ) );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbName_get */
+
+/*---------------------------------------------------------------------
+ * RDBMS-MIB::rdbmsDbEntry.rdbmsDbContact
+ * rdbmsDbContact is subid 5 of rdbmsDbEntry.
+ * Its status is Current, and its access level is ReadWrite.
+ * OID: .1.3.6.1.2.1.39.1.1.1.5
+ * Description:
+The textual identification of the contact person for this
+ managed database, together with information on how to contact
+ this person.
+
+ Note: if there is no server associated with this database, an
+ agent may need to keep this in other persistent storage,
+ e.g., a configuration file.
+
+ Note that a compliant agent does not need to
+ allow write access to this object.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 1 hashint 1
+ * settable 1
+ * hint: 255a
+ *
+ * Ranges: 0 - 255;
+ *
+ * Its syntax is DisplayString (based on perltype OCTETSTR)
+ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+ * This data type requires a length. (Max 255)
+ */
+/**
+ * map a value from its original native format to the MIB format.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : Any other error
+ *
+ * @note parameters follow the memset convention (dest, src).
+ *
+ * @note generation and use of this function can be turned off by re-running
+ * mib2c after adding the following line to the file
+ * default-node-rdbmsDbContact.m2d :
+ * @eval $m2c_node_skip_mapping = 1@
+ *
+ * @remark
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them here.
+ * Otherwise, just do a direct copy.
+ */
+int
+rdbmsDbContact_map(char **mib_rdbmsDbContact_val_ptr_ptr, size_t *mib_rdbmsDbContact_val_ptr_len_ptr, char *raw_rdbmsDbContact_val_ptr, size_t raw_rdbmsDbContact_val_ptr_len, int allow_realloc)
+{
+ int converted_len;
+
+ netsnmp_assert(NULL != raw_rdbmsDbContact_val_ptr);
+ netsnmp_assert((NULL != mib_rdbmsDbContact_val_ptr_ptr) && (NULL != mib_rdbmsDbContact_val_ptr_len_ptr));
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbContact_map","called\n"));
+
+ /*
+ * TODO:241:r: |-> Implement rdbmsDbContact non-integer mapping
+ * it is hard to autogenerate code for mapping types that are not simple
+ * integers, so here is an idea of what you might need to do. It will
+ * probably need some tweaking to get right.
+ */
+ /*
+ * if the length of the raw data doesn't directly correspond with
+ * the length of the mib data, set converted_len to the
+ * space required.
+ */
+ converted_len = raw_rdbmsDbContact_val_ptr_len; /* assume equal */
+ if((NULL == *mib_rdbmsDbContact_val_ptr_ptr) || (*mib_rdbmsDbContact_val_ptr_len_ptr < converted_len)) {
+ if(! allow_realloc) {
+ snmp_log(LOG_ERR,"not enough space for value mapping\n");
+ return SNMP_ERR_GENERR;
+ }
+ *mib_rdbmsDbContact_val_ptr_ptr = realloc( *mib_rdbmsDbContact_val_ptr_ptr, converted_len * sizeof(**mib_rdbmsDbContact_val_ptr_ptr));
+ if(NULL == *mib_rdbmsDbContact_val_ptr_ptr) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return SNMP_ERR_GENERR;
+ }
+ }
+ *mib_rdbmsDbContact_val_ptr_len_ptr = converted_len;
+ memcpy( *mib_rdbmsDbContact_val_ptr_ptr, raw_rdbmsDbContact_val_ptr, converted_len );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbContact_map */
+
+/**
+ * Extract the current value of the rdbmsDbContact data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param rdbmsDbContact_val_ptr_ptr
+ * Pointer to storage for a char variable
+ * @param rdbmsDbContact_val_ptr_len_ptr
+ * Pointer to a size_t. On entry, it will contain the size (in bytes)
+ * pointed to by rdbmsDbContact.
+ * On exit, this value should contain the data size (in bytes).
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+*
+ * @note If you need more than (*rdbmsDbContact_val_ptr_len_ptr) bytes of memory,
+ * allocate it using malloc() and update rdbmsDbContact_val_ptr_ptr.
+ * <b>DO NOT</b> free the previous pointer.
+ * The MFD helper will release the memory you allocate.
+ *
+ * @remark If you call this function yourself, you are responsible
+ * for checking if the pointer changed, and freeing any
+ * previously allocated memory. (Not necessary if you pass
+ * in a pointer to static memory, obviously.)
+ */
+int
+rdbmsDbContact_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char **rdbmsDbContact_val_ptr_ptr, size_t *rdbmsDbContact_val_ptr_len_ptr )
+{
+ /** we should have a non-NULL pointer and enough storage */
+ netsnmp_assert( (NULL != rdbmsDbContact_val_ptr_ptr) && (NULL != *rdbmsDbContact_val_ptr_ptr));
+ netsnmp_assert( NULL != rdbmsDbContact_val_ptr_len_ptr );
+
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbContact_get","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+/*
+ * TODO:231:o: |-> Extract the current value of the rdbmsDbContact data.
+ * set (* rdbmsDbContact_val_ptr_ptr ) and (* rdbmsDbContact_val_ptr_len_ptr ) from rowreq_ctx->data
+ */
+ /*
+ * make sure there is enough space for rdbmsDbContact data
+ */
+ if ((NULL == (* rdbmsDbContact_val_ptr_ptr )) ||
+ ((* rdbmsDbContact_val_ptr_len_ptr ) < (rowreq_ctx->data.rdbmsDbContact_len * sizeof((* rdbmsDbContact_val_ptr_ptr )[0])))) {
+ /*
+ * allocate space for rdbmsDbContact data
+ */
+ (* rdbmsDbContact_val_ptr_ptr ) = malloc(rowreq_ctx->data.rdbmsDbContact_len * sizeof((* rdbmsDbContact_val_ptr_ptr )[0]));
+ if(NULL == (* rdbmsDbContact_val_ptr_ptr )) {
+ snmp_log(LOG_ERR,"could not allocate memory\n");
+ return MFD_ERROR;
+ }
+ }
+ (* rdbmsDbContact_val_ptr_len_ptr ) = rowreq_ctx->data.rdbmsDbContact_len * sizeof((* rdbmsDbContact_val_ptr_ptr )[0]);
+ memcpy( (* rdbmsDbContact_val_ptr_ptr ), rowreq_ctx->data.rdbmsDbContact, (* rdbmsDbContact_val_ptr_len_ptr ) );
+
+ return MFD_SUCCESS;
+} /* rdbmsDbContact_get */
+
+
+
+/** @} */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.h b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.h
new file mode 100644
index 0000000..a4af810
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_get.h
@@ -0,0 +1,66 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_data_get.h
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_data_get.h,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RDBMSDBTABLE_DATA_GET_H
+#define RDBMSDBTABLE_DATA_GET_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* *********************************************************************
+ * GET function declarations
+ */
+
+/* *********************************************************************
+ * GET Table declarations
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+ /*
+ * indexes
+ */
+ int rdbmsDbIndex_map(long *mib_rdbmsDbIndex_val_ptr, long raw_rdbmsDbIndex_val);
+
+ int rdbmsDbPrivateMibOID_map(oid **mib_rdbmsDbPrivateMibOID_val_ptr_ptr, size_t *mib_rdbmsDbPrivateMibOID_val_ptr_len_ptr, oid *raw_rdbmsDbPrivateMibOID_val_ptr, size_t raw_rdbmsDbPrivateMibOID_val_ptr_len, int allow_realloc);
+ int rdbmsDbPrivateMibOID_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, oid **rdbmsDbPrivateMibOID_val_ptr_ptr, size_t *rdbmsDbPrivateMibOID_val_ptr_len_ptr );
+ int rdbmsDbVendorName_map(char **mib_rdbmsDbVendorName_val_ptr_ptr, size_t *mib_rdbmsDbVendorName_val_ptr_len_ptr, char *raw_rdbmsDbVendorName_val_ptr, size_t raw_rdbmsDbVendorName_val_ptr_len, int allow_realloc);
+ int rdbmsDbVendorName_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char **rdbmsDbVendorName_val_ptr_ptr, size_t *rdbmsDbVendorName_val_ptr_len_ptr );
+ int rdbmsDbName_map(char **mib_rdbmsDbName_val_ptr_ptr, size_t *mib_rdbmsDbName_val_ptr_len_ptr, char *raw_rdbmsDbName_val_ptr, size_t raw_rdbmsDbName_val_ptr_len, int allow_realloc);
+ int rdbmsDbName_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char **rdbmsDbName_val_ptr_ptr, size_t *rdbmsDbName_val_ptr_len_ptr );
+ int rdbmsDbContact_map(char **mib_rdbmsDbContact_val_ptr_ptr, size_t *mib_rdbmsDbContact_val_ptr_len_ptr, char *raw_rdbmsDbContact_val_ptr, size_t raw_rdbmsDbContact_val_ptr_len, int allow_realloc);
+ int rdbmsDbContact_get( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char **rdbmsDbContact_val_ptr_ptr, size_t *rdbmsDbContact_val_ptr_len_ptr );
+
+
+int rdbmsDbTable_indexes_set_tbl_idx(rdbmsDbTable_mib_index *tbl_idx, long rdbmsDbIndex_val);
+int rdbmsDbTable_indexes_set(rdbmsDbTable_rowreq_ctx *rowreq_ctx, long rdbmsDbIndex_val);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RDBMSDBTABLE_DATA_GET_H */
+/** @} */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.c b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.c
new file mode 100644
index 0000000..5293811
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.c
@@ -0,0 +1,517 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_data_set.c
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_data_set.c,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "pgsnmpd.h"
+
+/* include our parent header */
+#include "rdbmsDbTable.h"
+
+
+/** @defgroup data_set data_set: Routines to set data
+ *
+ * These routines are used to set the value for individual objects. The
+ * row context is passed, along with the new value.
+ *
+ * @{
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+ /*
+ * 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
+ * +==============+
+ * +----------------|| object ||
+ * | E || lookup ||
+ * | +==============+
+ * | | S
+ * | +==============+
+ * | E || check ||
+ * |<---------------|| values ||
+ * | +==============+
+ * | | 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
+ * +--------------+
+ * | post |
+ * | request |
+ * +--------------+
+ *
+ */
+
+/**
+ * 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.
+ *
+ * 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 (rdbmsDbTable_rowreq_ctx)
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error. set will fail.
+ */
+int
+rdbmsDbTable_undo_setup( rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_undo_setup","called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert( NULL != rowreq_ctx );
+
+ /*
+ * TODO:451:M: |-> Setup rdbmsDbTable undo.
+ * set up rdbmsDbTable undo information, in preparation for a set.
+ */
+
+ return rc;
+} /* rdbmsDbTable_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 (rdbmsDbTable_rowreq_ctx)
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error
+ */
+int
+rdbmsDbTable_undo_cleanup( rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_undo_cleanup","called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert( NULL != rowreq_ctx );
+
+ /*
+ * TODO:452:M: |-> Cleanup rdbmsDbTable undo.
+ */
+
+ return rc;
+} /* rdbmsDbTable_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 FLAG_* bits can be found in
+ * rdbmsDbTable_oids.h.
+ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+ *
+ * @param rdbmsDbTable_rowreq_ctx
+ * Pointer to the users context.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error
+ */
+int
+rdbmsDbTable_commit( rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+ int save_flags;
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_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 rdbmsDbTable 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.
+ */
+ if (save_flags & FLAG_RDBMSDBCONTACT) {
+ save_flags &= ~FLAG_RDBMSDBCONTACT; /* clear rdbmsDbContact */
+ /*
+ * TODO:482:o: |-> commit column rdbmsDbContact.
+ */
+ rc = -1;
+ if(-1 == rc) {
+ snmp_log(LOG_ERR,"rdbmsDbTable column rdbmsDbContact commit failed\n");
+ }
+ else {
+ /*
+ * set flag, in case we need to undo rdbmsDbContact
+ */
+ rowreq_ctx->column_set_flags |= FLAG_RDBMSDBCONTACT;
+ }
+ }
+
+ if (save_flags) {
+ snmp_log(LOG_ERR, "unhandled columns (0x%x) in commit\n", save_flags);
+ return MFD_ERROR;
+ }
+
+ return rc;
+} /* rdbmsDbTable_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 FLAG_* bits can be found in
+ * rdbmsDbTable_oids.h.
+ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+ *
+ * @param rdbmsDbTable_rowreq_ctx
+ * Pointer to the users context.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error
+ */
+int
+rdbmsDbTable_undo_commit( rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_undo_commit","called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert( NULL != rowreq_ctx );
+
+ /*
+ * TODO:485:M: |-> Undo rdbmsDbTable 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 & FLAG_) {}
+ */
+
+ return rc;
+} /* rdbmsDbTable_undo_commit */
+
+/*
+ * TODO:420:r: Implement rdbmsDbTable index validation.
+ */
+/*
+ * TODO:440:M: Implement rdbmsDbTable node value checks.
+ * TODO:450:M: Implement rdbmsDbTable undo functions.
+ * TODO:460:M: Implement rdbmsDbTable set functions.
+ * TODO:480:M: Implement rdbmsDbTable commit functions.
+ */
+/*---------------------------------------------------------------------
+ * RDBMS-MIB::rdbmsDbEntry.rdbmsDbContact
+ * rdbmsDbContact is subid 5 of rdbmsDbEntry.
+ * Its status is Current, and its access level is ReadWrite.
+ * OID: .1.3.6.1.2.1.39.1.1.1.5
+ * Description:
+The textual identification of the contact person for this
+ managed database, together with information on how to contact
+ this person.
+
+ Note: if there is no server associated with this database, an
+ agent may need to keep this in other persistent storage,
+ e.g., a configuration file.
+
+ Note that a compliant agent does not need to
+ allow write access to this object.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 1 hashint 1
+ * settable 1
+ * hint: 255a
+ *
+ * Ranges: 0 - 255;
+ *
+ * Its syntax is DisplayString (based on perltype OCTETSTR)
+ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+ * This data type requires a length. (Max 255)
+ */
+/**
+ * Check that the proposed new value is potentially valid.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param rdbmsDbContact_val_ptr
+ * A char containing the new value.
+ * @param rdbmsDbContact_val_ptr_len
+ * The size (in bytes) of the data pointed to by rdbmsDbContact_val_ptr
+ *
+ * @retval MFD_SUCCESS : incoming value is legal
+ * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
+ * @retval MFD_NOT_VALID_EVER : incoming value is never valid
+ *
+ * This is the place to check for requirements that are not
+ * expressed in the mib syntax (for example, a requirement that
+ * is detailed in the description for an object).
+ *
+ * You should check that the requested change between the undo value and the
+ * new value is legal (ie, the transistion from one value to another
+ * is legal).
+ *
+ *@note
+ * This check is only to determine if the new value
+ * is \b potentially valid. This is the first check of many, and
+ * is one of the simplest ones.
+ *
+ *@note
+ * this is not the place to do any checks for values
+ * which depend on some other value in the mib. Those
+ * types of checks should be done in the
+ * rdbmsDbTable_check_dependencies() function.
+ *
+ * The following checks have already been done for you:
+ * The syntax is ASN_OCTET_STR
+ * The length is in (one of) the range set(s): 0 - 255
+ *
+ * If there a no other checks you need to do, simply return MFD_SUCCESS.
+ *
+ */
+int
+rdbmsDbContact_check_value( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbContact_val_ptr, size_t rdbmsDbContact_val_ptr_len)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbContact_check_value","called\n"));
+
+ /** should never get a NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+ netsnmp_assert(NULL != rdbmsDbContact_val_ptr);
+
+ /*
+ * TODO:441:o: |-> Check for valid rdbmsDbContact value.
+ */
+
+ return MFD_SUCCESS; /* rdbmsDbContact value not illegal */
+} /* rdbmsDbContact_check_value */
+
+/**
+ * Save old value information
+ *
+ * @param rowreq_ctx
+ * Pointer to the table context (rdbmsDbTable_rowreq_ctx)
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error. set will fail.
+ *
+ * This function will be called after the table level undo setup function
+ * rdbmsDbTable_undo_setup has been called.
+ *
+ *@note
+ * this function will only be called if a new value is set for this column.
+ *
+ * If there is any setup specific to a particular column (e.g. allocating
+ * memory for a string), you should do that setup in this function, so it
+ * won't be done unless it is necessary.
+ */
+int
+rdbmsDbContact_undo_setup( rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbContact_undo_setup","called\n"));
+
+ /** should never get a NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:455:o: |-> Setup rdbmsDbContact undo.
+ */
+ /*
+ * copy rdbmsDbContact and rdbmsDbContact_len data
+ * set rowreq_ctx->undo->rdbmsDbContact from rowreq_ctx->data.rdbmsDbContact
+ */
+ memcpy( rowreq_ctx->undo->rdbmsDbContact, rowreq_ctx->data.rdbmsDbContact,
+ (rowreq_ctx->data.rdbmsDbContact_len * sizeof(rowreq_ctx->undo->rdbmsDbContact[0])));
+ rowreq_ctx->undo->rdbmsDbContact_len = rowreq_ctx->data.rdbmsDbContact_len;
+
+
+ return MFD_SUCCESS;
+} /* rdbmsDbContact_undo_setup */
+
+/**
+ * Set the new value.
+ *
+ * @param rowreq_ctx
+ * Pointer to the users context. You should know how to
+ * manipulate the value from this object.
+ * @param rdbmsDbContact_val_ptr
+ * A char containing the new value.
+ * @param rdbmsDbContact_val_ptr_len
+ * The size (in bytes) of the data pointed to by rdbmsDbContact_val_ptr
+ */
+int
+rdbmsDbContact_set( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbContact_val_ptr, size_t rdbmsDbContact_val_ptr_len )
+{
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbContact_set","called\n"));
+
+ /** should never get a NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+ netsnmp_assert(NULL != rdbmsDbContact_val_ptr);
+
+/*
+ * TODO:245:o: |-> Implement rdbmsDbContact reverse mapping.
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them here.
+ */
+ /*
+ * TODO:461:M: |-> Set rdbmsDbContact value.
+ * set rdbmsDbContact value in rowreq_ctx->data
+ */
+ memcpy( rowreq_ctx->data.rdbmsDbContact, rdbmsDbContact_val_ptr, rdbmsDbContact_val_ptr_len );
+ rowreq_ctx->data.rdbmsDbContact_len = rdbmsDbContact_val_ptr_len / sizeof(rdbmsDbContact_val_ptr[0]);
+
+ return MFD_SUCCESS;
+} /* rdbmsDbContact_set */
+
+/**
+ * undo the previous set.
+ *
+ * @param rowreq_ctx
+ * Pointer to the users context.
+ */
+int
+rdbmsDbContact_undo( rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbContact_undo","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:456:o: |-> Clean up rdbmsDbContact undo.
+ */
+ /*
+ * copy rdbmsDbContact and rdbmsDbContact_len data
+ * set rowreq_ctx->data.rdbmsDbContact from rowreq_ctx->undo->rdbmsDbContact
+ */
+ memcpy( rowreq_ctx->data.rdbmsDbContact, rowreq_ctx->undo->rdbmsDbContact,
+ (rowreq_ctx->undo->rdbmsDbContact_len * sizeof(rowreq_ctx->data.rdbmsDbContact[0])));
+ rowreq_ctx->data.rdbmsDbContact_len = rowreq_ctx->undo->rdbmsDbContact_len;
+
+
+ return MFD_SUCCESS;
+} /* rdbmsDbContact_undo */
+
+/**
+ * check dependencies
+ *
+ * This is useful for for tables which have dependencies between columns
+ * (or rows, or tables). For example, two columns allocating a percentage
+ * of something add up 100%.
+ *
+ * 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 FLAG_* bits can be found in
+ * rdbmsDbTable_oids.h.
+ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+ *
+ * @retval MFD_SUCCESS all the changes to the row are legal
+ * @retval MFD_ERROR one or more changes are not legal
+ *
+ * (see README-table-rdbmsDbTable if you don't have dependencies)
+ */
+int
+rdbmsDbTable_check_dependencies(rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:rdbmsDbTable_check_dependencies","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:470:o: Check rdbmsDbTable row dependencies.
+ * check that all new value are legal and consistent with each other
+ */
+ return rc;
+} /* rdbmsDbTable_check_dependencies */
+
+/** @} */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.h b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.h
new file mode 100644
index 0000000..06cd026
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_data_set.h
@@ -0,0 +1,77 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_data_set.h
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_data_set.h,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RDBMSDBTABLE_DATA_SET_H
+#define RDBMSDBTABLE_DATA_SET_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* *********************************************************************
+ * SET function declarations
+ */
+
+/* *********************************************************************
+ * SET Table declarations
+ */
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+int rdbmsDbIndex_check_index( rdbmsDbTable_rowreq_ctx *rowreq_ctx ); /* internal */
+
+
+int rdbmsDbTable_undo_setup( rdbmsDbTable_rowreq_ctx *rowreq_ctx);
+int rdbmsDbTable_undo_cleanup( rdbmsDbTable_rowreq_ctx *rowreq_ctx);
+int rdbmsDbTable_commit( rdbmsDbTable_rowreq_ctx *rowreq_ctx);
+int rdbmsDbTable_undo_commit( rdbmsDbTable_rowreq_ctx *rowreq_ctx);
+
+
+int rdbmsDbPrivateMibOID_check_value( rdbmsDbTable_rowreq_ctx *rowreq_ctx, oid *rdbmsDbPrivateMibOID_val_ptr, size_t rdbmsDbPrivateMibOID_val_ptr_len);
+int rdbmsDbPrivateMibOID_undo_setup( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+int rdbmsDbPrivateMibOID_set( rdbmsDbTable_rowreq_ctx *rowreq_ctx, oid *rdbmsDbPrivateMibOID_val_ptr, size_t rdbmsDbPrivateMibOID_val_ptr_len );
+int rdbmsDbPrivateMibOID_undo( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+
+int rdbmsDbVendorName_check_value( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbVendorName_val_ptr, size_t rdbmsDbVendorName_val_ptr_len);
+int rdbmsDbVendorName_undo_setup( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+int rdbmsDbVendorName_set( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbVendorName_val_ptr, size_t rdbmsDbVendorName_val_ptr_len );
+int rdbmsDbVendorName_undo( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+
+int rdbmsDbName_check_value( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbName_val_ptr, size_t rdbmsDbName_val_ptr_len);
+int rdbmsDbName_undo_setup( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+int rdbmsDbName_set( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbName_val_ptr, size_t rdbmsDbName_val_ptr_len );
+int rdbmsDbName_undo( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+
+int rdbmsDbContact_check_value( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbContact_val_ptr, size_t rdbmsDbContact_val_ptr_len);
+int rdbmsDbContact_undo_setup( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+int rdbmsDbContact_set( rdbmsDbTable_rowreq_ctx *rowreq_ctx, char *rdbmsDbContact_val_ptr, size_t rdbmsDbContact_val_ptr_len );
+int rdbmsDbContact_undo( rdbmsDbTable_rowreq_ctx *rowreq_ctx );
+
+
+int rdbmsDbTable_check_dependencies(rdbmsDbTable_rowreq_ctx *ctx);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RDBMSDBTABLE_DATA_SET_H */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_enums.h b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_enums.h
new file mode 100644
index 0000000..676d383
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_enums.h
@@ -0,0 +1,47 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_enums.h
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_enums.h,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RDBMSDBTABLE_ENUMS_H
+#define RDBMSDBTABLE_ENUMS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /*
+ * NOTES on enums
+ * ==============
+ *
+ * Value Mapping
+ * -------------
+ * If the values for your data type don't exactly match the
+ * possible values defined by the mib, you should map them
+ * below. For example, a boolean flag (1/0) is usually represented
+ * as a TruthValue in a MIB, which maps to the values (1/2).
+ *
+ */
+/*************************************************************************
+ *************************************************************************
+ *
+ * enum definitions for table rdbmsDbTable
+ *
+ *************************************************************************
+ *************************************************************************/
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RDBMSDBTABLE_ENUMS_H */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.c b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.c
new file mode 100644
index 0000000..8711c2c
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.c
@@ -0,0 +1,1238 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_interface.c
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_interface.c,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "pgsnmpd.h"
+
+/* include our parent header */
+#include "rdbmsDbTable.h"
+#include "rdbmsDbTable_interface.h"
+
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table rdbmsDbTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * rdbmsDbTable is subid 1 of rdbmsObjects.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.39.1.1, length: 9
+*/
+typedef struct rdbmsDbTable_interface_ctx_s {
+
+ netsnmp_container *container;
+ netsnmp_cache *cache; /* optional cache */
+
+ rdbmsDbTable_registration_ptr user_ctx;
+
+ netsnmp_table_registration_info tbl_info;
+
+ netsnmp_baby_steps_access_methods access_multiplexer;
+
+} rdbmsDbTable_interface_ctx;
+
+static rdbmsDbTable_interface_ctx rdbmsDbTable_if_ctx;
+
+static void _rdbmsDbTable_container_init(
+ rdbmsDbTable_interface_ctx *if_ctx);
+
+
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_pre_request;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_post_request;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_object_lookup;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_get_values;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_check_objects;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_undo_setup;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_set_values;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_undo_cleanup;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_undo_values;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_commit;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_undo_commit;
+static Netsnmp_Node_Handler _mfd_rdbmsDbTable_check_dependencies;
+
+NETSNMP_STATIC_INLINE int _rdbmsDbTable_undo_column( rdbmsDbTable_rowreq_ctx *rowreq_ctx,
+ netsnmp_variable_list *var, int column );
+
+rdbmsDbTable_data *rdbmsDbTable_allocate_data(void);
+void rdbmsDbTable_release_data(rdbmsDbTable_data *data);
+
+/**
+ * @internal
+ * Initialize the table rdbmsDbTable
+ * (Define its contents and how it's structured)
+ */
+void
+_rdbmsDbTable_initialize_interface(rdbmsDbTable_registration_ptr reg_ptr, u_long flags)
+{
+ netsnmp_baby_steps_access_methods *access_multiplexer =
+ &rdbmsDbTable_if_ctx.access_multiplexer;
+ netsnmp_table_registration_info *tbl_info = &rdbmsDbTable_if_ctx.tbl_info;
+ netsnmp_handler_registration *reginfo;
+ netsnmp_mib_handler *handler;
+ int mfd_modes = 0;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_rdbmsDbTable_initialize_interface","called\n"));
+
+
+ /*************************************************
+ *
+ * save interface context for rdbmsDbTable
+ */
+ /*
+ * Setting up the table's definition
+ */
+ netsnmp_table_helper_add_indexes(tbl_info,
+ ASN_INTEGER, /** index: rdbmsDbIndex */
+ 0);
+
+ /* Define the minimum and maximum accessible columns. This
+ optimizes retrival. */
+ tbl_info->min_column = RDBMSDBTABLE_MIN_COL;
+ tbl_info->max_column = RDBMSDBTABLE_MAX_COL;
+
+ /*
+ * save users context
+ */
+ rdbmsDbTable_if_ctx.user_ctx = reg_ptr;
+
+ /*
+ * call data access initialization code
+ */
+ rdbmsDbTable_init_data(reg_ptr);
+
+ /*
+ * set up the container
+ */
+ _rdbmsDbTable_container_init(&rdbmsDbTable_if_ctx);
+ if (NULL == rdbmsDbTable_if_ctx.container) {
+ snmp_log(LOG_ERR,"could not initialize container for rdbmsDbTable\n");
+ return;
+ }
+
+ /*
+ * access_multiplexer: REQUIRED wrapper for get request handling
+ */
+ access_multiplexer->object_lookup = _mfd_rdbmsDbTable_object_lookup;
+ access_multiplexer->get_values = _mfd_rdbmsDbTable_get_values;
+
+ /*
+ * no wrappers yet
+ */
+ access_multiplexer->pre_request = _mfd_rdbmsDbTable_pre_request;
+ access_multiplexer->post_request = _mfd_rdbmsDbTable_post_request;
+
+
+ /*
+ * REQUIRED wrappers for set request handling
+ */
+ access_multiplexer->object_syntax_checks = _mfd_rdbmsDbTable_check_objects;
+ access_multiplexer->undo_setup = _mfd_rdbmsDbTable_undo_setup;
+ access_multiplexer->undo_cleanup = _mfd_rdbmsDbTable_undo_cleanup;
+ access_multiplexer->set_values = _mfd_rdbmsDbTable_set_values;
+ access_multiplexer->undo_sets = _mfd_rdbmsDbTable_undo_values;
+
+ /*
+ * no wrappers yet
+ */
+ access_multiplexer->commit = _mfd_rdbmsDbTable_commit;
+ access_multiplexer->undo_commit = _mfd_rdbmsDbTable_undo_commit;
+
+ /*
+ * REQUIRED for tables with dependencies
+ */
+ access_multiplexer->consistency_checks = _mfd_rdbmsDbTable_check_dependencies;
+
+ /*************************************************
+ *
+ * Create a registration, save our reg data, register table.
+ */
+ DEBUGMSGTL(("rdbmsDbTable:init_rdbmsDbTable",
+ "Registering rdbmsDbTable as a mibs-for-dummies table.\n"));
+ handler = netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
+ reginfo = netsnmp_handler_registration_create("rdbmsDbTable", handler,
+ rdbmsDbTable_oid,
+ rdbmsDbTable_oid_size,
+ HANDLER_CAN_BABY_STEP |
+ HANDLER_CAN_RWRITE
+ );
+ if(NULL == reginfo) {
+ snmp_log(LOG_ERR,"error registering table rdbmsDbTable\n");
+ return;
+ }
+ reginfo->my_reg_void = &rdbmsDbTable_if_ctx;
+
+ /*************************************************
+ *
+ * set up baby steps handler, create it and inject it
+ */
+ if( access_multiplexer->object_lookup )
+ mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
+ if( access_multiplexer->set_values )
+ mfd_modes |= BABY_STEP_SET_VALUES;
+ if( access_multiplexer->irreversible_commit )
+ mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
+ if( access_multiplexer->object_syntax_checks )
+ mfd_modes |= BABY_STEP_CHECK_OBJECT;
+
+ if( access_multiplexer->pre_request )
+ mfd_modes |= BABY_STEP_PRE_REQUEST;
+ if( access_multiplexer->post_request )
+ mfd_modes |= BABY_STEP_POST_REQUEST;
+
+ if( access_multiplexer->undo_setup )
+ mfd_modes |= BABY_STEP_UNDO_SETUP;
+ if( access_multiplexer->undo_cleanup )
+ mfd_modes |= BABY_STEP_UNDO_CLEANUP;
+ if( access_multiplexer->undo_sets )
+ mfd_modes |= BABY_STEP_UNDO_SETS;
+
+ if( access_multiplexer->row_creation )
+ mfd_modes |= BABY_STEP_ROW_CREATE;
+ if( access_multiplexer->consistency_checks )
+ mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
+ if( access_multiplexer->commit )
+ mfd_modes |= BABY_STEP_COMMIT;
+ if( access_multiplexer->undo_commit )
+ mfd_modes |= BABY_STEP_UNDO_COMMIT;
+
+ handler = netsnmp_baby_steps_handler_get(mfd_modes);
+ netsnmp_inject_handler(reginfo, handler);
+
+ /*************************************************
+ *
+ * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
+ */
+ handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
+ netsnmp_inject_handler(reginfo, handler);
+
+ /*************************************************
+ *
+ * inject container_table helper
+ */
+ handler =
+ netsnmp_container_table_handler_get(tbl_info,
+ rdbmsDbTable_if_ctx.container,
+ TABLE_CONTAINER_KEY_NETSNMP_INDEX);
+ netsnmp_inject_handler( reginfo, handler );
+
+ /*************************************************
+ *
+ * inject cache helper
+ */
+ if(NULL != rdbmsDbTable_if_ctx.cache) {
+ handler = netsnmp_cache_handler_get(rdbmsDbTable_if_ctx.cache);
+ netsnmp_inject_handler( reginfo, handler );
+ }
+
+ /*
+ * register table
+ */
+ netsnmp_register_table(reginfo, tbl_info);
+} /* _rdbmsDbTable_initialize_interface */
+
+void
+rdbmsDbTable_valid_columns_set(netsnmp_column_info *vc)
+{
+ rdbmsDbTable_if_ctx.tbl_info.valid_columns = vc;
+} /* rdbmsDbTable_valid_columns_set */
+
+/**
+ * @internal
+ * convert the index component stored in the context to an oid
+ */
+int
+rdbmsDbTable_index_to_oid(netsnmp_index *oid_idx,
+ rdbmsDbTable_mib_index *mib_idx)
+{
+ int err = SNMP_ERR_NOERROR;
+
+ /*
+ * temp storage for parsing indexes
+ */
+ /*
+ * rdbmsDbIndex(1)/INTEGER/ASN_INTEGER/long(long)//l/a/w/e/R/d/h
+ */
+ netsnmp_variable_list var_rdbmsDbIndex;
+
+ /*
+ * set up varbinds
+ */
+ memset( &var_rdbmsDbIndex, 0x00, sizeof(var_rdbmsDbIndex) );
+ var_rdbmsDbIndex.type = ASN_INTEGER;
+
+ /*
+ * chain temp index varbinds together
+ */
+ var_rdbmsDbIndex.next_variable = NULL;
+
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_index_to_oid","called\n"));
+
+ /* rdbmsDbIndex(1)/INTEGER/ASN_INTEGER/long(long)//l/a/w/e/R/d/h */
+ snmp_set_var_value(&var_rdbmsDbIndex, (u_char*)&mib_idx->rdbmsDbIndex,
+ sizeof(mib_idx->rdbmsDbIndex));
+
+
+ err = build_oid_noalloc(oid_idx->oids, oid_idx->len, (size_t *)&oid_idx->len,
+ NULL, 0, &var_rdbmsDbIndex);
+ if(err)
+ snmp_log(LOG_ERR,"error %d converting index to oid\n", err);
+
+ /*
+ * parsing may have allocated memory. free it.
+ */
+ snmp_reset_var_buffers( &var_rdbmsDbIndex );
+
+ return err;
+} /* rdbmsDbTable_index_to_oid */
+
+/**
+ * extract rdbmsDbTable indexes from a netsnmp_index
+ *
+ * @retval SNMP_ERR_NOERROR : no error
+ * @retval SNMP_ERR_GENERR : error
+ */
+int
+rdbmsDbTable_index_from_oid(netsnmp_index *oid_idx,
+ rdbmsDbTable_mib_index *mib_idx)
+{
+ int err = SNMP_ERR_NOERROR;
+
+ /*
+ * temp storage for parsing indexes
+ */
+ /*
+ * rdbmsDbIndex(1)/INTEGER/ASN_INTEGER/long(long)//l/a/w/e/R/d/h
+ */
+ netsnmp_variable_list var_rdbmsDbIndex;
+
+ /*
+ * set up varbinds
+ */
+ memset( &var_rdbmsDbIndex, 0x00, sizeof(var_rdbmsDbIndex) );
+ var_rdbmsDbIndex.type = ASN_INTEGER;
+
+ /*
+ * chain temp index varbinds together
+ */
+ var_rdbmsDbIndex.next_variable = NULL;
+
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_index_from_oid","called\n"));
+
+ /*
+ * parse the oid into the individual index components
+ */
+ err = parse_oid_indexes( oid_idx->oids, oid_idx->len,
+ &var_rdbmsDbIndex );
+ if (err == SNMP_ERR_NOERROR) {
+ /*
+ * copy out values
+ */
+ mib_idx->rdbmsDbIndex = *((long *)var_rdbmsDbIndex.val.string);
+
+
+ }
+
+ /*
+ * parsing may have allocated memory. free it.
+ */
+ snmp_reset_var_buffers( &var_rdbmsDbIndex );
+
+ return err;
+} /* rdbmsDbTable_index_from_oid */
+
+
+/*
+ * rdbmsDbTable_allocate_data
+ *
+ * Purpose: create new rdbmsDbTable_data.
+ */
+rdbmsDbTable_data *
+rdbmsDbTable_allocate_data(void)
+{
+ rdbmsDbTable_data *rtn = SNMP_MALLOC_TYPEDEF(rdbmsDbTable_data);
+
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_allocate_data","called\n"));
+
+ if(NULL == rtn) {
+ snmp_log(LOG_ERR, "unable to malloc memory for new "
+ "rdbmsDbTable_data.\n");
+ }
+
+ return rtn;
+} /* rdbmsDbTable_allocate_data */
+
+/*
+ * rdbmsDbTable_release_data
+ *
+ * Purpose: release rdbmsDbTable data.
+ */
+void
+rdbmsDbTable_release_data(rdbmsDbTable_data *data)
+{
+ DEBUGMSGTL(("verbose:rdbmsDbTable:rdbmsDbTable_release_data","called\n"));
+
+ free(data);
+} /* rdbmsDbTable_release_data */
+
+/* *********************************************************************
+ * @internal
+ * allocate resources for a rdbmsDbTable_rowreq_ctx
+ */
+rdbmsDbTable_rowreq_ctx *
+rdbmsDbTable_allocate_rowreq_ctx(void)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ SNMP_MALLOC_TYPEDEF(rdbmsDbTable_rowreq_ctx);
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:rdbmsDbTable_allocate_rowreq_ctx","called\n"));
+
+ if(NULL == rowreq_ctx) {
+ snmp_log(LOG_ERR,"Couldn't allocate memory for a "
+ "rdbmsDbTable_rowreq_ctx.\n");
+ }
+
+ rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;
+
+ rowreq_ctx->rdbmsDbTable_data_list = NULL;
+ rowreq_ctx->rdbmsDbTable_reg = rdbmsDbTable_if_ctx.user_ctx;
+
+
+ return rowreq_ctx;
+} /* rdbmsDbTable_allocate_rowreq_ctx */
+
+/*
+ * @internal
+ * release resources for a rdbmsDbTable_rowreq_ctx
+ */
+void
+rdbmsDbTable_release_rowreq_ctx(rdbmsDbTable_rowreq_ctx *rowreq_ctx)
+{
+ DEBUGMSGTL(("internal:rdbmsDbTable:rdbmsDbTable_release_rowreq_ctx","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+
+ if(rowreq_ctx->undo)
+ rdbmsDbTable_release_data(rowreq_ctx->undo);
+
+ /*
+ * free index oid pointer
+ */
+ if(rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
+ free(rowreq_ctx->oid_idx.oids);
+
+ SNMP_FREE(rowreq_ctx);
+} /* rdbmsDbTable_release_rowreq_ctx */
+
+/**
+ * @internal
+ * wrapper
+ */
+static int
+_mfd_rdbmsDbTable_pre_request(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ int rc = rdbmsDbTable_pre_request(rdbmsDbTable_if_ctx.user_ctx);
+ if (MFD_SUCCESS != rc) {
+ /*
+ * nothing we can do about it but log it
+ */
+ DEBUGMSGTL(("internal:rdbmsDbTable","error %d from "
+ "rdbmsDbTable_pre_request\n", rc));
+ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+ }
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_pre_request */
+
+/**
+ * @internal
+ * wrapper
+ */
+static int
+_mfd_rdbmsDbTable_post_request(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx;
+ int rc = rdbmsDbTable_post_request(rdbmsDbTable_if_ctx.user_ctx);
+ if (MFD_SUCCESS != rc) {
+ /*
+ * nothing we can do about it but log it
+ */
+ DEBUGMSGTL(("internal:rdbmsDbTable","error %d from "
+ "rdbmsDbTable_post_request\n", rc));
+ }
+
+ /*
+ * if there are no errors, check for and handle row creation/deletion
+ */
+ rc = netsnmp_check_requests_error(requests);
+ if ((SNMP_ERR_NOERROR == rc) &&
+ (NULL !=
+ (rowreq_ctx = netsnmp_container_table_row_extract(requests)))) {
+ if (rowreq_ctx->rowreq_flags & MFD_ROW_CREATED) {
+ rowreq_ctx->rowreq_flags &= ~MFD_ROW_CREATED;
+ CONTAINER_INSERT(rdbmsDbTable_if_ctx.container, rowreq_ctx);
+ }
+ else if (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED) {
+ CONTAINER_REMOVE(rdbmsDbTable_if_ctx.container, rowreq_ctx);
+ rdbmsDbTable_release_rowreq_ctx(rowreq_ctx);
+ }
+ }
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_post_request */
+
+/**
+ * @internal
+ * wrapper
+ */
+static int
+_mfd_rdbmsDbTable_object_lookup(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_object_lookup","called\n"));
+
+ /*
+ * get our context from mfd
+ * rdbmsDbTable_interface_ctx *if_ctx =
+ * (rdbmsDbTable_interface_ctx *)reginfo->my_reg_void;
+ */
+
+ if(NULL == rowreq_ctx) {
+ netsnmp_request_set_error_all(requests, SNMP_ERR_NOCREATION);
+ }
+ else {
+ rdbmsDbTable_row_prep(rowreq_ctx);
+ }
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_object_lookup */
+
+/***********************************************************************
+ *
+ * GET processing
+ *
+ ***********************************************************************/
+/*
+ * @internal
+ * Retrieve the value for a particular column
+ */
+NETSNMP_STATIC_INLINE int
+_rdbmsDbTable_get_column( rdbmsDbTable_rowreq_ctx *rowreq_ctx,
+ netsnmp_variable_list *var, int column )
+{
+ int rc = SNMPERR_SUCCESS;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_get_column","called\n"));
+
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ switch(column) {
+
+ /* rdbmsDbPrivateMibOID(2)/OBJECTID/ASN_OBJECT_ID/oid(oid)//L/A/w/e/r/d/h */
+ case COLUMN_RDBMSDBPRIVATEMIBOID:
+ var->type = ASN_OBJECT_ID;
+rc = rdbmsDbPrivateMibOID_get(rowreq_ctx, (oid **)&var->val.string, &var->val_len );
+ break;
+
+ /* rdbmsDbVendorName(3)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H */
+ case COLUMN_RDBMSDBVENDORNAME:
+ var->type = ASN_OCTET_STR;
+rc = rdbmsDbVendorName_get(rowreq_ctx, (char **)&var->val.string, &var->val_len );
+ break;
+
+ /* rdbmsDbName(4)/DisplayString/ASN_OCTET_STR/char(char)//L/A/w/e/R/d/H */
+ case COLUMN_RDBMSDBNAME:
+ var->type = ASN_OCTET_STR;
+rc = rdbmsDbName_get(rowreq_ctx, (char **)&var->val.string, &var->val_len );
+ break;
+
+ /* rdbmsDbContact(5)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H */
+ case COLUMN_RDBMSDBCONTACT:
+ var->type = ASN_OCTET_STR;
+rc = rdbmsDbContact_get(rowreq_ctx, (char **)&var->val.string, &var->val_len );
+ break;
+
+ default:
+ snmp_log(LOG_ERR,"unknown column %d in _rdbmsDbTable_get_column\n", column);
+ break;
+ }
+
+ return rc;
+} /* _rdbmsDbTable_get_column */
+
+int
+_mfd_rdbmsDbTable_get_values(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+ netsnmp_table_request_info * tri;
+ u_char * old_string;
+ void (*dataFreeHook)(void *);
+ int rc;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_get_values","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ for(;requests; requests = requests->next) {
+ /*
+ * save old pointer, so we can free it if replaced
+ */
+ old_string = requests->requestvb->val.string;
+ dataFreeHook = requests->requestvb->dataFreeHook;
+ if(NULL == requests->requestvb->val.string) {
+ requests->requestvb->val.string = requests->requestvb->buf;
+ requests->requestvb->val_len = sizeof(requests->requestvb->buf);
+ }
+ else if(requests->requestvb->buf == requests->requestvb->val.string) {
+ if(requests->requestvb->val_len != sizeof(requests->requestvb->buf))
+ requests->requestvb->val_len = sizeof(requests->requestvb->buf);
+ }
+
+ /*
+ * get column data
+ */
+ tri = netsnmp_extract_table_info(requests);
+ if(NULL == tri)
+ continue;
+
+ rc = _rdbmsDbTable_get_column(rowreq_ctx, requests->requestvb, tri->colnum);
+ if(rc) {
+ if(MFD_SKIP == rc) {
+ requests->requestvb->type = ASN_PRIV_RETRY;
+ rc = SNMP_ERR_NOERROR;
+ }
+ }
+ else if (NULL == requests->requestvb->val.string) {
+ snmp_log(LOG_ERR,"NULL varbind data pointer!\n");
+ rc = SNMP_ERR_GENERR;
+ }
+ if(rc)
+ netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
+
+ /*
+ * if the buffer wasn't used previously for the old data (i.e. it
+ * was allcoated memory) and the get routine replaced the pointer,
+ * we need to free the previous pointer.
+ */
+ if(old_string && (old_string != requests->requestvb->buf) &&
+ (requests->requestvb->val.string != old_string)) {
+ if(dataFreeHook)
+ (*dataFreeHook)(old_string);
+ else
+ free(old_string);
+ }
+ } /* for results */
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_get_values */
+
+/***********************************************************************
+ *
+ * SET processing
+ *
+ ***********************************************************************/
+
+/*----------------------------------------------------------------------
+ *
+ * SET: Syntax checks
+ *
+ *---------------------------------------------------------------------*/
+/*
+ * @internal
+ * Check the syntax for a particular column
+ */
+NETSNMP_STATIC_INLINE int
+_rdbmsDbTable_check_column( rdbmsDbTable_rowreq_ctx *rowreq_ctx,
+ netsnmp_variable_list *var, int column )
+{
+ int rc = SNMPERR_SUCCESS;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_rdbmsDbTable_check_column","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ switch(column) {
+
+ /* rdbmsDbContact(5)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H */
+ case COLUMN_RDBMSDBCONTACT:
+ rc = netsnmp_check_vb_type( var, ASN_OCTET_STR );
+ if(SNMPERR_SUCCESS == rc) {
+ /* check that the value is in the defined range(s); inefficent
+ * but keeps rc value knowledge in libarary where it belongs. */
+ if( 1
+ && ((rc = netsnmp_check_vb_size_range(var, 0,255)) != SNMP_ERR_NOERROR)
+ ) {
+ ; /* rc set in condition */
+ }
+ }
+ if(SNMPERR_SUCCESS == rc) {
+ rc = rdbmsDbContact_check_value( rowreq_ctx, (char *)var->val.string, var->val_len );
+ if((MFD_SUCCESS != rc) && (MFD_NOT_VALID_EVER != rc) &&
+ (MFD_NOT_VALID_NOW != rc)) {
+ snmp_log(LOG_ERR, "bad rc %d from rdbmsDbContact_check_value\n", rc);
+ rc = SNMP_ERR_GENERR;
+ }
+ }
+ break;
+
+ default: /** We shouldn't get here */
+ rc = SNMP_ERR_GENERR;
+ snmp_log(LOG_ERR, "unknown column %d in _rdbmsDbTable_check_column\n", column);
+ }
+
+ return rc;
+} /* _rdbmsDbTable_check_column */
+
+int
+_mfd_rdbmsDbTable_check_objects(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+ netsnmp_table_request_info * tri;
+ int rc;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_check_objects","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ for(;requests; requests = requests->next) {
+
+ /*
+ * get column number from table request info, and check that column
+ */
+ tri = netsnmp_extract_table_info(requests);
+ if(NULL == tri)
+ continue;
+
+ rc = _rdbmsDbTable_check_column(rowreq_ctx, requests->requestvb, tri->colnum);
+ if(rc) {
+ netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));
+ break;
+ }
+
+ } /* for results */
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_check_objects */
+
+
+
+/*----------------------------------------------------------------------
+ *
+ * SET: check dependencies
+ *
+ *---------------------------------------------------------------------*/
+/*
+ * @internal
+ * Check dependencies wrapper
+ */
+static int
+_mfd_rdbmsDbTable_check_dependencies(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ int rc;
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_check_dependencies","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ rc = rdbmsDbTable_check_dependencies(rowreq_ctx);
+ if(rc){
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_check_dependencies\n", rc));
+ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+ }
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_check_dependencies */
+
+/*----------------------------------------------------------------------
+ *
+ * SET: Undo setup
+ *
+ *---------------------------------------------------------------------*/
+/*
+ * @internal
+ * Set the value for a particular column
+ */
+NETSNMP_STATIC_INLINE int
+_rdbmsDbTable_undo_setup_column( rdbmsDbTable_rowreq_ctx *rowreq_ctx, int column )
+{
+ int rc = SNMPERR_SUCCESS;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_rdbmsDbTable_undo_setup_column","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ switch(column) {
+
+ /* rdbmsDbContact(5)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H */
+ case COLUMN_RDBMSDBCONTACT:
+ rowreq_ctx->column_set_flags |= FLAG_RDBMSDBCONTACT;
+ rc = rdbmsDbContact_undo_setup(rowreq_ctx );
+ break;
+
+ default:
+ snmp_log(LOG_ERR,"unknown column %d in _rdbmsDbTable_undo_setup_column\n", column);
+ break;
+ }
+
+ return rc;
+} /* _rdbmsDbTable_undo_setup_column */
+
+
+/**
+ * @internal
+ * undo setup
+ */
+int
+_mfd_rdbmsDbTable_undo_setup(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ int rc;
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_undo_setup","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * allocate undo context
+ */
+ rowreq_ctx->undo = rdbmsDbTable_allocate_data();
+ if(NULL == rowreq_ctx->undo) {
+ /** msg already logged */
+ netsnmp_request_set_error_all(requests, SNMP_ERR_RESOURCEUNAVAILABLE);
+ return SNMP_ERR_NOERROR;
+ }
+
+ /*
+ * row undo setup
+ */
+ rowreq_ctx->column_set_flags = 0;
+ rc = rdbmsDbTable_undo_setup(rowreq_ctx);
+ if (MFD_SUCCESS != rc) {
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_undo_setup\n", rc));
+ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+ }
+ else {
+ /*
+ * column undo setup
+ */
+ netsnmp_table_request_info * tri;
+ for(;requests; requests = requests->next) {
+ /*
+ * set column data
+ */
+ tri = netsnmp_extract_table_info(requests);
+ if(NULL == tri)
+ continue;
+
+ rc = _rdbmsDbTable_undo_setup_column(rowreq_ctx, tri->colnum);
+ if(MFD_SUCCESS != rc) {
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_undo_setup_column\n", rc));
+ netsnmp_set_request_error(agtreq_info, requests, SNMP_VALIDATE_ERR(rc));
+ }
+ } /* for results */
+ }
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_undo_setup */
+
+/**
+ * @internal
+ * undo setup
+ */
+int
+_mfd_rdbmsDbTable_undo_cleanup(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+ int rc;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_undo_cleanup","called\n"));
+
+ /*
+ * failed row create in early stages has no rowreq_ctx
+ */
+ if (NULL == rowreq_ctx)
+ return MFD_SUCCESS;
+
+ /*
+ * call user cleanup
+ */
+ rc = rdbmsDbTable_undo_cleanup(rowreq_ctx);
+ if (MFD_SUCCESS != rc) {
+ /*
+ * nothing we can do about it but log it
+ */
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_undo_cleanup\n", rc));
+ }
+
+ /*
+ * release undo context, if needed
+ */
+ if(rowreq_ctx->undo) {
+ rdbmsDbTable_release_data(rowreq_ctx->undo);
+ rowreq_ctx->undo = NULL;
+ }
+
+ /*
+ * clear set flags
+ */
+ rowreq_ctx->column_set_flags = 0;
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_undo_cleanup */
+
+/*----------------------------------------------------------------------
+ *
+ * SET: Set values
+ *
+ *---------------------------------------------------------------------*/
+/*
+ * @internal
+ * Set the value for a particular column
+ */
+NETSNMP_STATIC_INLINE int
+_rdbmsDbTable_set_column( rdbmsDbTable_rowreq_ctx *rowreq_ctx,
+ netsnmp_variable_list *var, int column )
+{
+ int rc = SNMPERR_SUCCESS;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_rdbmsDbTable_set_column","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ switch(column) {
+
+ /* rdbmsDbContact(5)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H */
+ case COLUMN_RDBMSDBCONTACT:
+ rowreq_ctx->column_set_flags |= FLAG_RDBMSDBCONTACT;
+ rc = rdbmsDbContact_set(rowreq_ctx, (char *)var->val.string, var->val_len );
+ break;
+
+ default:
+ snmp_log(LOG_ERR,"unknown column %d in _rdbmsDbTable_set_column\n", column);
+ break;
+ }
+
+ return rc;
+} /* _rdbmsDbTable_set_column */
+
+int
+_mfd_rdbmsDbTable_set_values(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+ netsnmp_table_request_info * tri;
+ int rc = SNMP_ERR_NOERROR;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_set_values","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ rowreq_ctx->column_set_flags = 0;
+ for(;requests; requests = requests->next) {
+ /*
+ * set column data
+ */
+ tri = netsnmp_extract_table_info(requests);
+ if(NULL == tri)
+ continue;
+
+ rc = _rdbmsDbTable_set_column(rowreq_ctx,
+ requests->requestvb, tri->colnum);
+ if(MFD_SUCCESS != rc) {
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_set_column\n", rc));
+ netsnmp_set_request_error(agtreq_info, requests, SNMP_VALIDATE_ERR(rc));
+ }
+ } /* for results */
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_set_values */
+
+/*----------------------------------------------------------------------
+ *
+ * SET: commit
+ *
+ *---------------------------------------------------------------------*/
+/**
+ * @internal
+ * commit the values
+ */
+int
+_mfd_rdbmsDbTable_commit(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ int rc;
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_commit","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ rc = rdbmsDbTable_commit(rowreq_ctx);
+ if (MFD_SUCCESS != rc) {
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_commit\n", rc));
+ netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
+ }
+
+ return SNMP_ERR_NOERROR;
+}
+
+int
+_mfd_rdbmsDbTable_undo_commit(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ int rc;
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_undo_commit","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ rc = rdbmsDbTable_undo_commit(rowreq_ctx);
+ if (MFD_SUCCESS != rc) {
+ /*
+ * nothing we can do about it but log it
+ */
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_undo_commit\n", rc));
+ }
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_commit */
+
+/*----------------------------------------------------------------------
+ *
+ * SET: Undo
+ *
+ *---------------------------------------------------------------------*/
+/**
+ * @internal
+ * undo the value for a particular column
+ */
+NETSNMP_STATIC_INLINE int
+_rdbmsDbTable_undo_column( rdbmsDbTable_rowreq_ctx *rowreq_ctx,
+ netsnmp_variable_list *var, int column )
+{
+ int rc = SNMPERR_SUCCESS;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_rdbmsDbTable_undo_column","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ switch(column) {
+
+ /* rdbmsDbContact(5)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H */
+ case COLUMN_RDBMSDBCONTACT:
+ rc = rdbmsDbContact_undo(rowreq_ctx);
+ break;
+
+ default:
+ snmp_log(LOG_ERR,"unknown column %d in _rdbmsDbTable_undo_column\n", column);
+ break;
+ }
+
+ return rc;
+} /* _rdbmsDbTable_undo_column */
+
+int
+_mfd_rdbmsDbTable_undo_values(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *agtreq_info,
+ netsnmp_request_info *requests)
+{
+ int rc;
+ rdbmsDbTable_rowreq_ctx *rowreq_ctx =
+ netsnmp_container_table_row_extract(requests);
+ netsnmp_table_request_info * tri;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_mfd_rdbmsDbTable_undo_values","called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ for(;requests; requests = requests->next) {
+ /*
+ * set column data
+ */
+ tri = netsnmp_extract_table_info(requests);
+ if(NULL == tri)
+ continue;
+
+ rc = _rdbmsDbTable_undo_column(rowreq_ctx, requests->requestvb,
+ tri->colnum);
+ if (MFD_SUCCESS != rc) {
+ /*
+ * nothing we can do about it but log it
+ */
+ DEBUGMSGTL(("verbose:rdbmsDbTable:mfd","error %d from "
+ "rdbmsDbTable_undo_column\n", rc));
+ }
+ } /* for results */
+
+ return SNMP_ERR_NOERROR;
+} /* _mfd_rdbmsDbTable_undo_values */
+
+/***********************************************************************
+ *
+ * DATA ACCESS
+ *
+ ***********************************************************************/
+/**
+ * @internal
+ */
+static int
+_cache_load(netsnmp_cache *cache, void *vmagic)
+{
+ DEBUGMSGTL(("internal:rdbmsDbTable:_cache_load","called\n"));
+
+ if((NULL == cache) || (NULL == cache->magic)) {
+ snmp_log(LOG_ERR, "invalid cache for rdbmsDbTable_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 rdbmsDbTable_cache_load((netsnmp_container*)cache->magic);
+} /* _cache_load */
+
+/**
+ * @internal
+ */
+static void
+_cache_item_free(rdbmsDbTable_rowreq_ctx *rowreq_ctx, void *context)
+{
+ DEBUGMSGTL(("internal:rdbmsDbTable:_cache_item_free","called\n"));
+
+ if(NULL == rowreq_ctx)
+ return;
+
+ rdbmsDbTable_release_rowreq_ctx(rowreq_ctx);
+} /* _cache_item_free */
+
+/**
+ * @internal
+ */
+static void
+_cache_free(netsnmp_cache *cache, void *magic)
+{
+ netsnmp_container *container;
+
+ DEBUGMSGTL(("internal:rdbmsDbTable:_cache_free","called\n"));
+
+ if((NULL == cache) || (NULL == cache->magic)) {
+ snmp_log(LOG_ERR, "invalid cache in rdbmsDbTable_cache_free\n");
+ return;
+ }
+
+ container = (netsnmp_container*)cache->magic;
+
+ /*
+ * call user code
+ */
+ rdbmsDbTable_cache_free(container);
+
+ /*
+ * free all items. inefficient, but easy.
+ */
+ CONTAINER_CLEAR(container,
+ (netsnmp_container_obj_func *)_cache_item_free,
+ NULL);
+} /* _cache_free */
+
+/**
+ * @internal
+ * initialize the iterator container with functions or wrappers
+ */
+void
+_rdbmsDbTable_container_init(rdbmsDbTable_interface_ctx *if_ctx)
+{
+ DEBUGMSGTL(("internal:rdbmsDbTable:_rdbmsDbTable_container_init","called\n"));
+
+ /*
+ * set up the cache
+ */
+ if_ctx->cache = netsnmp_cache_create(30, /* timeout in seconds */
+ _cache_load, _cache_free,
+ rdbmsDbTable_oid,
+ rdbmsDbTable_oid_size);
+
+ if(NULL == if_ctx->cache) {
+ snmp_log(LOG_ERR, "error creating cache for rdbmsDbTable\n");
+ return;
+ }
+
+ if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
+
+ rdbmsDbTable_container_init(&if_ctx->container, if_ctx->cache);
+ if(NULL == if_ctx->container)
+ if_ctx->container = netsnmp_container_find("rdbmsDbTable:table_container");
+ if(NULL == if_ctx->container) {
+ snmp_log(LOG_ERR,"error creating container in "
+ "rdbmsDbTable_container_init\n");
+ return;
+ }
+ if_ctx->cache->magic = (void*)if_ctx->container;
+} /* _rdbmsDbTable_container_init */
+
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.h b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.h
new file mode 100644
index 0000000..2d74fdc
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_interface.h
@@ -0,0 +1,50 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_interface.h
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_interface.h,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RDBMSDBTABLE_INTERFACE_H
+#define RDBMSDBTABLE_INTERFACE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include "rdbmsDbTable.h"
+
+/* ********************************************************************
+ * Table declarations
+ */
+
+/* PUBLIC interface initialization routine */
+void _rdbmsDbTable_initialize_interface(rdbmsDbTable_registration_ptr user_ctx,
+ u_long flags);
+
+ rdbmsDbTable_rowreq_ctx * rdbmsDbTable_allocate_rowreq_ctx(void);
+void rdbmsDbTable_release_rowreq_ctx(rdbmsDbTable_rowreq_ctx *rowreq_ctx);
+
+int rdbmsDbTable_index_to_oid(netsnmp_index *oid_idx,
+ rdbmsDbTable_mib_index *mib_idx);
+int rdbmsDbTable_index_from_oid(netsnmp_index *oid_idx,
+ rdbmsDbTable_mib_index *mib_idx);
+
+/*
+ * access to certain internals. use with caution!
+ */
+void rdbmsDbTable_valid_columns_set(netsnmp_column_info *vc);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RDBMSDBTABLE_INTERFACE_H */
diff --git a/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_oids.h b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_oids.h
new file mode 100644
index 0000000..8d80497
--- /dev/null
+++ b/RDBMS-MIB_src/rdbmsDbTable/rdbmsDbTable_oids.h
@@ -0,0 +1,46 @@
+/*-------------------------------------------------------------------------
+ * rdbmsDbTable_oids.h
+ *
+ * RDBMSMIB mib module.
+ *
+ * Copyright (c) 2004-2007, PostgreSQL Global Development Group
+ * Author: Joshua Tolley
+ *
+ * $Id: rdbmsDbTable_oids.h,v 1.2 2007/09/13 14:20:43 h-saito Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RDBMSDBTABLE_OIDS_H
+#define RDBMSDBTABLE_OIDS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* column number definitions for table rdbmsDbTable */
+#define RDBMSDBTABLE_OID 1,3,6,1,2,1,39,1,1
+#define COLUMN_RDBMSDBINDEX 1
+#define COLUMN_RDBMSDBPRIVATEMIBOID 2
+#define COLUMN_RDBMSDBVENDORNAME 3
+#define COLUMN_RDBMSDBNAME 4
+#define COLUMN_RDBMSDBCONTACT 5
+
+#define RDBMSDBTABLE_MIN_COL COLUMN_RDBMSDBPRIVATEMIBOID
+#define RDBMSDBTABLE_MAX_COL COLUMN_RDBMSDBCONTACT
+
+ /*
+ * change flags for writable columns
+ */
+#define FLAG_RDBMSDBCONTACT (0x1 << 0)
+
+#define FLAG_MAX_RDBMSDBTABLE 1
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RDBMSDBTABLE_OIDS_H */