Take a look at extern_mysql.h and extern_mysql.c. It is a simple request to struct mapping done in C for MySQL 5.0 and above for one of the projects. libmysql_r is not the simplest thing to work with, code provided was tested in production, so it works, take a look if you had a bad day and were forced to get data from MySQL in C.
A few words about an interface. To get data from mysql:
1) add request to mb_mysql_stmt:
If you want to get single value from db you can use, for instance
2) add request number to mb_db_stmt_e enum:
A few words about an interface. To get data from mysql:
1) add request to mb_mysql_stmt:
mb_mysql_stmt_t mb_mysql_stmt[] = {
...
{
"select * from SCHEDULE",
NULL, NULL, sizeof(mb_db_schedule_t), bind_r_schedule
},
...
};
where bind_r_schedule is a binding definition:
mb_bind_t bind_r_schedule[] = {
{"schedule_id", offsetof(mb_db_schedule_t, schedule_id), sizeof(((mb_db_schedule_t*)0)->schedule_id), 0},
{"name", offsetof(mb_db_schedule_t, name), sizeof(((mb_db_schedule_t*)0)->name), 0},
{"schedule_type", offsetof(mb_db_schedule_t, schedule_type), sizeof(((mb_db_schedule_t*)0)->schedule_type), 0},
{"enabled", offsetof(mb_db_schedule_t, enabled), sizeof(((mb_db_schedule_t*)0)->enabled), 0},
{"last_backup", offsetof(mb_db_schedule_t, last_backup), sizeof(((mb_db_schedule_t*)0)->last_backup), 0},
{NULL, 0, 0, 0}
};
This means that mb_db_exec() will return an array of mb_db_schedule_t, each element of this array will correspond to one row in the result set. To map fields in result set to struct members bindings are used, consult C API Prepared Statement Type Codes to map mysql types to C ones (for MYSQL_TIME mb_time_t is defined). The length of the array will be stored in variable pointed by the count argument of the mb_db_exec() function.If you want to get single value from db you can use, for instance
mb_bind_t bind_r_config_value[] = {
{"value", 0, 256, 0},
{NULL, 0, 0, 0}
};
mb_mysql_stmt_t mb_mysql_stmt[] = {
...
{
"select value from CONFIG where `key`='address'",
NULL, NULL, 256, bind_r_config_value
},
...
};
We do not use struct and map the whole row to buffer of 256 bytes (256 is the max length of the value field in config table), to obtain results call
char *data;
data = mb_db_exec(mb_db_ip_address_stmt, NULL);
if (!data)
mb_log_err("cannot find ip address");
Note that we do not need count here. Also note that bindings can be reused (bind_r_config_value can be used to obtain various values from config table).2) add request number to mb_db_stmt_e enum:
typedef enum {
...
mb_db_ip_address_stmt
} mb_db_stmt_e;
No comments:
Post a Comment