====== Utilizzare database mysql con C ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//20/12/2013//** \\ \\
Risorse:
[[http://dev.mysql.com/doc/refman/5.0/en/c.html|MySQL C API]]
Per far interagire i nostri programmi con il popalare database libero, è necessario avere installato nella propria macchina **MySQL C API** .
Di solito la libreria viene distribuita assieme a mysql, ma non nel caso della distribuzione Debian e Ubuntu in cui la libreria risiede nel pacchetto
//libmysqlclientXX-dev// .
===== Codice sorgente d'esempio =====
L'utilizzo della libreria non è affatto complesso anche se esistono numerose funzioni (ben documentate sul [[http://dev.mysql.com/doc/refman/5.0/en/c.html|sito]]), di seguito un sorgente commentato che ne spiega l'utilizzo.
#include
#include // gli header di MySQL C API
#include
int main(void) {
MYSQL *conn; //il puntatore alla connessione a mysql
MYSQL_RES *res; //il puntatore alla risorsa mysql
MYSQL_ROW row; // il vettore in cui verranno messi i risultati delle query
/* Dichiaro le variabili di connessione */
char *server = "hostnostro.it";
char *user = "utente";
char *password = "password-segreta";
char *database = "nostro-database";
/*Inizializzo la connessione*/
conn = mysql_init(NULL);
/* Se possibile mi connetto al database altrimenti
esco dal programma e scrivo un messaggio d'errore sullo stderr*/
if (!mysql_real_connect(conn, server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}
/* Invio se possibile la query */
if (mysql_query(conn, "show tables")) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}
/*Prendo i risultati della query*/
res = mysql_use_result(conn);
/* Stampo a video i risultati della query */
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
//nel vettore row ci sono i risultati adesso
printf("%s \n", row[0]);
/* Distruggo il puntatore ai risultati della query
e chiudo la connessione al database */
mysql_free_result(res);
mysql_close(conn);
return 0;
}
===== Compilare su Linux =====
==== Il Makefile ====
Per compilare il nostro sorgente abbiamo bisogno di un makefile come questo:
CPP = gcc
OPTS = `mysql_config --libs --cflags`
all:
$(CPP) main.c -o main $(OPTS)
clean:
rm main
Da notare che si fa uso del programma ''mysql_config'' per trovare i giusti flag necessari alla compilazione, proprio come si fa con gtk+2 o gtkmm o altri toolkit.
==== Makefile per il linkaggio statico di libmysql ====
CPP = gcc
OPTS = `mysql_config --libs --cflags`
OPTS-STATIC = `mysql_config --cflags` /usr/lib/libmysqlclient.a -lpthread -lz -lm -lssl -lcrypto -ldl
all:
$(CPP) main.c -o main $(OPTS)
static:
$(CPP) main.c -o main-static $(OPTS-STATIC)
clean:
rm main
Dunque per creare l'eseguibile statico digitare ''make static''.
Ho ottenuto i parametri ''-lpthread -lz -lm -lssl -lcrypto -ldl'' dall'output del comando ''mysql_config --libs''. Invece ho cercato manualmente il percorso della libreria ''/usr/lib/libmysqlclient.a'' .
===== Compilare su Windows con Code::Blocks =====
Per compilare su windows ho usato i ([[http://devpaks.org/|devpaks]]) per Dev-C++ e poi copiato gli header e le librerie nella root di Code::Blocks. Ecco la procedura da seguire:
- Installare Dev-C++ ;
- Scaricare il devpack per libmysql (dal comodo plugin manager di Dev-C++) ;
- copiare la directory ''c:\dev-cpp\include\mysql'' in ''c:\Programmi\CodeBlocks\mingw\include'' ;
- copiare i file **libmysql.a**, **libmysql.def**, **libmysql.dll**, **libmysql.lib** contenuti in ''c:\dev-cpp\lib\'' nella directory ''c:\Programmi\CodeBlocks\mingw\lib'' ;
- istruire il linker sulla posizione della libreria ''libmysql.a'' dal menu **Project-> Build Option -> Linker Settings ** . Aggiungendo il percorso ''c:\Programmi\CodeBlocks\mingw\lib\libmysql.a'' .
Per avviare correttamente l'eseguibile occorre mettere nella stessa directory la libreria **libmysql.dll** .