Programmazione/ MySQL e le sue API: un esempio pratico

di Giorgio Zoppi. In questo articolo vediamo come spedire via mail un semplice report utilizzando le API del database server MySQL all'interno di un programma C

Supponete di stare lavorando ad un sito web in PHP e di aver bisogno di fare periodicamente brevi report sul database connesso al webserver: cosa potreste fare? La soluzione più semplice è scrivere un piccolo script in Perl come frontend tra voi e il database, che possa essere magari eseguito via cron. Bé, anche se è  la soluzione più semplice richiede sempre la presenza del Perl sulla macchina dove è installato il database, cerchiamo quindi dare una soluzione diversa.
In questo articolo vedremo come spedire via mail un semplice report utilizzando le API del database server MySQL all'interno di un programma C. 

Il mio problema iniziale era scoprire via remoto quanti utenti si erano registrati al database e utilizzare tali dati per mandare periodicamente una newsletter settimanale. Diciamo un problema comune e di facile soluzione, ma volevo fare tutto non dal server dove lavoro ma da casa.  Nel server avevo il servizio sshd e questo mi permetteva di eseguire un comando arbitrario sulla stessa macchina dove era posto il database: MySQL dal canto suo fornisce un'ottima API per programmare in C. La tabella che volevo interrogare aveva la seguente struttura:

Field Type Null Key Default Extra
user_id int(11) PRI 0 auto_increment
user_name text YES NULL
real_name text YES NULL
email text YES NULL
password text YES NULL
remote_addr text YES NULL
confirm_hash text YES NULL
is_confirmed int(11) 0

Per ciascun elemento della tabella sovrastante, chiamata "user", volevo conoscere il nome reale e l'indirizzo di posta elettronica allo scopo di mandare la newsletter, tutto in modo piu o meno automatico mediante il seguente script:
#!/bin/bash
# Filename: newsletter
# Path for scp , for more info: man scp
SCP=/usr/bin/scp
#path for ssh, ssh client
SSH=/usr/bin/ssh
# remote user, who exists in the box , where's the database server
REMOTE_USER=webm
# DataBase Server host
REMOTE_HOST=lisa.penguin.it
# test if exist ssh and scp otherwise exit
test -f $SCP || exit 0
test -f $SSH || exit 0
# test if the newsletter file exists
test -f $1 || exit 0
$SCP $1 $REMOTE_USER@$REMOTE_HOST:/tmp/newsletter 
$SSH $REMOTE_USER@$REMOTE_HOST sendnws -f /tmp/newsletter

 
Penso che lo script sia abbastanza semplice da capire. Ecco un esempio di esecuzione da linea di comando:
deneb@lisa:~$ newsletter /home/deneb/letter

L'utente esperto si chiederà perché non usare direttamente la connessione alla porta MySQL invece di usare sshd. Il fatto è che abbiamo rispettato una norma utile quando si lavora sul web: evitare (quando possibile) che servizi critici (come mysqld) si interfaccino direttamente con la rete avendo magari diritti di root. Così tutte le connessioni dirette alla porta MySQL vengono filtrate e MySQL gira con privilegi di un utente fittizio che non ha shell. Come fare? Supposto che mysqluser sia l'utente dedicato a MySQL, basta eseguire i seguenti comandi:

root@main:~# chown -R mysqluser /path/to/mysql/dir
root@main:~# safe_mysqld --user=mysqluser

Semplice no? Bene iniziamo a programmare.