Skip to content

Commit

Permalink
Merge branch 'mx_mysql'
Browse files Browse the repository at this point in the history
* mx_mysql:
  mx_mysql: Add debugging routines to dump mysql bindings
  mxqd: use mx_mysql_do_statement_retry_on_fail() for some queries
  MXQ: Cleanup unused variables
  Makefile: mxqdump: fix dependency
  mxqd: Use mx_mysql* and remove mxq_mysql* forever
  mx_mysql: Fix mx_mysql_do_statement(_noresult) to return number of affected rows
  mx_mysql: Fix initialization dependencies
  • Loading branch information
mariux committed Jul 26, 2015
2 parents 57f18d4 + 5e841e1 commit be14957
Show file tree
Hide file tree
Showing 15 changed files with 398 additions and 826 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ mx_util.o
mxq_group.o
mxqdump.o
mxq_job.o
mxq_mysql.o
mxqd.o
mxqsub.o
mxqkill.o
Expand Down
28 changes: 6 additions & 22 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,10 @@ LDLIBS_MYSQL := $(shell $(MYSQL_CONFIG) --libs)

CFLAGS_MYSQL += ${CFLAGS_MXQ_MYSQL_DEFAULT_FILE}
CFLAGS_MYSQL += ${CFLAGS_MXQ_MYSQL_DEFAULT_GROUP}
CFLAGS_MYSQL += -DMX_MYSQL_FAIL_WAIT_DEFAULT=5

CFLAGS += -g
CFLAGS += -Wall
CFLAGS += -Wno-unused-variable
CFLAGS += -Wno-unused-function
CFLAGS += -DMXQ_VERSION=\"${MXQ_VERSION}\"
CFLAGS += -DMXQ_VERSIONFULL=\"${MXQ_VERSIONFULL}\"
CFLAGS += -DMXQ_VERSIONDATE=\"${MXQ_VERSIONDATE}\"
Expand Down Expand Up @@ -185,11 +184,6 @@ mx_mysql.h += $(mx_util.h)

mx_mxq.h += mx_mxq.h

### mxq_mysql.h --------------------------------------------------------

mxq_mysql.h += mxq_mysql.h
mxq_mysql.h += $(mxq_util.h)

### mxq_util.h ---------------------------------------------------------

mxq_util.h += mxq_util.h
Expand Down Expand Up @@ -253,20 +247,11 @@ mxq_log.o: $(mx_log.h)

clean: CLEAN += mxq_log.o

### mxq_mysql.o --------------------------------------------------------

mxq_mysql.o: $(mx_log.h)
mxq_mysql.o: $(mxq_mysql.h)
mxq_mysql.o: $(mxq_util.h)
mxq_mysql.o: CFLAGS += $(CFLAGS_MYSQL)

clean: CLEAN += mxq_mysql.o

### mxqdump.o ---------------------------------------------------

mxqdump.o: $(mx_log.h)
mxqdump.o: $(mxq_util.h)
mxqdump.o: $(mxq_mysql.h)
mxqdump.o: $(mx_mysql.h)
mxqdump.o: $(mx_getopt.h)
mxqdump.o: CFLAGS += $(CFLAGS_MYSQL)

Expand All @@ -290,14 +275,15 @@ clean: CLEAN += mxqkill.o
mxq_util.o: $(mx_log.h)
mxq_util.o: $(mxq_util.h)
mxq_util.o: CFLAGS += $(CFLAGS_MYSQL)
mxq_util.o: CFLAGS += -Wno-unused-variable

clean: CLEAN += mxq_util.o

### mxq_group.o --------------------------------------------------------

mxq_group.o: $(mx_log.h)
mxq_group.o: $(mxq_group.h)
mxq_group.o: $(mxq_mysql.h)
mxq_group.o: $(mx_mysql.h)
mxq_group.o: CFLAGS += $(CFLAGS_MYSQL)

