Ce programme exemple et son makefile devraient fonctionner sans changements sur un système Linux ou FreeBSD. Pour les autres systèmes d'exploitation, quelques petits changements seront requis. Cet exemple est là pour vous donner assez de détails pour comprendre le problème, sans avoir en tête qu'il s'agit d'une partie nécessaire d'une application réelle.
Pour essayer ccet exemple, créez un dossier
test_libmysqld
au même niveau que le
dossier des sources mysql-4.0. Sauvegardez le fichier source
test_libmysqld.c
et
GNUmakefile
dans le dossier, puis
exécutez GNU make
à l'intérieur du
répertoire test_libmysqld
.
test_libmysqld.c
/* * Un simple exemple de client, utilisant la bibliothèque 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 bibliothèque 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); }
GNUmakefile
# On suppose que MySQL est installé dans /usr/local/mysql inc := /usr/local/mysql/include/mysql lib := /usr/local/mysql/lib # Si vous n'avez pas encore installé MySQL, essayez plutôt ceci #inc := $(HOME)/mysql-4.0/include #lib := $(HOME)/mysql-4.0/libmysqld CC := gcc CPPFLAGS := -I$(inc) -D_THREAD_SAFE -D_REENTRANT CFLAGS := -g -W -Wall LDFLAGS := -static # Vous pouvez changer -lmysqld en -lmysqlclient pour utiliser # la bibliothèque client/serveur LDLIBS = -L$(lib) -lmysqld -lz -lm -lcrypt ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null)) # FreeBSD LDFLAGS += -pthread else # Linux LDLIBS += -lpthread endif # Cela fonctionne pour les programes de tests sur un simple fichier sources := $(wildcard *.c) objects := $(patsubst %c,%o,$(sources)) targets := $(basename $(sources)) all: $(targets) clean: rm -f $(targets) $(objects) *.core
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.