Leggi il codice di apriori_next.c
Torna alla pagina principale


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:


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;
}


/* Leggi il codice di apriori_next.c
Torna alla pagina principale */






  Indice principale     Indice dei Programmi     Indice del Progetto di BDD(cp)  

Data creazione: 17 Settembre 2010
Data ultima modifica: 30 Dicembre 2012