From 7b6d516918b818d6716fe84db819387f3e2db681 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 23 Feb 2016 11:28:13 +0100 Subject: [PATCH] Add rd_kafka_get_err_descs --- config.m4 | 8 +++- fun.c | 65 ++++++++++++++++++++++++++++--- tests/rd_kafka_get_err_descs.phpt | 26 +++++++++++++ 3 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 tests/rd_kafka_get_err_descs.phpt diff --git a/config.m4 b/config.m4 index 9a5473d0..79b2dcae 100644 --- a/config.m4 +++ b/config.m4 @@ -45,7 +45,13 @@ if test "$PHP_RDKAFKA" != "no"; then ],[ AC_MSG_WARN([no rd_kafka_msg_partitioner_consistent, the consistent partitioner will not be available]) ]) - + + AC_CHECK_LIB($LIBNAME,[rd_kafka_get_err_descs],[ + AC_DEFINE(HAVE_RD_KAFKA_GET_ERR_DESCS,1,[ ]) + ],[ + AC_MSG_WARN([no rd_kafka_get_err_descs, the rd_kafka_get_err_descs function will not be available]) + ]) + PHP_SUBST(RDKAFKA_SHARED_LIBADD) PHP_NEW_EXTENSION(rdkafka, rdkafka.c metadata.c metadata_broker.c metadata_topic.c metadata_partition.c metadata_collection.c compat.c conf.c topic.c queue.c message.c fun.c, $ext_shared) diff --git a/fun.c b/fun.c index 2376e93b..1b556017 100644 --- a/fun.c +++ b/fun.c @@ -27,6 +27,9 @@ #include "ext/spl/spl_exceptions.h" /* {{{ arginfo */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_kafka_get_err_descs, 0, 0, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_kafka_err2str, 0, 0, 1) ZEND_ARG_INFO(0, err) ZEND_END_ARG_INFO() @@ -46,6 +49,55 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_kafka_offset_tail, 0, 0, 1) ZEND_END_ARG_INFO() /* }}} */ +#ifdef HAVE_RD_KAFKA_GET_ERR_DESCS +/* {{{ proto array rd_kafka_get_err_descs() + * Returns the full list of error codes. + */ +PHP_FUNCTION(rd_kafka_get_err_descs) +{ + const struct rd_kafka_err_desc *errdescs; + size_t cnt; + size_t i; + int seen_zero = 0; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + rd_kafka_get_err_descs(&errdescs, &cnt); + + array_init_size(return_value, cnt); + + for (i = 0; i < cnt; i++) { + const struct rd_kafka_err_desc *desc = &errdescs[i]; + zval *el; + + if (desc->code == 0) { + if (seen_zero) { + continue; + } + seen_zero = 1; + } + + ALLOC_INIT_ZVAL(el); + array_init(el); + add_assoc_long(el, "code", desc->code); + if (desc->name) { + add_assoc_string(el, "name", (char*) desc->name, 1); + } else { + add_assoc_null(el, "name"); + } + if (desc->desc) { + add_assoc_string(el, "desc", (char*) desc->desc, 1); + }else { + add_assoc_null(el, "desc"); + } + add_next_index_zval(return_value, el); + } +} +/* }}} */ +#endif + /* {{{ proto string rd_kafka_err2str(int $err) * Returns a human readable representation of a kafka error. */ @@ -123,11 +175,14 @@ PHP_FUNCTION(rd_kafka_offset_tail) /* {{{ rdkafka_functions[] */ const zend_function_entry rdkafka_functions[] = { - PHP_FE(rd_kafka_err2str, arginfo_kafka_err2str) - PHP_FE(rd_kafka_errno2err, arginfo_kafka_errno2err) - PHP_FE(rd_kafka_errno, arginfo_kafka_errno) - PHP_FE(rd_kafka_offset_tail,arginfo_kafka_offset_tail) - PHP_FE(rd_kafka_thread_cnt, arginfo_kafka_thread_cnt) +#ifdef HAVE_RD_KAFKA_GET_ERR_DESCS + PHP_FE(rd_kafka_get_err_descs, arginfo_kafka_get_err_descs) +#endif + PHP_FE(rd_kafka_err2str, arginfo_kafka_err2str) + PHP_FE(rd_kafka_errno2err, arginfo_kafka_errno2err) + PHP_FE(rd_kafka_errno, arginfo_kafka_errno) + PHP_FE(rd_kafka_offset_tail, arginfo_kafka_offset_tail) + PHP_FE(rd_kafka_thread_cnt, arginfo_kafka_thread_cnt) PHP_FE_END /* Must be the last line in rdkafka_functions[] */ }; /* }}} */ diff --git a/tests/rd_kafka_get_err_descs.phpt b/tests/rd_kafka_get_err_descs.phpt new file mode 100644 index 00000000..493d8ff5 --- /dev/null +++ b/tests/rd_kafka_get_err_descs.phpt @@ -0,0 +1,26 @@ +--TEST-- +rd_kafka_get_err_descs() +--SKIPIF-- + + int(-192) + ["name"]=> + string(14) "_MSG_TIMED_OUT" + ["desc"]=> + string(24) "Local: Message timed out" +}