/* * Un simple exemple de client, utilisant la librairie du serveur embarqué MySQL */ #include <mysql.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> MYSQL *db_connect(const char *dbname); void db_disconnect(MYSQL *db); void db_do_query(MYSQL *db, const char *query); const char *server_groups[] = { "test_libmysqld_SERVER", "embedded", "server", NULL }; int main(int argc, char **argv) { MYSQL *one, *two; /* mysql_server_init() doit être appelée avant toute autre fonction * mysql. * * Vous pouvez utiliser mysql_server_init(0, NULL, NULL), et cela initialisera * le serveur en utilisant groups = { * "server", "embedded", NULL * }. * * Dans votre fichier $HOME/.my.cnf, vous voudrez sûrement mettre : [test_libmysqld_SERVER] language = /chemin/vers/la/source/de/mysql/sql/share/english * Vous pouvez, bien sûr, modifier argc et argv avant de les passer * à cette fonction. Ou vous pouvez en créer de nouveaux de la manière * que vous souhaitez. Mais tout les arguments dans argv (à part * argv[0], qui est le nom du programme) doivent être des options valides * pour le serveur MySQL. * * Si vous liez ce client avec la librairie mysqlclient normale, * cette fonction n'est qu'un bout de code qui ne fait rien. */ mysql_server_init(argc, argv, (char **)server_groups); one = db_connect("test"); two = db_connect(NULL); db_do_query(one, "SHOW TABLE STATUS"); db_do_query(two, "SHOW DATABASES"); mysql_close(two); mysql_close(one); /* Cela doit être appelé après toutes les autres fonctions mysql */ mysql_server_end(); exit(EXIT_SUCCESS); } static void die(MYSQL *db, char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); (void)putc('\n', stderr); if (db) db_disconnect(db); exit(EXIT_FAILURE); } MYSQL * db_connect(const char *dbname) { MYSQL *db = mysql_init(NULL); if (!db) die(db, "mysql_init a échoué : pas de mémoire"); /* * Notez que le client et le serveur utilisent des noms de groupes séparés. * Ceci est critique, car le serveur n'acceptera pas les options du client * et vice versa. */ mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "test_libmysqld_CLIENT"); if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0)) die(db, "mysql_real_connect a échoué : %s", mysql_error(db)); return db; } void db_disconnect(MYSQL *db) { mysql_close(db); } void db_do_query(MYSQL *db, const char *query) { if (mysql_query(db, query) != 0) goto err; if (mysql_field_count(db) > 0) { MYSQL_RES *res; MYSQL_ROW row, end_row; int num_fields; if (!(res = mysql_store_result(db))) goto err; num_fields = mysql_num_fields(res); while ((row = mysql_fetch_row(res))) { (void)fputs(">> ", stdout); for (end_row = row + num_fields; row < end_row; ++row) (void)printf("%s\t", row ? (char*)*row : "NULL"); (void)fputc('\n', stdout); } (void)fputc('\n', stdout); } else (void)printf("Lignes affectées : %lld\n", mysql_affected_rows(db)); return; err: die(db, "db_do_query a échoué : %s [%s]", mysql_error(db), query); }
|