X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Foracle.c;h=86643ca3b09d608ca9272eec0b9d462c063d8f1f;hb=e44afcf744af2337983b41c6e7a3617595692ddd;hp=ec45996bdebfdda8e8a27d54eb125b8544d0afc7;hpb=26fbc23e518dcc74502ae3b2495112adc3840879;p=collectd.git diff --git a/src/oracle.c b/src/oracle.c index ec45996b..86643ca3 100644 --- a/src/oracle.c +++ b/src/oracle.c @@ -59,6 +59,7 @@ struct o_database_s { char *name; + char *host; char *connect_id; char *username; char *password; @@ -91,15 +92,16 @@ static void o_report_error (const char *where, /* {{{ */ char buffer[2048]; sb4 error_code; int status; + unsigned int record_number; /* An operation may cause / return multiple errors. Loop until we have - * handled all errors available. */ - while (42) + * handled all errors available (with a fail-save limit of 16). */ + for (record_number = 1; record_number <= 16; record_number++) { memset (buffer, 0, sizeof (buffer)); error_code = -1; - status = OCIErrorGet (eh, /* record number = */ 1, + status = OCIErrorGet (eh, (ub4) record_number, /* sqlstate = */ NULL, &error_code, (text *) &buffer[0], @@ -121,8 +123,7 @@ static void o_report_error (const char *where, /* {{{ */ buffer[buffer_length] = 0; } - ERROR ("oracle plugin: %s: %s failed: %s", - where, what, buffer); + ERROR ("oracle plugin: %s: %s failed: %s", where, what, buffer); } else { @@ -175,33 +176,6 @@ static void o_database_free (o_database_t *db) /* {{{ */ * */ -static int o_config_set_string (char **ret_string, /* {{{ */ - oconfig_item_t *ci) -{ - char *string; - - if ((ci->values_num != 1) - || (ci->values[0].type != OCONFIG_TYPE_STRING)) - { - WARNING ("oracle plugin: The `%s' config option " - "needs exactly one string argument.", ci->key); - return (-1); - } - - string = strdup (ci->values[0].value.string); - if (string == NULL) - { - ERROR ("oracle plugin: strdup failed."); - return (-1); - } - - if (*ret_string != NULL) - free (*ret_string); - *ret_string = string; - - return (0); -} /* }}} int o_config_set_string */ - static int o_config_add_database (oconfig_item_t *ci) /* {{{ */ { o_database_t *db; @@ -223,8 +197,13 @@ static int o_config_add_database (oconfig_item_t *ci) /* {{{ */ return (-1); } memset (db, 0, sizeof (*db)); + db->name = NULL; + db->host = NULL; + db->connect_id = NULL; + db->username = NULL; + db->password = NULL; - status = o_config_set_string (&db->name, ci); + status = cf_util_get_string (ci, &db->name); if (status != 0) { sfree (db); @@ -237,11 +216,13 @@ static int o_config_add_database (oconfig_item_t *ci) /* {{{ */ oconfig_item_t *child = ci->children + i; if (strcasecmp ("ConnectID", child->key) == 0) - status = o_config_set_string (&db->connect_id, child); + status = cf_util_get_string (child, &db->connect_id); + else if (strcasecmp ("Host", child->key) == 0) + status = cf_util_get_string (child, &db->host); else if (strcasecmp ("Username", child->key) == 0) - status = o_config_set_string (&db->username, child); + status = cf_util_get_string (child, &db->username); else if (strcasecmp ("Password", child->key) == 0) - status = o_config_set_string (&db->password, child); + status = cf_util_get_string (child, &db->password); else if (strcasecmp ("Query", child->key) == 0) status = udb_query_pick_from_list (child, queries, queries_num, &db->queries, &db->queries_num); @@ -601,7 +582,8 @@ static int o_read_database_query (o_database_t *db, /* {{{ */ } /* for (j = 1; j <= param_counter; j++) */ /* }}} End of the ``define'' stuff. */ - status = udb_query_prepare_result (q, prep_area, hostname_g, + status = udb_query_prepare_result (q, prep_area, + (db->host != NULL) ? db->host : hostname_g, /* plugin = */ "oracle", db->name, column_names, column_num, /* interval = */ 0); if (status != 0) @@ -700,7 +682,7 @@ 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); DEBUG ("oracle plugin: OCILogon (%s): db->oci_service_context = %p;", @@ -708,6 +690,10 @@ static int o_read_database (o_database_t *db) /* {{{ */ db->oci_service_context = NULL; return (-1); } + else if (status == OCI_SUCCESS_WITH_INFO) + { + /* TODO: Print NOTIFY message. */ + } assert (db->oci_service_context != NULL); }