X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Foracle.c;h=80ae699c169b5cc1aa268a931e76515b3db83b89;hb=b4c8f3f762d666742c774ab3b45815e5a416e5da;hp=2f218519e34bfcc30faf29847eba91c00961e2e2;hpb=97a1b92446be5e0ebb68d25ec8b94743f2ac12fb;p=collectd.git diff --git a/src/oracle.c b/src/oracle.c index 2f218519..80ae699c 100644 --- a/src/oracle.c +++ b/src/oracle.c @@ -1,6 +1,7 @@ /** * collectd - src/oracle.c - * Copyright (C) 2008,2009 Florian octo Forster + * Copyright (C) 2008,2009 noris network AG + * Copyright (C) 2012 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -41,7 +42,7 @@ * affiliates. Other names may be trademarks of their respective owners. * * Authors: - * Florian octo Forster + * Florian octo Forster **/ #include "collectd.h" @@ -85,38 +86,58 @@ OCIError *oci_error = NULL; * Functions */ static void o_report_error (const char *where, /* {{{ */ + const char *db_name, const char *query_name, const char *what, OCIError *eh) { char buffer[2048]; sb4 error_code; int status; + unsigned int record_number; - status = OCIErrorGet (eh, /* record number = */ 1, - /* sqlstate = */ NULL, - &error_code, - (text *) &buffer[0], - (ub4) sizeof (buffer), - OCI_HTYPE_ERROR); - buffer[sizeof (buffer) - 1] = 0; + if (db_name == NULL) + db_name = "(none)"; + if (query_name == NULL) + query_name = "(none)"; - if (status == OCI_SUCCESS) + /* An operation may cause / return multiple errors. Loop until we have + * handled all errors available (with a fail-save limit of 16). */ + for (record_number = 1; record_number <= 16; record_number++) { - size_t buffer_length; + memset (buffer, 0, sizeof (buffer)); + error_code = -1; - buffer_length = strlen (buffer); - while ((buffer_length > 0) && (buffer[buffer_length - 1] < 32)) + status = OCIErrorGet (eh, (ub4) record_number, + /* sqlstate = */ NULL, + &error_code, + (text *) &buffer[0], + (ub4) sizeof (buffer), + OCI_HTYPE_ERROR); + buffer[sizeof (buffer) - 1] = 0; + + if (status == OCI_NO_DATA) + return; + + if (status == OCI_SUCCESS) { - buffer_length--; - buffer[buffer_length] = 0; - } + size_t buffer_length; - ERROR ("oracle plugin: %s: %s failed: %s", - where, what, buffer); - } - else - { - ERROR ("oracle plugin: %s: %s failed. Additionally, OCIErrorGet failed with status %i.", - where, what, status); + buffer_length = strlen (buffer); + while ((buffer_length > 0) && (buffer[buffer_length - 1] < 32)) + { + buffer_length--; + buffer[buffer_length] = 0; + } + + ERROR ("oracle plugin: %s (db = %s, query = %s): %s failed: %s", + where, db_name, query_name, what, buffer); + } + else + { + ERROR ("oracle plugin: %s (db = %s, query = %s): %s failed. " + "Additionally, OCIErrorGet failed with status %i.", + where, db_name, query_name, what, status); + return; + } } } /* }}} void o_report_error */ @@ -414,7 +435,8 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ OCI_HTYPE_STMT, /* user_data_size = */ 0, /* user_data = */ NULL); if (status != OCI_SUCCESS) { - o_report_error ("o_read_database_query", "OCIHandleAlloc", oci_error); + o_report_error ("o_read_database_query", db->name, + udb_query_get_name (q), "OCIHandleAlloc", oci_error); oci_statement = NULL; return (-1); } @@ -425,7 +447,8 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ /* mode = */ OCI_DEFAULT); if (status != OCI_SUCCESS) { - o_report_error ("o_read_database_query", "OCIStmtPrepare", oci_error); + o_report_error ("o_read_database_query", db->name, + udb_query_get_name (q), "OCIStmtPrepare", oci_error); OCIHandleFree (oci_statement, OCI_HTYPE_STMT); oci_statement = NULL; return (-1); @@ -449,10 +472,8 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ /* mode = */ OCI_DEFAULT); if (status != OCI_SUCCESS) { - DEBUG ("oracle plugin: o_read_database_query: status = %i (%#x)", status, status); - o_report_error ("o_read_database_query", "OCIStmtExecute", oci_error); - ERROR ("oracle plugin: o_read_database_query: " - "Failing statement was: %s", udb_query_get_statement (q)); + o_report_error ("o_read_database_query", db->name, udb_query_get_name (q), + "OCIStmtExecute", oci_error); return (-1); } /* }}} */ @@ -465,7 +486,8 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ OCI_ATTR_PARAM_COUNT, oci_error); if (status != OCI_SUCCESS) { - o_report_error ("o_read_database_query", "OCIAttrGet", oci_error); + o_report_error ("o_read_database_query", db->name, + udb_query_get_name (q), "OCIAttrGet", oci_error); return (-1); } /* }}} */ @@ -543,8 +565,10 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ if (status != OCI_SUCCESS) { /* This is probably alright */ - DEBUG ("oracle plugin: o_read_database_query: status = %#x (= %i);", status, status); - o_report_error ("o_read_database_query", "OCIParamGet", oci_error); + DEBUG ("oracle plugin: o_read_database_query: status = %#x (= %i);", + status, status); + o_report_error ("o_read_database_query", db->name, + udb_query_get_name (q), "OCIParamGet", oci_error); status = OCI_SUCCESS; break; } @@ -555,11 +579,15 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ &column_name, &column_name_length, OCI_ATTR_NAME, oci_error); if (status != OCI_SUCCESS) { - o_report_error ("o_read_database_query", "OCIAttrGet (OCI_ATTR_NAME)", - oci_error); + OCIDescriptorFree (oci_param, OCI_DTYPE_PARAM); + o_report_error ("o_read_database_query", db->name, + udb_query_get_name (q), "OCIAttrGet (OCI_ATTR_NAME)", oci_error); continue; } + OCIDescriptorFree (oci_param, OCI_DTYPE_PARAM); + oci_param = NULL; + /* Copy the name to column_names. Warning: The ``string'' returned by OCI * may not be null terminated! */ memset (column_names[i], 0, DATA_MAX_NAME_LEN); @@ -578,7 +606,8 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ NULL, NULL, NULL, OCI_DEFAULT); if (status != OCI_SUCCESS) { - o_report_error ("o_read_database_query", "OCIDefineByPos", oci_error); + o_report_error ("o_read_database_query", db->name, + udb_query_get_name (q), "OCIDefineByPos", oci_error); continue; } } /* for (j = 1; j <= param_counter; j++) */ @@ -586,7 +615,7 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ status = udb_query_prepare_result (q, prep_area, hostname_g, /* plugin = */ "oracle", db->name, column_names, column_num, - /* interval = */ -1); + /* interval = */ 0); if (status != 0) { ERROR ("oracle plugin: o_read_database_query (%s, %s): " @@ -609,7 +638,8 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ } else if ((status != OCI_SUCCESS) && (status != OCI_SUCCESS_WITH_INFO)) { - o_report_error ("o_read_database_query", "OCIStmtFetch2", oci_error); + o_report_error ("o_read_database_query", db->name, + udb_query_get_name (q), "OCIStmtFetch2", oci_error); break; } @@ -646,7 +676,8 @@ static int o_read_database (o_database_t *db) /* {{{ */ OCI_ATTR_SERVER, oci_error); if (status != OCI_SUCCESS) { - o_report_error ("o_read_database", "OCIAttrGet", oci_error); + o_report_error ("o_read_database", db->name, NULL, "OCIAttrGet", + oci_error); return (-1); } @@ -662,7 +693,8 @@ static int o_read_database (o_database_t *db) /* {{{ */ OCI_ATTR_SERVER_STATUS, oci_error); if (status != OCI_SUCCESS) { - o_report_error ("o_read_database", "OCIAttrGet", oci_error); + o_report_error ("o_read_database", db->name, NULL, "OCIAttrGet", + oci_error); return (-1); } } @@ -683,14 +715,22 @@ static int o_read_database (o_database_t *db) /* {{{ */ (OraText *) db->username, (ub4) strlen (db->username), (OraText *) db->password, (ub4) strlen (db->password), (OraText *) db->connect_id, (ub4) strlen (db->connect_id)); - if (status != OCI_SUCCESS) + if ((status != OCI_SUCCESS) && (status != OCI_SUCCESS_WITH_INFO)) { - o_report_error ("o_read_database", "OCILogon", oci_error); + char errfunc[256]; + + ssnprintf (errfunc, sizeof (errfunc), "OCILogon(\"%s\")", db->connect_id); + + o_report_error ("o_read_database", db->name, NULL, errfunc, oci_error); DEBUG ("oracle plugin: OCILogon (%s): db->oci_service_context = %p;", db->connect_id, db->oci_service_context); db->oci_service_context = NULL; return (-1); } + else if (status == OCI_SUCCESS_WITH_INFO) + { + /* TODO: Print NOTIFY message. */ + } assert (db->oci_service_context != NULL); } @@ -737,6 +777,7 @@ static int o_shutdown (void) /* {{{ */ } OCIHandleFree (oci_env, OCI_HTYPE_ENV); + oci_env = NULL; udb_query_free (queries, queries_num); queries = NULL;