Software aggiuntivo
Per utilizzare il programma, bisogna prima popolare la base di dati.
Durante le prove da me effettuate, avevo bisogno di una grande quantità
di dati, possibilmente differenti, per poter testare il software sviluppato.
Poiché l'inserimento a mano sarebbe stato troppo lungo (e noioso), ho scritto
questo breve codice che si occupa di inserire nel database (utilizzando le funzioni
descritte in precedenza) una quantità scelta di
transazioni.
I possibili parametri di input sono:
- "-t n" (con n numero intero), se voglio l'inserimento di n transazioni
- "-l m" (con m numero intero), lunghezza massima di una transazione inserita = m
- "-p k" (con k numero intero), numero di possibili prodotti = k
- "-c", per cancellare tutte le transazioni precedenti
Il codice potrebbe senza dubbio essere migliorato: dal punto di vista statistico
la lunghezza delle transazioni generate si distribuisce in maniera uniforme
(e discreta) sull'insieme {1,2,...,lunghezza massima di una transazione}.
La lunghezza media delle transazioni sarà dunque pari alla metà
della lunghezza massima scelta (almeno approssimativamente).
Se per esempio vogliamo 1000 transazioni
di lunghezza massima pari a 10, ci aspettiamo che il programma generi
circa 5000 righe da inserire nel database (una riga é formata da una
coppia "id_transazione - prodotto").
Si potrebbe dunque pensare a un codice piú evoluto che crei transazioni
che contengano prodotti scelti secondo una certa distribuzione di probabilità.
Questa (e altre) migliorie andavano però ben al di là degli obbiettivi
del progetto.
Passiamo ora a descrivere il codice: qui sotto é possibile leggere il codice C
del programma.
Tutti i commenti e ció che non é codice sono stati inseriti
come commento, in modo da facilitarne un eventuale utilizzo.
/* Inizio codice */
/* File gentransaz.c */
/* compilato (sotto Linux) con questo comando: "gcc apriori.c -o apriori -lpq" */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <postgresql/libpq-fe.h>
/* Variabili utilizzate */
int ntr=10,npr=10,lmax=10,canc=0; /* parametri di input settati di default */
int i,j;
char conninfo[1000]="host=db.stat.unipd.it dbname=daniele user=daniele password=daniele";
PGconn *conn;
PGresult *res;
time_t *tp;
int temp;
int ltr; /* lunghezza transazione corrente */
int pr; /* prodotto estratto a caso */
char comando[1000];
char c2[1000];
int max; /* id della prima transazione da inserire */
int main(int argc,char *argv[])
{
printf("\n**********INIZIO ESECUZIONE**********\n");
for(i=1;i<argc;i++)
{if(strcmp(argv[i],"-h")==0) /* help */
{fprintf(stderr,"\nPossibili parametri in input:\n\t\" -c \" --> cancella tutte le transazioni precedenti\n");
fprintf(stderr,"\t\" -t 1000 \" --> indica il numero di transazioni da generare\n");
fprintf(stderr,"\t\" -l 5 \" --> indica la lunghezza massima delle transazioni da generare\n\n");
fprintf(stderr,"\t\" -p 20 \" --> indica il numero di prodotti a cui si riferiscono le transazioni\n\n");
return 1;
}
if(strcmp(argv[i],"-t")==0) /* numero transazioni */
{i++;
ntr=atoi(argv[i]);
continue;
}
if(strcmp(argv[i],"-l")==0) /* lunghezza massima transazione */
{i++;
lmax=atoi(argv[i]);
continue;
}
if(strcmp(argv[i],"-p")==0) /* numero prodotti */
{i++;
npr=atoi(argv[i]);
continue;
}
if(strcmp(argv[i],"-c")==0) /* cancella le transazioni precedenti */
{canc=1;
continue;
}
}
printf("\nIl programma creera' %d transazioni di lunghezza massima pari a %d su %d prodotti differenti\n",ntr,lmax,npr);
conn=PQconnectdb(conninfo); /* connessione */
if(PQstatus(conn)!=CONNECTION_OK)
{fprintf(stderr,"Connessione al database fallita: %s\n",PQerrorMessage(conn));
PQfinish(conn);
return 0;
}
/* se vogliamo cancellare le transazioni presenti nel database */
if(canc==1)
{strcpy(comando,"delete from transazioni");
res=PQexec(conn,comando);
if(PQresultStatus(res)!=PGRES_COMMAND_OK)
{fprintf(stderr,"Comando #%s# fallito:\n\t%s\n",comando,PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 0;
}
printf("Transazioni precedenti eliminate\n");
PQclear(res);
max=1;
}
else
{strcpy(comando,"select max(id) from transazioni");
res=PQexec(conn,comando);
if(PQresultStatus(res)!=PGRES_TUPLES_OK)
{fprintf(stderr,"Comando #%s# fallito:\n\t%s\n",comando,PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 0;
}
if(PQntuples(res)<1)
{max=1;
}
else
max=atoi(PQgetvalue(res,0,0))+1;
PQclear(res);
}
srand(time(tp)); /* inizializzo il seme per il random, in modo da avere
una sequenza di numeri sempre diversa ad ogni esecuzione */
for(i=max;i<=(max+ntr-1);i++)
{temp=rand();
ltr=temp%lmax; /* 0 <= ltr <= lmax-1 */
ltr++; /* 1 <= ltr <= lmax */
for(j=0;j<ltr;j++)
{temp=rand();
pr=temp%npr; /* 0 <= pr <= npr-1 */
pr++; /* 1 <= pr <= npr */
/* ora inserisco nel database (i,pr) */
strcpy(comando,"insert into transazioni values");
sprintf(c2,"(\'%d\',\'%d\')",i,pr);
strcat(comando,c2);
res=PQexec(conn,comando);
if(PQresultStatus(res)!=PGRES_COMMAND_OK)
{fprintf(stderr,"Comando #%s# fallito:\n\t%s\n",comando,PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 0;
}
PQclear(res);
}
}
PQfinish(conn);
printf("\n**********ESECUZIONE COMPLETATA**********\n\n");
return 1;
}
Data creazione: 17 Settembre 2010
Data ultima modifica: 30 Dicembre 2012