1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-07 02:42:49 +03:00

status and session_tracik callback function:

This feature allows client applications to register a callback function,
which is called as soon as the server status changes or session_track
information was sent by the server.

Registration is handled via mysql_optionsv() API function:

mysql_optionsv(mysql, MARIADB_OPT_STATUS_CALLBACK, function, data)

The callback function must be defined as follws:

void status_callback(void *data, enum enum_mariadb_status_info type, ..)

  Parameters:
    - data  Pointer passed with registration of callback function
            (usually a connection handle)
    - type  Information type  STATUS_TYPE or SESSION_TRACK_TYPE

  Variadic Parameters:

  if (type == STATUS_TYPE):
    - server status (unsigned int)

  if (type == SESSION_TRACK_TYPE)
    - enum enum_session_state_type track_type - session track type

    if (track_type == SESSION_TRACK_SYSTEM_VARIABLES)
      - MARIADB_CONST_STRING *key
      - MARIADB_CONST_STRING *value

    else
      - MARIADB_CONST_STRING *value

An example can be found in connection.c (test_status_callback)
This commit is contained in:
Georg Richter
2022-08-02 10:10:50 +02:00
parent 8eff2a866e
commit a8832afa2a
5 changed files with 236 additions and 34 deletions

View File

@@ -2151,7 +2151,109 @@ static int test_conc365_reconnect(MYSQL *my)
return rc;
}
struct st_callback {
char autocommit;
char database[64];
char charset[64];
};
void my_status_callback(void *ptr, enum enum_mariadb_status_info type, ...)
{
va_list ap;
struct st_callback *data= (struct st_callback *)ptr;
va_start(ap, type);
switch(type) {
case STATUS_TYPE:
{
int status= va_arg(ap, int);
data->autocommit= status & SERVER_STATUS_AUTOCOMMIT;
}
break;
case SESSION_TRACK_TYPE:
{
enum enum_session_state_type track_type= va_arg(ap, enum enum_session_state_type);
switch (track_type) {
case SESSION_TRACK_SCHEMA:
{
MARIADB_CONST_STRING *str= va_arg(ap, MARIADB_CONST_STRING *);
strncpy(data->database, str->str, str->length);
}
break;
case SESSION_TRACK_SYSTEM_VARIABLES:
{
MARIADB_CONST_STRING *key= va_arg(ap, MARIADB_CONST_STRING *);
MARIADB_CONST_STRING *val= va_arg(ap, MARIADB_CONST_STRING *);
if (!strncmp(key->str, "character_set_client", key->length))
{
strncpy(data->charset, val->str, val->length);
}
}
break;
default:
break;
}
}
default:
break;
}
va_end(ap);
}
static int test_status_callback(MYSQL *my __attribute__((unused)))
{
MYSQL *mysql= mysql_init(NULL);
char tmp[64];
int rc;
struct st_callback data= {0,"", ""};
rc= mysql_optionsv(mysql, MARIADB_OPT_STATUS_CALLBACK, my_status_callback, &data);
if (!my_test_connect(mysql, hostname, username,
password, NULL, port, socketname, 0))
{
diag("error1: %s", mysql_error(mysql));
return FAIL;
}
rc= mysql_autocommit(mysql, 0);
check_mysql_rc(rc, mysql);
rc= mysql_autocommit(mysql, 1);
check_mysql_rc(rc, mysql);
if (!data.autocommit)
{
diag("autocommit not set");
return FAIL;
}
diag("-------------------------");
sprintf(tmp, "USE %s", schema);
rc= mysql_query(mysql, tmp);
check_mysql_rc(rc, mysql);
if (strcmp(data.database, schema))
{
diag("Expected database: %s instead of %s", schema, data.database);
return FAIL;
}
rc= mysql_query(mysql, "SET NAMES latin1");
check_mysql_rc(rc, mysql);
if (strcmp(data.charset, "latin1"))
{
diag("Expected charset latin1 instead of %s", data.charset);
return FAIL;
}
mysql_close(mysql);
return OK;
}
struct my_tests_st my_tests[] = {
{"test_status_callback", test_status_callback, TEST_CONNECTION_NONE, 0, NULL, NULL},
{"test_conc365", test_conc365, TEST_CONNECTION_NONE, 0, NULL, NULL},
{"test_conc365_reconnect", test_conc365_reconnect, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
{"test_conn_str", test_conn_str, TEST_CONNECTION_NONE, 0, NULL, NULL},