clean: CLEAN += mxq_group.o
Expand All @@ -308,7 +294,7 @@ mxq_job.o: $(mx_util.h)
mxq_job.o: $(mx_log.h)
mxq_job.o: $(mxq_job.h)
mxq_job.o: $(mxq_group.h)
mxq_job.o: $(mxq_mysql.h)
mxq_job.o: $(mx_mysql.h)
mxq_job.o: CFLAGS += $(CFLAGS_MYSQL)

clean: CLEAN += mxq_job.o
Expand All @@ -322,7 +308,7 @@ mxqd.o: $(mx_log.h)
mxqd.o: $(mxqd.h)
mxqd.o: $(mxq_group.h)
mxqd.o: $(mxq_job.h)
mxqd.o: $(mxq_mysql.h)
mxqd.o: $(mx_mysql.h)
mxqd.o: CFLAGS += $(CFLAGS_MYSQL)
mxqd.o: CFLAGS += $(CFLAGS_MXQ_INITIAL_PATH)
mxqd.o: CFLAGS += -Wno-unused-but-set-variable
Expand Down Expand Up @@ -355,7 +341,6 @@ mxqd: mx_getopt.o
mxqd: mxq_group.o
mxqd: mxq_job.o
mxqd: mxq_util.o
mxqd: mxq_mysql.o
mxqd: mx_mysql.o
mxqd: LDLIBS += $(LDLIBS_MYSQL)

Expand Down Expand Up @@ -388,7 +373,6 @@ mxqdump: mx_log.o
mxqdump: mx_mysql.o
mxqdump: mxq_group.o
mxqdump: mxq_job.o
mxqdump: mxq_mysql.o
mxqdump: mxq_util.o
mxqdump: mx_util.o
mxqdump: mx_getopt.o
Expand Down
153 changes: 135 additions & 18 deletions mx_mysql.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,13 @@

#define mx__mysql_log_emerg(mysql) mx__mysql_log(emerg, (mysql))
#define mx__mysql_log_err(mysql) mx__mysql_log(err, (mysql))
#define mx__mysql_log_warning(mysql) mx__mysql_log(warning, (mysql))
#define mx__mysql_log_info(mysql) mx__mysql_log(info, (mysql))
#define mx__mysql_log_debug(mysql) mx__mysql_log(debug, (mysql))

#define mx__mysql_stmt_log_emerg(stmt) mx__mysql_stmt_log(emerg, (stmt))
#define mx__mysql_stmt_log_err(stmt) mx__mysql_stmt_log(err, (stmt))
#define mx__mysql_stmt_log_warning(stmt) mx__mysql_stmt_log(warning, (stmt))
#define mx__mysql_stmt_log_info(stmt) mx__mysql_stmt_log(info, (stmt))
#define mx__mysql_stmt_log_debug(stmt) mx__mysql_stmt_log(debug, (stmt))

Expand Down Expand Up @@ -206,6 +208,16 @@ static inline int mx__mysql_ping(struct mx_mysql *mysql)
mx__mysql_log_emerg(mysql);
return -(errno=EPROTO);

case CR_OUT_OF_MEMORY:
return -(errno=ENOMEM);

case CR_CONN_HOST_ERROR:
case CR_CONNECTION_ERROR:
case CR_IPSOCK_ERROR:
case CR_SOCKET_CREATE_ERROR:
case CR_UNKNOWN_HOST:
case CR_VERSION_ERROR:
case CR_SERVER_LOST:
case CR_SERVER_GONE_ERROR:
return -(errno=EAGAIN);

Expand Down Expand Up @@ -699,6 +711,42 @@ static inline int _mx_mysql_bind_integer(struct mx_mysql_bind *b, unsigned int i
return 0;
}

void _mx_mysql_bind_dump_index(struct mx_mysql_bind *b, unsigned int index)
{
mx_debug_value("%d", index);
mx_debug_value("%d", b->bind[index].buffer_type);
mx_debug_value("%d", b->bind[index].buffer_length);
mx_debug_value("%p", b->bind[index].buffer);
if (b->bind[index].buffer_type == MYSQL_TYPE_STRING)
mx_debug_value("%s", b->bind[index].buffer);
mx_debug_value("%d", b->bind[index].is_unsigned);
mx_debug_value("%d", *b->bind[index].length);
mx_debug_value("%d", *b->bind[index].is_null);
mx_debug_value("%d", *b->bind[index].error);
mx_debug_value("0x%x", b->data[index].flags);
}

