Indice

Utilizzare database mysql con C

Autore: Fabio Di Matteo
Ultima revisione: 20/12/2013

Risorse: 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 sito), di seguito un sorgente commentato che ne spiega l'utilizzo.

#include <my_global.h>
#include <mysql.h> // gli header di MySQL C API
#include <stdio.h>
 
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 (devpaks) per Dev-C++ e poi copiato gli header e le librerie nella root di Code::Blocks. Ecco la procedura da seguire:

  1. Installare Dev-C++ ;
  2. Scaricare il devpack per libmysql (dal comodo plugin manager di Dev-C++) ;
  3. copiare la directory c:\dev-cpp\include\mysql in c:\Programmi\CodeBlocks\mingw\include ;
  4. copiare i file libmysql.a, libmysql.def, libmysql.dll, libmysql.lib contenuti in c:\dev-cpp\lib\ nella directory c:\Programmi\CodeBlocks\mingw\lib ;
  5. 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 .