====== 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** .