void _mx_mysql_bind_dump(struct mx_mysql_bind *b)
{
int i;

mx_log_debug("entered");

if (!b) {
mx_log_debug("done");
return;
}

mx_debug_value("%d", b->type);
mx_debug_value("%d", b->count);

for (i=0; i < b->count; i++) {
_mx_mysql_bind_dump_index(b, i);
}
mx_log_debug("done");
}


static inline int _mx_mysql_bind_string(struct mx_mysql_bind *b, unsigned int index, char **value)
{
mx_assert_return_minus_errno(b, EINVAL);
Expand Down Expand Up @@ -755,31 +803,39 @@ static inline int _mx_mysql_bind_validate(struct mx_mysql_bind *b)

/**********************************************************************/

int mx_mysql_init(struct mx_mysql **mysql)
int mx_mysql_initialize(struct mx_mysql **mysql)
{
struct mx_mysql *m;
int res;

mx_assert_return_minus_errno(mysql, EINVAL);
mx_assert_return_minus_errno(!(*mysql), EUCLEAN);

m = mx_calloc_forever(1, sizeof(*m));

*mysql = m;

return 0;
}

int mx_mysql_init(struct mx_mysql *mysql)
{
int res;

mx_assert_return_minus_errno(mysql, EINVAL);

do {
res = mx__mysql_init(m);
res = mx__mysql_init(mysql);
if (res == 0)
break;

if (res != -ENOMEM)
return res;

mx_log_debug("mx__mysql_init() failed: %m - retrying (forever) in %d second(s).", MX_CALLOC_FAIL_WAIT_DEFAULT);
mx_sleep(MX_CALLOC_FAIL_WAIT_DEFAULT);
mx_log_debug("mx__mysql_init() failed: %m - retrying (forever) in %d second(s).", MX_MYSQL_FAIL_WAIT_DEFAULT);
mx_sleep(MX_MYSQL_FAIL_WAIT_DEFAULT);

} while (1);

*mysql = m;

return 0;
}

Expand Down Expand Up @@ -883,7 +939,12 @@ int mx_mysql_connect(struct mx_mysql **mysql)
mx_assert_return_minus_errno(mysql, EINVAL);

if (!(*mysql)) {
res = mx_mysql_init(mysql);
res = mx_mysql_initialize(mysql);
if (res < 0)
return res;
}
if (!(*mysql)->mysql) {
res = mx_mysql_init(*mysql);
if (res < 0)
return res;
}
Expand All @@ -897,8 +958,9 @@ int mx_mysql_connect_forever_sec(struct mx_mysql **mysql, unsigned int seconds)
int res;

while ((res = mx_mysql_connect(mysql)) < 0) {
mx__mysql_log_info(*mysql);
mx__mysql_log_warning(*mysql);
mx_mysql_assert_usage_ok(res);
mx_log_warning("mx_mysql_connect() failed: %m - retrying (forever) in %d second(s).", seconds);
mx_sleep(seconds);
}

Expand Down Expand Up @@ -955,6 +1017,33 @@ int mx_mysql_ping(struct mx_mysql *mysql)
return mx__mysql_ping(mysql);
}

int mx_mysql_ping_forever(struct mx_mysql *mysql)
{
int res;
int fail = 0;

mx_assert_return_minus_errno(mysql, EINVAL);

while (1) {
res = mx_mysql_ping(mysql);
if (res == 0)
break;

fail++;

mx__mysql_log_warning(mysql);
mx_mysql_assert_usage_ok(res);
mx_log_warning("mx_mysql_ping() failed: %m - retrying again (forever) in %d second(s).", MX_MYSQL_FAIL_WAIT_DEFAULT);
mx_sleep(MX_MYSQL_FAIL_WAIT_DEFAULT);
}

if (fail)
mx_log_info("mx_mysql_ping_forever() recovered from previous errors (%d tries). Yippieh! Back to work!", fail);

return res;
}


