From faf9e1f09c448b1ecc8a8bad513c07cd18ffa0e7 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Mon, 25 Dec 2023 15:47:36 +0100 Subject: [PATCH] mx_mysql: user normal assert() Currently, mx_mysql uses own assert macros, which log the failed condition and then return an error value to the caller (via return status and via errno). All assert() failures are serious coding errors. Don't return to the caller, but use normal assert() to abort right away. This can simplify the coding for the callers. --- mx_mysql.c | 203 +++++++++++++++++++++++++++-------------------------- mx_mysql.h | 13 ---- 2 files changed, 102 insertions(+), 114 deletions(-) diff --git a/mx_mysql.c b/mx_mysql.c index c7d66759..a047ead2 100644 --- a/mx_mysql.c +++ b/mx_mysql.c @@ -15,6 +15,7 @@ #include #include +#include #include "mx_mysql.h" #include "mx_util.h" @@ -60,8 +61,8 @@ char *mx_mysql_error(void) { static const char *mx__mysql_error(struct mx_mysql *mysql) { - mx_assert_return_NULL(mysql, EINVAL); - mx_assert_return_NULL(mysql->mysql, EBADF); + assert(mysql); + assert(mysql->mysql); /* no mysql errors possible */ return mysql_error(mysql->mysql); @@ -69,8 +70,8 @@ static const char *mx__mysql_error(struct mx_mysql *mysql) static int mx__mysql_init(struct mx_mysql *mysql) { - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(!mysql->mysql, EUCLEAN); + assert(mysql); + assert(!mysql->mysql); mysql->mysql = mysql_init(NULL); if (mysql->mysql) @@ -83,8 +84,8 @@ static int mx__mysql_options(struct mx_mysql *mysql, enum mysql_option option, c { int res; - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(mysql->mysql, EBADF); + assert(mysql); + assert(mysql->mysql); res = mysql_options(mysql->mysql, option, arg); if (res == 0) @@ -97,8 +98,8 @@ static int mx__mysql_real_connect(struct mx_mysql *mysql, const char *host, cons { MYSQL *m; - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(mysql->mysql, EBADF); + assert(mysql); + assert(mysql->mysql); m = mysql_real_connect(mysql->mysql, host, user, passwd, db, port, unix_socket, client_flag); if (m && m == mysql->mysql) @@ -128,8 +129,8 @@ static int mx__mysql_real_connect(struct mx_mysql *mysql, const char *host, cons static int mx__mysql_ping(struct mx_mysql *mysql) { - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(mysql->mysql, EBADF); + assert(mysql); + assert(mysql->mysql); int res; @@ -164,9 +165,9 @@ static int mx__mysql_ping(struct mx_mysql *mysql) static int mx__mysql_stmt_init(struct mx_mysql_stmt *stmt) { - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(!stmt->stmt, EUCLEAN); - mx_assert_return_minus_errno(stmt->mysql, EBADF); + assert(stmt); + assert(!stmt->stmt); + assert(stmt->mysql); stmt->stmt = mysql_stmt_init(stmt->mysql->mysql); if (stmt->stmt) @@ -179,14 +180,14 @@ static int mx__mysql_stmt_prepare(struct mx_mysql_stmt *stmt, char *statement) { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(statement, EINVAL); - mx_assert_return_minus_errno(*statement, EINVAL); + assert(stmt); + assert(statement); + assert(*statement); - mx_assert_return_minus_errno(!stmt->statement, EUCLEAN); + assert(!stmt->statement); - mx_assert_return_minus_errno(stmt->mysql, EBADF); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt->mysql); + assert(stmt->stmt); res = mysql_stmt_prepare(stmt->stmt, statement, strlen(statement)); if (res == 0) { @@ -220,8 +221,8 @@ static int mx__mysql_stmt_bind_param(struct mx_mysql_stmt *stmt) { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = (int)mysql_stmt_bind_param(stmt->stmt, stmt->param.bind); if (res == 0) @@ -246,8 +247,8 @@ static int mx__mysql_stmt_bind_result(struct mx_mysql_stmt *stmt) { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = (int)mysql_stmt_bind_result(stmt->stmt, stmt->result.bind); if (res == 0) @@ -272,8 +273,8 @@ static int mx__mysql_stmt_execute(struct mx_mysql_stmt *stmt) { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = mysql_stmt_execute(stmt->stmt); if (res == 0) @@ -302,8 +303,8 @@ static int mx__mysql_stmt_store_result(struct mx_mysql_stmt *stmt) { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = mysql_stmt_store_result(stmt->stmt); if (res == 0) @@ -332,8 +333,8 @@ static int mx__mysql_stmt_free_result(struct mx_mysql_stmt *stmt) { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = (int)mysql_stmt_free_result(stmt->stmt); if (res == 0) @@ -347,8 +348,8 @@ static int mx__mysql_stmt_fetch(struct mx_mysql_stmt *stmt) { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = mysql_stmt_fetch(stmt->stmt); if (res == 0) @@ -389,8 +390,8 @@ static int mx__mysql_stmt_fetch_column(struct mx_mysql_stmt *stmt, unsigned int { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = mysql_stmt_fetch_column(stmt->stmt, &(stmt->result.bind[column]), column, offset); if (res == 0) @@ -411,11 +412,11 @@ static int mx__mysql_stmt_param_count(struct mx_mysql_stmt *stmt) { unsigned long count; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); count = mysql_stmt_param_count(stmt->stmt); - mx_assert_return_minus_errno((unsigned long)(int)count == count, ERANGE); + assert(count <= INT_MAX); /* no mysql errors possible */ return (int)count; @@ -425,11 +426,11 @@ static int mx__mysql_stmt_field_count(struct mx_mysql_stmt *stmt) { unsigned long count; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); count = mysql_stmt_field_count(stmt->stmt); - mx_assert_return_minus_errno((unsigned long)(int)count == count, ERANGE); + assert(count <= INT_MAX); /* no mysql errors possible */ return (int)count; @@ -439,8 +440,8 @@ static int mx__mysql_stmt_affected_rows(struct mx_mysql_stmt *stmt, unsigned lon { my_ulonglong c; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); c = mysql_stmt_affected_rows(stmt->stmt); @@ -454,8 +455,8 @@ static int mx__mysql_stmt_insert_id(struct mx_mysql_stmt *stmt, unsigned long lo { my_ulonglong c; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); c = mysql_stmt_insert_id(stmt->stmt); @@ -469,7 +470,7 @@ static int mx__mysql_stmt_close(struct mx_mysql_stmt *stmt) { bool res; - mx_assert_return_minus_errno(stmt, EINVAL); + assert(stmt); res = mysql_stmt_close(stmt->stmt); if (res == 0) { @@ -489,7 +490,7 @@ static int mx__mysql_stmt_close(struct mx_mysql_stmt *stmt) } static int mx__mysql_close(struct mx_mysql *mysql) { - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); if (mysql->mysql) { mysql_close(mysql->mysql); @@ -510,12 +511,12 @@ static int mx__mysql_library_end(void) { static int _mx_mysql_bind_integer(struct mx_mysql_bind *b, unsigned int index, void *value, int type, int is_unsigned) { - mx_assert_return_minus_errno(b, EINVAL); - mx_assert_return_minus_errno(value, EINVAL); + assert(b); + assert(value); - mx_assert_return_minus_errno(index < b->count, ERANGE); + assert(index < b->count); - mx_assert_return_minus_errno(!(b->data[index].flags), EUCLEAN); + assert(!(b->data[index].flags)); memset(&(b->bind[index]), 0, sizeof(b->bind[index])); @@ -533,14 +534,14 @@ static int _mx_mysql_bind_integer(struct mx_mysql_bind *b, unsigned int index, v static int _mx_mysql_bind_string(struct mx_mysql_bind *b, unsigned int index, char **value) { - mx_assert_return_minus_errno(b, EINVAL); - mx_assert_return_minus_errno(value, EINVAL); + assert(b); + assert(value); - mx_assert_return_minus_errno(index < b->count, ERANGE); + assert(index < b->count); - mx_assert_return_minus_errno(!(b->data[index].flags), EUCLEAN); + assert(!(b->data[index].flags)); - mx_assert_return_minus_errno((*value && b->type == MX_MYSQL_BIND_TYPE_PARAM) || (!*value && b->type == MX_MYSQL_BIND_TYPE_RESULT), EBADF); + assert((*value && b->type == MX_MYSQL_BIND_TYPE_PARAM) || (!*value && b->type == MX_MYSQL_BIND_TYPE_RESULT)); memset(&(b->bind[index]), 0, sizeof(b->bind[index])); @@ -572,7 +573,7 @@ static int _mx_mysql_bind_string(struct mx_mysql_bind *b, unsigned int index, ch static int _mx_mysql_bind_validate(struct mx_mysql_bind *b) { - mx_assert_return_minus_errno(b, EINVAL); + assert(b); for (unsigned long i=0; i < b->count; i++) { if (!(b->data[i].flags)) { @@ -590,8 +591,8 @@ int mx_mysql_initialize(struct mx_mysql **mysql) { struct mx_mysql *m; - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(!(*mysql), EUCLEAN); + assert(mysql); + assert(!(*mysql)); m = mx_calloc_forever(1, sizeof(*m)); @@ -604,7 +605,7 @@ static int mx_mysql_init(struct mx_mysql *mysql) { int res; - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); do { res = mx__mysql_init(mysql); @@ -624,7 +625,7 @@ static int mx_mysql_init(struct mx_mysql *mysql) int mx_mysql_option_set_default_file(struct mx_mysql *mysql, char *fname) { - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); if (fname && (*fname == '/') && (euidaccess(fname, R_OK) != 0)) { mx_mysql_save_error_va("%s: %m - falling back to mysql default config search path", fname); @@ -641,7 +642,7 @@ int mx_mysql_option_set_default_file(struct mx_mysql *mysql, char *fname) int mx_mysql_option_set_default_group(struct mx_mysql *mysql, char *group) { - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); if (group && !(*group)) group = NULL; @@ -653,7 +654,7 @@ int mx_mysql_option_set_default_group(struct mx_mysql *mysql, char *group) int mx_mysql_option_set_reconnect(struct mx_mysql *mysql, int reconnect) { - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); mysql->reconnect = (bool)!!reconnect; return 0; @@ -663,8 +664,8 @@ static int mx_mysql_real_connect(struct mx_mysql *mysql, const char *host, const { int res; - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(mysql->mysql, EBADF); + assert(mysql); + assert(mysql->mysql); if (mysql->default_file) { res = mx__mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, mysql->default_file); @@ -699,7 +700,7 @@ int mx_mysql_connect(struct mx_mysql **mysql) { int res; - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); if (!(*mysql)) { res = mx_mysql_initialize(mysql); @@ -730,7 +731,7 @@ int mx_mysql_connect_forever_sec(struct mx_mysql **mysql, unsigned int seconds) } int mx_mysql_disconnect(struct mx_mysql *mysql) { - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); return mx__mysql_close(mysql); } @@ -741,9 +742,9 @@ static int mx_mysql_end(void) { static int mx_mysql_free(struct mx_mysql **mysql) { - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(*mysql, EBADF); - mx_assert_return_minus_errno(!((*mysql)->mysql), EUCLEAN); + assert(mysql); + assert(*mysql); + assert(!((*mysql)->mysql)); mx_free_null(*mysql); @@ -774,7 +775,7 @@ int mx_mysql_finish(struct mx_mysql **mysql) static int mx_mysql_ping(struct mx_mysql *mysql) { - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); return mx__mysql_ping(mysql); } @@ -784,7 +785,7 @@ static int mx_mysql_ping_forever(struct mx_mysql *mysql) int res; int fail = 0; - mx_assert_return_minus_errno(mysql, EINVAL); + assert(mysql); while (1) { res = mx_mysql_ping(mysql); @@ -809,9 +810,9 @@ static int mx_mysql_statement_init(struct mx_mysql *mysql, struct mx_mysql_stmt struct mx_mysql_stmt *s; int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(!(*stmt), EUCLEAN); + assert(stmt); + assert(mysql); + assert(!(*stmt)); s = mx_calloc_forever(1, sizeof(*s)); @@ -838,8 +839,8 @@ int mx_mysql_statement_execute(struct mx_mysql_stmt *stmt, unsigned long long *c { int res; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = _mx_mysql_bind_validate(&stmt->param); if (res < 0) { @@ -886,8 +887,8 @@ int mx_mysql_statement_fetch(struct mx_mysql_stmt *stmt) char *str; int no_error = 1; - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); res = _mx_mysql_bind_validate(&stmt->result); if (res < 0) { @@ -943,21 +944,21 @@ int mx_mysql_statement_fetch(struct mx_mysql_stmt *stmt) int mx_mysql_statement_param_count(struct mx_mysql_stmt *stmt) { - mx_assert_return_minus_errno(stmt, EINVAL); + assert(stmt); return mx__mysql_stmt_param_count(stmt); } int mx_mysql_statement_field_count(struct mx_mysql_stmt *stmt) { - mx_assert_return_minus_errno(stmt, EINVAL); + assert(stmt); return mx__mysql_stmt_field_count(stmt); } static int mx_mysql_stmt_field_count_set(struct mx_mysql_stmt *stmt) { - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); stmt->field_count = mysql_stmt_field_count(stmt->stmt); @@ -966,8 +967,8 @@ static int mx_mysql_stmt_field_count_set(struct mx_mysql_stmt *stmt) static int mx_mysql_stmt_param_count_set(struct mx_mysql_stmt *stmt) { - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); + assert(stmt); + assert(stmt->stmt); stmt->param_count = mysql_stmt_param_count(stmt->stmt); @@ -989,11 +990,11 @@ static int mx_mysql_bind_cleanup(struct mx_mysql_bind *bind) static int mx_mysql_bind_init_from(struct mx_mysql_bind *bind, unsigned long count, enum mx_mysql_bind_type type, struct mx_mysql_bind *from) { - mx_assert_return_minus_errno(bind, EINVAL); + assert(bind); - mx_assert_return_minus_errno(!bind->count, EUCLEAN); - mx_assert_return_minus_errno(!bind->bind, EUCLEAN); - mx_assert_return_minus_errno(!bind->data, EUCLEAN); + assert(!bind->count); + assert(!bind->bind); + assert(!bind->data); if (from) { assert(count == from->count); @@ -1009,11 +1010,11 @@ static int mx_mysql_bind_init_from(struct mx_mysql_bind *bind, unsigned long cou int mx_mysql_bind_init(struct mx_mysql_bind *bind, unsigned long count, enum mx_mysql_bind_type type) { - mx_assert_return_minus_errno(bind, EINVAL); + assert(bind); - mx_assert_return_minus_errno(!bind->count, EUCLEAN); - mx_assert_return_minus_errno(!bind->bind, EUCLEAN); - mx_assert_return_minus_errno(!bind->data, EUCLEAN); + assert(!bind->count); + assert(!bind->bind); + assert(!bind->data); bind->type = type; bind->count = count; @@ -1122,9 +1123,9 @@ static struct mx_mysql_stmt *mx_mysql_statement_prepare_with_bindings(struct mx_ int res; struct mx_mysql_stmt *stmt = NULL; - mx_assert_return_NULL(mysql, EINVAL); - mx_assert_return_NULL(statement, EINVAL); - mx_assert_return_NULL(*statement, EINVAL); + assert(mysql); + assert(statement); + assert(*statement); res = mx_mysql_statement_init(mysql, &stmt); if (res < 0) @@ -1161,17 +1162,17 @@ static struct mx_mysql_stmt *mx_mysql_statement_prepare_with_bindings(struct mx_ struct mx_mysql_stmt *mx_mysql_statement_prepare(struct mx_mysql *mysql, char *statement) { - mx_assert_return_NULL(mysql, EINVAL); - mx_assert_return_NULL(statement, EINVAL); - mx_assert_return_NULL(*statement, EINVAL); + assert(mysql); + assert(statement); + assert(*statement); return mx_mysql_statement_prepare_with_bindings(mysql, statement, NULL, NULL); } int mx_mysql_statement_close(struct mx_mysql_stmt **stmt) { - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(*stmt, EINVAL); + assert(stmt); + assert(*stmt); mx__mysql_stmt_free_result(*stmt); mx__mysql_stmt_close(*stmt); @@ -1185,8 +1186,8 @@ int mx_mysql_statement_close(struct mx_mysql_stmt **stmt) int mx_mysql_statement_close_no_bind_cleanup(struct mx_mysql_stmt **stmt) { - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(*stmt, EINVAL); + assert(stmt); + assert(*stmt); mx__mysql_stmt_free_result(*stmt); mx__mysql_stmt_close(*stmt); diff --git a/mx_mysql.h b/mx_mysql.h index c09c3bb7..fd9c5a8a 100644 --- a/mx_mysql.h +++ b/mx_mysql.h @@ -6,19 +6,6 @@ #include "mx_util.h" -#ifdef MX_NDEBUG_MYSQL -# include -# define mx_mysql_assert_return_minus_errno(test, eno) \ - assert(test) -# define mx_mysql_assert_return_NULL(test, eno) \ - assert(test) -#else -# define mx_mysql_assert_return_minus_errno(test, eno) \ - mx_assert_return_minus_errno(test, eno) -# define mx_mysql_assert_return_NULL(test, eno) \ - mx_assert_return_NULL(test, eno) -#endif - #define mx_mysql_assert_usage_ok(res) \ do { \ if ((res) < 0) { \