• Non ci sono risultati.

4.10 Proof of Concept Software di gestione del Database

4.10.3 Applicativo realizzato

Tramite questo software è possibile eseguire tutte le operazioni necessarie per l'interazione con il database e previste nella Proof of Concept. Ad esempio è possibile inserire un nuovo tipo di terminale nell’elenco dei tipi le cui istanze diventano dinamicamente inizializzabili, oppure inizializzare direttamente una istanza. Possiamo considerarlo dunque un prototipo che verrà usato personalizzandolo ed implementandolo a seconda delle differenti necessità. Nel paragrafo 6.6 invece verrà presentato il software sviluppato per un terminale effettivamente progettato e realizzato che rileva dati da una periferica GPS, e li inserisce in database. Il software sul terminale effettua una interazione complessa con il prototipo del sistema di fleet management via Internet, nel seguito ne verranno descritte le funzionalità. In questo paragrafo verrà descritto il funzionamento del solo software di gestione Database.

La prima parte del codice comprende la serie tipica di comandi per poter usufruire di funzioni definite nelle librerie standard C e nella libreria libpd oggetto del precedente paragrafo. In seguito è possibile trovare due funzioni: "exit_nicely" e "write_error".

La prima delle due consente di uscire correttamente dal programma.

Quando si interagisce con PostgreSQL, infatti, viene aperta una connessione con il database e per questa connessione viene allocata una parte di memoria. Per uscire correttamente da un

programma in esecuzione che abbia creato una connessione con un database, è necessario chiudere questa connessione per liberare la memoria occupata. Nel codice, al momento di dover terminare l'esecuzione, si richiama perciò la funzione "exit_nicely" che esegue il comando "PQfinish" per chiudere la connessione, ed il comando "exit" per terminare l'esecuzione.

La funzione "write_error" invece consente di scrivere gli errori che dovessero sopravvenire in un file chiamato "error_log".

I parametri accettati in ingresso dalla funzione sono: temp_str, conn, input.

Il primo di questi contiene l'errore sopravvenuto, il secondo le informazioni sulla connessione al database, mentre il terzo include la riga di comando che ha chiamato in esecuzione il codice. La funzione si occupa di scrivere sul file "error_log" l'errore sopravvenuto, l'orario in cui si sia verificato e la stringa che, chiamando in esecuzione il codice, lo ha generato.

In seguito a queste funzioni inizia il programma principale.

Dopo una parte di dichiarazione di variabili, viene creata una stringa che riproduce il comando che ha generato l'esecuzione del codice (che sarà utilizzata per essere passata come parametro alla funzione "write_error", qualora sopravvenga un errore), si effettua la connessione al database, e viene compiuto un controllo sulla connessione. Se tale controllo non dà esito positivo, è opportunamente segnalato in una variabile il tipo di errore verificatosi, e si esegue la chiamata alla funzione per la scrittura degli errori.

In seguito vi è un controllo sul primo parametro di chiamata: il programma utilizza infatti questo parametro per discriminare le operazioni da eseguire.

Le opzioni previste per questo parametro sono: - 1 per l'inserimento di dati

- 99 per l'inserimento di un nuovo tipo nell'elenco di tipi inizializzabili - 999 per l'inizializzazione di una nuova periferica

Per l'inserimento di dati, il programma deve essere lanciato rispettando la seguente sintassi: ./mis 1 tipo_periferica seriale_periferica dati_da_inserire.

Vengono quindi eseguiti i seguenti passaggi:

- un controllo sul numero di parametri inseriti (se non sono almeno cinque comprensivi del nome del programma e del parametro "1" c'è sicuramente un errore poiché i primi quattro

servono solo per chiamare il programma ed identificare la sorgente dei dati, dal quinto parametro in poi invece si trovano i dati da inserire

- con il comando "PQexecParams" viene effettuata una ricerca nel database per trovare la periferica specificata tramite il tipo e il seriale (se non viene trovata, significa che la periferica non è ancora stata inizializzata)

- si effettua un altro controllo sul numero di parametri (una volta identificata la periferica è infatti possibile sapere quanti sono i dati che devono essere inviati da dispositivi di quel tipo)

- si tenta l'inserimento dei dati preparando in una stringa la query da effettuare ed eseguendola tramite il comando "PQexec", qualora questo vada a buon fine il programma può terminare, altrimenti si suppone vi sia un errore nel tipo di dati inviati, per cui viene chiamata di nuovo la funzione di scrittura errori.

Se in alcuno dei passaggi sopra indicati si rileva un errore, oppure uno dei controlli non dà esito positivo, viene annotato l'errore in una variabile temporanea e, passando come parametri questa variabile, i dati sulla connessione, e la stringa contenente il comando che ha generato l'esecuzione del codice, si chiama la funzione "write_error" e si compilano alcune righe nel file "error.log".

Per l'inserimento di un nuovo tipo di periferiche, il programma prevede che il comando di chiamata rispetti la seguente sintassi:

./mis 99 tipo_periferica istruzioni_inizializzazione.

Vengono quindi eseguiti i seguenti passaggi:

- un controllo sul numero di parametri inseriti (se non sono almeno quattro, comprensivi del nome del programma e del parametro "99", c'è sicuramente un errore)

- si verifica che il tipo della periferica compaia nell'elenco dei tipi inizializzabili (se compare, infatti, non è necessario inserirlo di nuovo)

- si crea una stringa contenente il comando per creare una tabella, avente come nome il tipo di periferica, e come attributi il contenuto delle "istruzioni_inizializzazione"

- si esegue la query di creazione tabella

Se in alcuno dei passaggi sopraindicati si rileva un errore, o uno dei controlli non dà esito positivo, viene annotato l'errore in una variabile temporanea e, passando come parametri questa variabile, i dati sulla connessione, e la stringa contenente il comando che ha generato l'esecuzione del codice, si chiama la funzione "write_error" e si scrivono alcune righe nel file "error.log".

Per l'inizializzazione di una nuova periferica, il programma prevede la seguente sintassi: ./mis 999 tipo_periferica seriale periferica

Vengono quindi eseguiti i seguenti passaggi:

- un controllo sul numero di parametri inseriti (se non sono almeno quattro comprensivi del nome del programma e del parametro "999" c'è sicuramente un errore)

- tramite il comando "PQexecParams" si controlla se il tipo della periferica compare nella lista dei tipi inizializzabili

- si esegue una query per controllare che la periferica non sia stata già precedentemente inizializzata

- si tenta l'inserimento dei dati della periferica tra quelle inizializzate.

Se in qualcuno dei passaggi sopra indicati si rileva un errore, o uno dei controlli non dà esito positivo, viene annotato l'errore in una variabile temporanea e, passando come parametri questa variabile, i dati sulla connessione e la stringa contenente il comando che ha generato l'esecuzione del codice, si chiama la funzione "write_error" e si scrivono alcune righe nel file "error.log". Infine, qualora il primo parametro non contenga una delle opzioni contemplate (1, 99 o 999) si annota l'errore nel file "error.log".