summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis Fernando Muñoz Mejías <Luis.Fernando.Munoz.Mejias@cern.ch>2009-03-25 18:16:24 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2009-03-25 18:46:23 +0100
commit97480eafbc67ec7e84497868a1777ce0d7881e6c (patch)
treee99c6a5e2fc3c1239d7c6135ff4752aceb6a0590
parent611b3364491cf30dc866932a053ae925e1f182ac (diff)
downloadrsyslog-97480eafbc67ec7e84497868a1777ce0d7881e6c.tar.gz
rsyslog-97480eafbc67ec7e84497868a1777ce0d7881e6c.tar.xz
rsyslog-97480eafbc67ec7e84497868a1777ce0d7881e6c.zip
Start the output module for Oracle.
Currently, resources are allocated, freed and the code compiles. No tests yet.
-rw-r--r--plugins/omoracle/Makefile.am8
-rw-r--r--plugins/omoracle/omoracle.c139
-rw-r--r--plugins/omoracle/omoracle.h23
3 files changed, 170 insertions, 0 deletions
diff --git a/plugins/omoracle/Makefile.am b/plugins/omoracle/Makefile.am
new file mode 100644
index 00000000..6b75218f
--- /dev/null
+++ b/plugins/omoracle/Makefile.am
@@ -0,0 +1,8 @@
+pkglib_LTLIBRARIES = omoracle.la
+
+omoracle_la_SOURCES = omoracle.c omoracle.h
+omoracle_la_CPPFLAGS = $(RSRT_CFLAGS) $(PTHREADS_CFLAGS) $(ORACLE_CFLAGS)
+omoracle_la_LDFLAGS = -module -avoid-version
+omoracle_la_LIBADD = $(ORACLE_LIBS)
+
+EXTRA_DIST =
diff --git a/plugins/omoracle/omoracle.c b/plugins/omoracle/omoracle.c
new file mode 100644
index 00000000..696cd908
--- /dev/null
+++ b/plugins/omoracle/omoracle.c
@@ -0,0 +1,139 @@
+/** omoracle.c
+
+ This is an output module feeding directly to an Oracle
+ database. It uses Oracle Call Interface, a propietary module
+ provided by Oracle.
+
+ Author: Luis Fernando Muñoz Mejías
+ <Luis.Fernando.Munoz.Mejias@cern.ch>
+
+ This file is part of rsyslog.
+*/
+#include "config.h"
+#include "rsyslog.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <oci.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <time.h>
+#include <assert.h>
+#include "dirty.h"
+#include "syslogd-types.h"
+#include "srUtils.h"
+#include "template.h"
+#include "module-template.h"
+#include "errmsg.h"
+#include "cfsysline.h"
+#include "omoracle.h"
+
+MODULE_TYPE_OUTPUT
+
+/** */
+DEF_OMOD_STATIC_DATA
+DEFobjCurrIf(errmsg)
+
+typedef struct _instanceData {
+ OCIEnv* environment;
+ OCISession* session;
+ OCIError* error;
+ OCIServer* server;
+ OCIStmt* statement;
+ OCISvcCtx* service;
+ OCIAuthInfo* authinfo;
+ OCIBind* binding;
+} instanceData;
+
+/** Generic function for handling errors from OCI.
+
+ It will be called only inside CHECKERR and CHECKENV macros.
+
+ Arguments: handle The error or environment handle to check.
+ htype: OCI_HTYPE_* constant, usually OCI_HTYPE_ERROR or
+ OCI_HTYPE_ENV
+ status: status code to check, usually the return value of an OCI
+ function.
+
+ Returns OCI_SUCCESS on success, OCI_ERROR otherwise.
+*/
+static int oci_errors(void* handle, ub4 htype, sword status)
+{
+ sb4 errcode;
+ char buf[MAX_BUFSIZE];
+
+ switch (status) {
+ case OCI_SUCCESS:
+ return OCI_SUCCESS;
+ break;
+ case OCI_SUCCESS_WITH_INFO:
+ printf ("OCI SUCCESS - With info\n");
+ break;
+ case OCI_NEED_DATA:
+ printf ("OCI NEEDS MORE DATA\n");
+ break;
+ case OCI_ERROR:
+ printf ("OCI GENERAL ERROR\n");
+ if (handle) {
+ OCIErrorGet(handle, 1, NULL, &errcode, buf, sizeof buf, htype);
+ printf ("Error message: %s", buf);
+ } else
+ printf ("NULL handle\n"
+ "Unable to extract further information");
+ break;
+ case OCI_INVALID_HANDLE:
+ printf ("OCI INVALID HANDLE\n");
+ break;
+ case OCI_STILL_EXECUTING:
+ printf ("Still executing...\n");
+ break;
+ case OCI_CONTINUE:
+ printf ("OCI CONTINUE\n");
+ break;
+ }
+ return OCI_ERROR;
+}
+
+
+/* Resource allocation */
+BEGINcreateInstance
+CODESTARTcreateInstance
+CHECKENV(pData->environment,
+ OCIEnvCreate(&(pData->environment), OCI_DEFAULT,
+ NULL, NULL, NULL, NULL, 0, NULL));
+CHECKENV(pData->environment,
+ OCIHandleAlloc(pData->environment, &(pData->error),
+ OCI_HTYPE_ERROR, 0, NULL));
+CHECKENV(pData->environment,
+ OCIHandleAlloc(pData->environment, &(pData->server),
+ OCI_HTYPE_SERVER, 0, NULL));
+CHECKENV(pData->environment,
+ OCIHandleAlloc(pData->environment, &(pData->service),
+ OCI_HTYPE_SVCCTX, 0, NULL));
+CHECKENV(pData->environment,
+ OCIHandleAlloc(pData->environment, &(pData->authinfo),
+ OCI_HTYPE_AUTHINFO, 0, NULL));
+finalize_it:
+ENDcreateInstance
+
+/** Free any resources allocated by createInstance. */
+BEGINfreeInstance
+CODESTARTfreeInstance
+
+OCIHandleFree(pData->environment, OCI_HTYPE_ENV);
+OCIHandleFree(pData->error, OCI_HTYPE_ERROR);
+OCIHandleFree(pData->server, OCI_HTYPE_SERVER);
+OCIHandleFree(pData->service, OCI_HTYPE_SVCCTX);
+OCIHandleFree(pData->authinfo, OCI_HTYPE_AUTHINFO);
+
+RETiRet;
+
+ENDfreeInstance
+
+/* BEGINmodInit() */
+/* CODESTARTmodInit */
+/* *ipIFVersProvided = CURR_MOD_IF_VERSION; */
+/* CODEmodInit_QueryRegCFSLineHdlr */
+/* CHKiRet(objUse(errmsg, CORE_COMPONENT)); */
+/* ENDmodInit */
diff --git a/plugins/omoracle/omoracle.h b/plugins/omoracle/omoracle.h
new file mode 100644
index 00000000..b0e70917
--- /dev/null
+++ b/plugins/omoracle/omoracle.h
@@ -0,0 +1,23 @@
+/** Definitions for the Oracle output module.
+
+ This module needs OCI to be installed (on Red Hat-like systems
+ this is usually the oracle-instantclient-devel RPM).
+
+ Author: Luis Fernando Muñoz Mejías <Luis.Fernando.Munoz.Mejias@cern.ch>
+*/
+#ifndef __OMORACLEH__
+#define __OMORACLEH__
+
+/** Macros to make error handling easier. */
+
+/** Checks for errors on the OCI handling. */
+#define CHECKERR(handle,status) CHKiRet(oci_errors((handle), \
+ OCI_HTYPE_ERROR, (status)))
+
+/** Checks for errors when handling the environment of OCI. */
+#define CHECKENV(handle,status) CHKiRet(oci_errors((handle), \
+ OCI_HTYPE_ENV, (status)))
+
+enum { MAX_BUFSIZE = 2048 };
+
+#endif