int mx_mysql_queryf(struct mx_mysql *mysql, const char *fmt, ...)
{
mx_assert_return_minus_errno(mysql, EINVAL);
Expand Down Expand Up @@ -1001,8 +1090,8 @@ int mx_mysql_statement_init(struct mx_mysql *mysql, struct mx_mysql_stmt **stmt)
if (res != -ENOMEM)
return res;

mx_log_debug("mx__mysql_stmt_init() failed: %m - retrying (forever) in %d second(s).", MX_CALLOC_FAIL_WAIT_DEFAULT);
mx_sleep(MX_CALLOC_FAIL_WAIT_DEFAULT);
mx_log_debug("mx__mysql_stmt_init() failed: %m - retrying (forever) in %d second(s).", MX_MYSQL_FAIL_WAIT_DEFAULT);
mx_sleep(MX_MYSQL_FAIL_WAIT_DEFAULT);
} while (1);

*stmt = s;
Expand Down Expand Up @@ -1088,7 +1177,7 @@ int mx_mysql_statement_fetch(struct mx_mysql_stmt *stmt)
}

res = mx__mysql_stmt_fetch(stmt);
if (res == -ENOENT || res == 0)
if (res == -ENOENT)
return 0;

if (res < 0 && res != -ERANGE) {
Expand Down Expand Up @@ -1186,7 +1275,6 @@ int mx_mysql_bind_cleanup(struct mx_mysql_bind *bind)
{
mx_assert_return_minus_errno(bind, EINVAL);

mx_assert_return_minus_errno(bind->type != MX_MYSQL_BIND_TYPE_UNKNOWN, EBADF);

mx_free_null(bind->bind);
mx_free_null(bind->data);
Expand Down Expand Up @@ -1246,9 +1334,12 @@ int mx_mysql_do_statement(struct mx_mysql *mysql, char *query, struct mx_mysql_b

assert(mysql);

mx_mysql_ping_forever(mysql);

stmt = mx_mysql_statement_prepare_with_bindings(mysql, query, param, result);
if (!stmt) {
mx_log_err("mx_mysql_statement_prepare(): %m");
mx_log_err("mx_mysql_statement_prepare_with_bindings(): %m");
mx_log_err("mx_mysql_statement_prepare_with_bindings(): query was: %s", query);
return -errno;
}

Expand Down Expand Up @@ -1276,9 +1367,35 @@ int mx_mysql_do_statement(struct mx_mysql *mysql, char *query, struct mx_mysql_b
}
mx_mysql_statement_close(&stmt);

return cnt;
return num_rows;
}

int mx_mysql_do_statement_retry_on_fail(struct mx_mysql *mysql, char *query, struct mx_mysql_bind *param, struct mx_mysql_bind *result, void *from, void **to, size_t size)
{
int res;

mx_log_debug("entered");

while (1) {
res = mx_mysql_do_statement(mysql, query, param, result, from, to, size);

if (res >= 0)
break;

mx_mysql_assert_usage_ok(res);

mx_log_warning("mx_mysql_do_statement() failed: %m");

if (res != -EAGAIN)
break;

mx_mysql_ping_forever(mysql);
}

return res;
}


struct mx_mysql_stmt *mx_mysql_statement_prepare_with_bindings(struct mx_mysql *mysql, char *statement, struct mx_mysql_bind *param, struct mx_mysql_bind *result)
{
int res;
Expand Down Expand Up @@ -1316,16 +1433,16 @@ struct mx_mysql_stmt *mx_mysql_statement_prepare_with_bindings(struct mx_mysql *
return stmt;
};

if (res < 0)
mx__mysql_stmt_log_warning(stmt);

mx_mysql_statement_close(&stmt);

return NULL;
}

struct mx_mysql_stmt *mx_mysql_statement_prepare(struct mx_mysql *mysql, char *statement)
{
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);
Expand Down
Loading

0 comments on commit be14957

Please sign in to comment.