LPC - Modulo 1

Gianni Campanile
Version 1.0
3/1/2006 11:56 AM

Table of Contents

Main Page	iv
Module Index	v
Hierarchical Index	vi
Data Structure Index	vii
File Index	viii
Module Documentation	2
Costanti	2
Strutture	6
Modulo1	6
Specifiche Interne Modulo 1	6
Creazione e cancellazione di un DBF	7
Nome di un DBF	7
Header del DBF	7
Network Byte Order	8
Modalita' di apertura di un file	8
Cancellazione di un DBF	8
Specifiche Interfaccia	8
Specifiche per il Test	10
Specifiche comuni a tutti i Moduli	12
Funzioni comuni	15
Data Structure Documentation	18
DBF_INFO_t	18
FIELD_DATA_t	20
FIELD_VALUE_t	21
File Documentation	22
include/LPC_Include.h	22
Index	27

LPC - Modulo 1 Main Page
Documentazione per il modulo 1 del progetto del corso di Laboratorio di Programmazione C Anno accademico 2005-2006
Funzioni di creazione e cancellazione di un Database File.
Docenti
•	S. Guerrini
•	A. Sterbini
•	G. Campanile

/*! 

LPC - Modulo 1 Module Index
LPC - Modulo 1 Modules
Here is a list of all modules:
Modulo1	6
Specifiche Interne Modulo 1	6
Specifiche Interfaccia	8
Specifiche per il Test	10
Specifiche comuni a tutti i Moduli	12
Costanti	2
Strutture	6
Funzioni comuni	15

LPC - Modulo 1 Hierarchical Index
LPC - Modulo 1 Class Hierarchy
This inheritance list is sorted roughly, but not completely, alphabetically:DBF_INFO_t	18
FIELD_DATA_t	20
FIELD_VALUE_t	21

LPC - Modulo 1 Data Structure Index
LPC - Modulo 1 Data Structures
Here are the data structures with brief descriptions:
DBF_INFO_t (Informazioni su un database. Sono informazioni generiche più informazioni dipendenti dalla connessione ) 	18
FIELD_DATA_t (Definizione di un campo del database ) 	20
FIELD_VALUE_t (Valore di un campo del database ) 	21

LPC - Modulo 1 File Index
LPC - Modulo 1 File List
Here is a list of all documented files with brief descriptions:
include/LPC_Include.h (Costanti e tipi principali usati da tutti i moduli del compito di LPC ) 	22

LPC - Modulo 1 Module Documentation
Costanti
Defines
•	#define TRUE  1
Valore TRUE. 

•	#define FALSE  0
Valore FALSE. 

•	#define DBF_NAME_LENGTH  10
Lunghezza massima del nome di un database file. 

•	#define FIELD_NAME_LENGTH  10
Lunghezza massima del nome di un campo. 

•	#define INDEX_NAME_LENGTH  10
Lunghezza massima del nome di un index file. 

•	#define MAX_NUM_FIELDS  255
Numero massimo di campi nel database. 

•	#define MAX_DBF_OPEN  32
Numero massimo di file di database aperti contemporaneamente. 

•	#define MAX_INDEX_OPEN  10
Numero massimo di indici creabili per un database file. 

•	#define CHARACTER  1
Tipo campo CHARACTER. 

•	#define NUMERIC  2
Tipo campo NUMERIC. 

•	#define DATE  3
Tipo campo DATE. 

•	#define LOGICAL  4
Tipo campo LOGICAL. 

•	#define DBF_EXTENSION  ".dbf"
Estensione del nome di un database file. 

•	#define DBF_OPEN_EXT  ".$$$"
Estensione di un database aperto. 

•	#define DBF_FILENAME_LENGTH  DBF_NAME_LENGTH+1+3
Lunghezza totale del nome di un file DBF compresa l'estensione. 

•	#define DBF_FIXED_HEADER_LEN  (DBF_NAME_LENGTH + 1 + sizeof(short) + sizeof(long) + sizeof(short) + sizeof(short) + sizeof(long))
Lunghezza della parte fissa dell'header escluso il doppio NULL finale. 

•	#define DBF_FIELD_LEN  (FIELD_NAME_LENGTH + 1 + sizeof(short) + sizeof(short))
Lunghezza di ogni definizione campo. 

•	#define FIELD_CHAR_LEN  255
Lunghezza massima del tipo campo CHARACTER. 

•	#define FIELD_NUM_LEN  sizeof(double)
Lunghezza (FISSA) del tipo campo NUMERIC. 

•	#define FIELD_DATE_LEN  sizeof(long)
Lunghezza (FISSA) del tipo campo DATE. 

•	#define FIELD_LOGI_LEN  sizeof(char)
Lunghezza (FISSA) del tipo campo LOGICAL. 

•	#define TOP  1
Inserimento all'inizio del file. 

•	#define BOTTOM  2
Inserimento alla fine del file. 

•	#define CURRENT  3
Inserimento nel punto corrente del file. 

•	#define ABSOLUTE  1
Spostamento assoluto. 

•	#define RELATIVE  2
Spostamento relativo. 

•	#define LPC_OK  0
Tutto bene. 

•	#define LPC_BAD_ARG  -1
Argomento non valido. 

•	#define LPC_BAD_FIELD  -2
Campo non valido. 

•	#define LPC_FILE_EXISTS  -3
File gia' esistente. 

•	#define LPC_FILE_ACCESS  -4
Accesso negato o file inesistente. 

•	#define LPC_ERR_WRITE  -5
Errore di scrittura. 

•	#define LPC_ERR_READ  -6
Errore di lettura. 

•	#define LPC_ERR_SEEK  -7
Errore di posizionamento. 

•	#define LPC_NO_MEMORY  -8
Errore di allocazione memoria. 

•	#define LPC_NO_SPACE  -9
Spazio interno esaurito (vettore full). 

•	#define LPC_DBF_OPEN  -10
Il database è aperto. 

•	#define LPC_NOT_FOUND  -11
Record non trovato. 

•	#define LPC_ERR_EOF  -12
Errore di fine file. 

Detailed Description
Costanti comuni a tutti i moduli 

Strutture
Data Structures
•	struct FIELD_DATA_t
Definizione di un campo del database. 

•	struct DBF_INFO_t
Informazioni su un database. Sono informazioni generiche più informazioni dipendenti dalla connessione. 

•	struct FIELD_VALUE_t
Valore di un campo del database. 

Detailed Description
Strutture comuni a tutti i moduli 

Modulo1
Questo Modulo permette la creazione e cancellazione di un database file. 
 Modules
•	Specifiche Interne Modulo 1
•	Specifiche Interfaccia
•	Specifiche per il Test

Detailed Description
Questo Modulo permette la creazione e cancellazione di un database file. 

/*! 

Specifiche Interne Modulo 1

Creazione e cancellazione di un DBF
Nome di un DBF
Il nome di un DBF deve contenere solo caratteri alfanumerici piu' eventualmente il carattere '_' e deve iniziare con un carattere. Il nome viene troncato alla lunghezza DBF_NAME_LENGTH  e poi viene aggiunta l'estensione DBF_EXTENSION .
Header del DBF
L'header di un DBF viene scritto dalla funzione CreateDatabaseFile() ed è così fatto:

•	DBF_NAME_LENGTH+1
•	Nome del database + NULL. Se il nome è più corto si riempie di NULL.
•	2 bytes
•	Numero di campi. Short in Network Byte Order.
•	4 bytes
•	Numero di record. Long in Network Byte Order
•	2 bytes
•	Lunghezza totale Header. Short in Network Byte Order.
•	2 bytes
•	Lunghezza di ogni record. Short in Network Byte Order.
•	4 bytes
•	timestamp ultimo update. Long in Network Byte Order che rappresenta il time in Julian Date.
•	<DEFINIZIONE CAMPO 1>
•	Definizione del primo campo del DBF. (vedi dopo)
•	...
•	<DEFINIZIONE CAMPO n>
•	Definizione dell'ultimo campo del DBF. (vedi dopo)
•	2 bytes
•	Due NULL.
•	

Ogni definizione di campo ha la seguente struttura:
•	FIELD_NAME_LENGTH+1
•	Nome del campo + NULL. Se il nome è più corto si riempie di NULL.
•	2 bytes
•	Tipo di campo. Valore numerico corrispondente ai possibili tipi di campo vedi CreateDatabaseFile().
•	2 bytes
•	Lunghezza del campo. Short in Network Byte Order. Per i valori ammessi a seconda del tipo vedi la CreateDatabaseFile().
•	

Nel file LPC_Include.h vi sono 2 costanti per calcolare la lunghezza totale dell'Header:
•	DBF_FIXED_HEADER_LEN
•	lunghezza della parte fissa fino all'inizio della definizione dei campi (esclusi quindi anche i 2 NULL finali;
•	DBF_FIELD_LEN
•	lunghezza della definizione di ogni campo.
•	

Per la scrittura dell'Header e' consigliabile creare un buffer di caratteri, serializzare tutti i campi necessari nel buffer e poi scrivere il buffer nel file.
Network Byte Order
Il Network Byte Order e' l'ordinamento dei bytes concordato per la portabilita' dei dati. Vi sono principalmente 2 tipi di ordinamento, che dipendono dall'architettura del microprocessore:
•	Little Endian:
•	il byte meno significativo vien prima (little-end first);
•	Big Endian:
•	il byte piu' significativo viene prima (big-end first);
•	

Ad esempio la famiglia di processori Intel e' Little Endian, mentre Motorola 68000, Sparc e PowerPC sono Big Endian.
 Per convenzione il formato Network byte Order e' Big Endian.
 Vi sono 2 coppie di funzioni per la conversione Host-To-Network e viceversa:

•	htons e ntohs che convertono uno short;
•	htonl e ntohl che convertono un long;

Modalita' di apertura di un file
Se per aprire il file viene utilizzata la funzione di stream fopen() , ricordare che il file va aperto in modo binario. Sempre in caso di stream, per leggere e scrivere si consigliano le funzioni fread() e fwrite().
Cancellazione di un DBF
Un DBF non può essere cancellato se è aperto. Il modo di verificare questo è verificare se esiste un file che ha lo stesso nome ma ha estensione DBF_OPEN_EXT. 

Specifiche Interfaccia
Functions
•	int CreateDatabaseFile (char *Name, int NumFields, FIELD_DATA_t *FieldData)
Crea un file di database con nome Name . 

•	int DeleteDatabaseFile (char *Name)
Cancella un file di database con nome Name . 

Function Documentation
int CreateDatabaseFile (char * Name, int NumFields, FIELD_DATA_t * FieldData)
Crea un file di database con nome Name . 

Name  è una stringa non nulla e NULL terminated e rappresenta il nome del file da creare.
 Il nome del file deve contenere solo caratteri alfanumerici + il carattere '_' e deve iniziare con un carattere alfabetico.
 La lunghezza totale del nome viene troncata a DBF_NAME_LENGTH  caratteri e viene aggiunta l'estensione DBF_EXTENSION .
NumFields  è il numero dei campi del DBF che sono definiti nel vettore di strutture FieldData .
 Deve essere 0 < NumFields  <= DBF_MAX_FIELDS Per ogni campo deve essere definito:

•	Name  
•	Nome del campo. Deve contenere solo caratteri alfanumerici + il carattere '_' e deve iniziare con un carattere alfabetico. Ogni campo deve avere un nome differente nell'ambito dello stesso DBF
•	
•	FieldType  
•	Tipo del campo. Puo' valere solo CHARACTER , NUMERIC , DATE , LOGICAL .
•	
•	FieldLen  
•	Lunghezza totale del campo. Valido solo per campi di tipo CHARACTER  . 
•	
•	CHARACTER:  1 <= FieldLen  <= FIELD_CHAR_LEN  
•	
	NUMERIC:  lunghezza fissa a FIELD_NUM_LEN  
	DATE:  lunghezza fissa a FIELD_DATE_LEN  
	LOGICAL:  lunghezza fissa a FIELD_LOGI_LEN  
•	
•	
•	

Una volta creato, il database file viene chiuso, e per essere utilizzato deve essere chiamata la funzione OpenDatabaseFile().
Parameters:
Name Nome del database file, stringa alfanumerica + '_' NULL terminated. 
NumFields numero di campi del database. 
*FieldData Vettore di strutture di dimensione numfields.
Returns:
LPC_OK Database creato 
LPC_BAD_ARG Nome DB nullo o non valido o NumFields  <= 0 
LPC_BAD_FIELD Valore di uno dei campi non valido: nome, tipo, lunghezza o duplicato. 
LPC_NO_MEMORY Errore in allocazione memoria. 
LPC_FILE_EXISTS File DBF gia' esistente. 
LPC_ERR_WRITE Errore in scrittura su file.
See also:
DeleteDatabaseFile().
Author:
Gianni Campanile 
Stefano Guerrini 
Andrea Sterbini 
Date:
Gennaio 2006 
Version:
1.0 
int DeleteDatabaseFile (char * Name)
Cancella un file di database con nome Name . 

Name  è una stringa non nulla e NULL terminated e rappresenta il nome del file da creare.
 Il nome deve essere quello di un DBF precedentemente creato con la funzione CreateDatabaseFile().
 La lunghezza totale del nome viene troncata a DBF_NAME_LENGTH  caratteri e viene aggiunta l'estensione DBF_EXTENSION .
Il database deve essere chiuso, cioe' non deve esistere un file con lo stesso nome e estensione DBF_OPEN_EXT .
Parameters:
Name Nome del database file, stringa alfanumerica + '_' NULL terminated. 
Returns:
LPC_OK Database cancellato 
LPC_BAD_ARG Nome DB nullo o non valido 
LPC_DBF_OPEN Il database è aperto. 
LPC_FILE_ACCESS Il file non esiste o non può essere cancellato.
See also:
CreateDatabaseFile().
Author:
Gianni Campanile 
Stefano Guerrini 
Andrea Sterbini 
Date:
Gennaio 2006 
Version:
1.0 

Specifiche per il Test
Functions
•	void TestCreate (void)
Funzione di Test per la CreateDatabaseFile(). 

•	void TestDelete (void)
Funzione di Test per la DeleteDatabaseFile(). 

•	void Result (char *Func)
Funzione di calcolo e stampa risultati. 

•	int main (int argc, char **argv)
Test per le funzioni di interfaccia del Modulo 1. 

Function Documentation
int main (int argc, char ** argv)
Test per le funzioni di interfaccia del Modulo 1. 

Programma di test per il Modulo 1
Ogni test e' identificato da un numero cosi' composto:
 xyynn  
 x Id del modulo
 yy Id della funzione
 nn Id del test

Ogni test ha anche un peso che viene indicato nella stampa dei risultati. I test di funzionalità hanno i pesi piu' elevati.
Tramite menu possono essere richiamate sia le singole funzioni di test TestCreate() e TestDelete(), che un test completo con un punteggio finale.
Vengono effettuati i seguenti controlli:
•	Creazione (CreateDatabaseFile()):
•	Nome del DBF errato (NULL o caratteri non validi o inizio non valido)
•	Numero campi non valido
•	FieldData non valido
•	Campo non valido (Nome, Tipo o Lunghezza o gia' esistente)
•	File gia' esistente
•	Verifica funzionalita'
•	Verifica creazione corretta (confronto binario con template)
•	

•	Cancellazione (DeleteDatabaseFile()):
•	Nome del DBF errato (NULL o caratteri non validi o inizio non valido)
•	DBF non esistente
•	DBF aperto
•	Verifica funzionalita' 
•	

Specifiche comuni a tutti i Moduli
Modules
•	Costanti
•	Strutture
•	Funzioni comuni
Functions
•	void LPC_GestioneErrore (int ErrorCode, char *Func, char *Msg)
Stampa l'errore. 

•	int CreateDatabaseFile (char *Name, int NumFields, FIELD_DATA_t *FieldData)
Crea un file di database con nome Name . 

•	int DeleteDatabaseFile (char *Name)
Cancella un file di database con nome Name . 

Function Documentation
int CreateDatabaseFile (char * Name, int NumFields, FIELD_DATA_t * FieldData)
Crea un file di database con nome Name . 

Name  è una stringa non nulla e NULL terminated e rappresenta il nome del file da creare.
 Il nome del file deve contenere solo caratteri alfanumerici + il carattere '_' e deve iniziare con un carattere alfabetico.
 La lunghezza totale del nome viene troncata a DBF_NAME_LENGTH  caratteri e viene aggiunta l'estensione DBF_EXTENSION .
NumFields  è il numero dei campi del DBF che sono definiti nel vettore di strutture FieldData .
 Deve essere 0 < NumFields  <= DBF_MAX_FIELDS Per ogni campo deve essere definito:

•	Name  
•	Nome del campo. Deve contenere solo caratteri alfanumerici + il carattere '_' e deve iniziare con un carattere alfabetico. Ogni campo deve avere un nome differente nell'ambito dello stesso DBF
•	
•	FieldType  
•	Tipo del campo. Puo' valere solo CHARACTER , NUMERIC , DATE , LOGICAL .
•	
•	FieldLen  
•	Lunghezza totale del campo. Valido solo per campi di tipo CHARACTER  . 
•	
•	CHARACTER:  1 <= FieldLen  <= FIELD_CHAR_LEN  
•	
	NUMERIC:  lunghezza fissa a FIELD_NUM_LEN  
	DATE:  lunghezza fissa a FIELD_DATE_LEN  
	LOGICAL:  lunghezza fissa a FIELD_LOGI_LEN  
•	
•	
•	

Una volta creato, il database file viene chiuso, e per essere utilizzato deve essere chiamata la funzione OpenDatabaseFile().
Parameters:
Name Nome del database file, stringa alfanumerica + '_' NULL terminated. 
NumFields numero di campi del database. 
*FieldData Vettore di strutture di dimensione numfields.
Returns:
LPC_OK Database creato 
LPC_BAD_ARG Nome DB nullo o non valido o NumFields  <= 0 
LPC_BAD_FIELD Valore di uno dei campi non valido: nome, tipo, lunghezza o duplicato. 
LPC_NO_MEMORY Errore in allocazione memoria. 
LPC_FILE_EXISTS File DBF gia' esistente. 
LPC_ERR_WRITE Errore in scrittura su file.
See also:
DeleteDatabaseFile().
Author:
Gianni Campanile 
Stefano Guerrini 
Andrea Sterbini 
Date:
Gennaio 2006 
Version:
1.0 
int DeleteDatabaseFile (char * Name)
Cancella un file di database con nome Name . 

Name  è una stringa non nulla e NULL terminated e rappresenta il nome del file da creare.
 Il nome deve essere quello di un DBF precedentemente creato con la funzione CreateDatabaseFile().
 La lunghezza totale del nome viene troncata a DBF_NAME_LENGTH  caratteri e viene aggiunta l'estensione DBF_EXTENSION .
Il database deve essere chiuso, cioe' non deve esistere un file con lo stesso nome e estensione DBF_OPEN_EXT .
Parameters:
Name Nome del database file, stringa alfanumerica + '_' NULL terminated. 
Returns:
LPC_OK Database cancellato 
LPC_BAD_ARG Nome DB nullo o non valido 
LPC_DBF_OPEN Il database è aperto. 
LPC_FILE_ACCESS Il file non esiste o non può essere cancellato.
See also:
CreateDatabaseFile().
Author:
Gianni Campanile 
Stefano Guerrini 
Andrea Sterbini 
Date:
Gennaio 2006 
Version:
1.0 
void LPC_GestioneErrore (int ErrorCode, char * Func, char * Msg)
Stampa l'errore. 

Scrive un codice di errore, la funzione chiamante e un messaggio di errore. L'errore viene stampato su stderr.
Il parametro ErrorCode  è il codice di errore. Func  e' il nome della funzione che sta intercettando l'errore e Msg  e' il messaggio di errore.
Da notare che Func  non è il nome della funzione che ha generato un errore, ma il nome della funzione che lo ha ricevuto.
 Il messaggio di errore e' una stringa che puo' contenere le informazioni aggiuntive per il miglior monitoraggio dell'errore.
I codici di errore delle funzioni da implementare sono già definiti in LPC_Include.h
Tutti i codice di errore sono negativi.
Esempio di gestione dell'errore: 
        int Insert()
        {
        ....
                if (NumFields < 0)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore parametro NumFields negativo");
                        LPC_GestioneErrore(LPC_BAD_ARG, "Insert", Err);
                        < Liberare tutta la memoria allocata in questa funzione >
                        return(LPC_BAD_ARG);
                }
        ....
        }

Esempio di gestione dell'errore su allocazione memoria: 
        int Insert()
        {
        ....
                buf = calloc(10, sizeof(long));
                if (!buf)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore allocazione memoria");
                        LPC_GestioneErrore(LPC_NO_MEMORY, "Insert", Err);
                        < Liberare tutta la memoria allocata in questa funzione >
                        return(LPC_NO_MEMORY);
                }
        ....
        }

Esempio di gestione dell'errore ritornato da una chiamata ad una funzione di sistema: 
        int Insert()
        {
        ....
                ret = fwrite(buffer, sizeof(char), len, fp);
                if (ret != len)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore di sistema [%d] in scrittura su file:[%s]", errno, strerror(errno));
                        LPC_GestioneErrore(LPC_ERR_WRITE, "Insert", Err);
                        < Liberare tutta la memoria allocata in questa funzione >
                        return(LPC_ERR_WRITE);
                }
        ....
        }

Esempio di gestione errore per una chiamata ad una funzione interna: 
        int Insert()
        {
        ... 
                ret = GetDBFInfo(handle, &DBFInfo);
                if (ret != LPC_OK)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore chiamata alla GetDBFInfo:[%d]", ret);
                        LPC_GestioneErrore(ret, "Insert", Err);
                        return(ret);
                }
        ....
        }

Parameters:
ErrorCode Codice dell'errore 
Func Funzione da cui viene la chiamata 
Msg Messaggio di errore
Author:
Gianni Campanile 
Stefano Guerrini 
Andrea Sterbini 
Date:
Gennaio 2006 
Version:
1.0 

Funzioni comuni
Functions
•	void LPC_GestioneErrore (int ErrorCode, char *Func, char *Msg)
Stampa l'errore. 

Function Documentation
void LPC_GestioneErrore (int ErrorCode, char * Func, char * Msg)
Stampa l'errore. 

Scrive un codice di errore, la funzione chiamante e un messaggio di errore. L'errore viene stampato su stderr.
Il parametro ErrorCode  è il codice di errore. Func  e' il nome della funzione che sta intercettando l'errore e Msg  e' il messaggio di errore.
Da notare che Func  non è il nome della funzione che ha generato un errore, ma il nome della funzione che lo ha ricevuto.
 Il messaggio di errore e' una stringa che puo' contenere le informazioni aggiuntive per il miglior monitoraggio dell'errore.
I codici di errore delle funzioni da implementare sono già definiti in LPC_Include.h
Tutti i codice di errore sono negativi.
Esempio di gestione dell'errore: 
        int Insert()
        {
        ....
                if (NumFields < 0)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore parametro NumFields negativo");
                        LPC_GestioneErrore(LPC_BAD_ARG, "Insert", Err);
                        < Liberare tutta la memoria allocata in questa funzione >
                        return(LPC_BAD_ARG);
                }
        ....
        }

Esempio di gestione dell'errore su allocazione memoria: 
        int Insert()
        {
        ....
                buf = calloc(10, sizeof(long));
                if (!buf)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore allocazione memoria");
                        LPC_GestioneErrore(LPC_NO_MEMORY, "Insert", Err);
                        < Liberare tutta la memoria allocata in questa funzione >
                        return(LPC_NO_MEMORY);
                }
        ....
        }

Esempio di gestione dell'errore ritornato da una chiamata ad una funzione di sistema: 
        int Insert()
        {
        ....
                ret = fwrite(buffer, sizeof(char), len, fp);
                if (ret != len)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore di sistema [%d] in scrittura su file:[%s]", errno, strerror(errno));
                        LPC_GestioneErrore(LPC_ERR_WRITE, "Insert", Err);
                        < Liberare tutta la memoria allocata in questa funzione >
                        return(LPC_ERR_WRITE);
                }
        ....
        }

Esempio di gestione errore per una chiamata ad una funzione interna: 
        int Insert()
        {
        ... 
                ret = GetDBFInfo(handle, &DBFInfo);
                if (ret != LPC_OK)
                {
                        char Err[256];
                        (void) sprintf(Err, "Errore chiamata alla GetDBFInfo:[%d]", ret);
                        LPC_GestioneErrore(ret, "Insert", Err);
                        return(ret);
                }
        ....
        }

Parameters:
ErrorCode Codice dell'errore 
Func Funzione da cui viene la chiamata 
Msg Messaggio di errore
Author:
Gianni Campanile 
Stefano Guerrini 
Andrea Sterbini 
Date:
Gennaio 2006 
Version:
1.0 

LPC - Modulo 1 Data Structure Documentation
DBF_INFO_t Struct Reference
Informazioni su un database. Sono informazioni generiche più informazioni dipendenti dalla connessione. 
 #include <LPC_Include.h>
Data Fields
•	FILE * fp
File pointer del database aperto. 

•	char Name [DBF_NAME_LENGTH+1]
Nome del database escluso estensione. 

•	int NumFields
Numero dei campi del database. 

•	long NumRecs
Numero totale di records nel database. 

•	int HeaderLen
Lunghezza dell'Header. 

•	int RecordLen
Lunghezza di un record del database. 

•	long CurrentRec
Numero del record corrente. 

•	time_t LastUpdate
Data e ora ultimo aggiornamento (Julian date). 

Detailed Description
Informazioni su un database. Sono informazioni generiche più informazioni dipendenti dalla connessione. 

The documentation for this struct was generated from the following file:
•	include/LPC_Include.h

FIELD_DATA_t Struct Reference
Definizione di un campo del database. 
 #include <LPC_Include.h>
Data Fields
•	char Name [FIELD_NAME_LENGTH+1]
Nome del campo. 

•	short FieldType
Tipo di campo. 

•	short FieldLen
Lunghezza del campo. Se numerico, lunghezza della parte intera. 

•	short FieldDecs
Decimali del campo (se ve ne sono, altrimenti 0). 

Detailed Description
Definizione di un campo del database. 

The documentation for this struct was generated from the following file:
•	include/LPC_Include.h

FIELD_VALUE_t Struct Reference
Valore di un campo del database. 
 #include <LPC_Include.h>
Data Fields
•	char Name [FIELD_NAME_LENGTH+1]
Nome del campo. 

Detailed Description
Valore di un campo del database. 

The documentation for this struct was generated from the following file:
•	include/LPC_Include.h

LPC - Modulo 1 File Documentation
include/LPC_Include.h File Reference
Costanti e tipi principali usati da tutti i moduli del compito di LPC. 
#include <netinet/in.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
Data Structures
•	struct FIELD_DATA_t
Definizione di un campo del database. 

•	struct DBF_INFO_t
Informazioni su un database. Sono informazioni generiche più informazioni dipendenti dalla connessione. 

•	struct FIELD_VALUE_t
Valore di un campo del database. 

Defines
•	#define TRUE  1
Valore TRUE. 

•	#define FALSE  0
Valore FALSE. 

•	#define DBF_NAME_LENGTH  10
Lunghezza massima del nome di un database file. 

•	#define FIELD_NAME_LENGTH  10
Lunghezza massima del nome di un campo. 

•	#define INDEX_NAME_LENGTH  10
Lunghezza massima del nome di un index file. 

•	#define MAX_NUM_FIELDS  255
Numero massimo di campi nel database. 

•	#define MAX_DBF_OPEN  32
Numero massimo di file di database aperti contemporaneamente. 

•	#define MAX_INDEX_OPEN  10
Numero massimo di indici creabili per un database file. 

•	#define CHARACTER  1
Tipo campo CHARACTER. 

•	#define NUMERIC  2
Tipo campo NUMERIC. 

•	#define DATE  3
Tipo campo DATE. 

•	#define LOGICAL  4
Tipo campo LOGICAL. 

•	#define DBF_EXTENSION  ".dbf"
Estensione del nome di un database file. 

•	#define DBF_OPEN_EXT  ".$$$"
Estensione di un database aperto. 

•	#define DBF_FILENAME_LENGTH  DBF_NAME_LENGTH+1+3
Lunghezza totale del nome di un file DBF compresa l'estensione. 

•	#define DBF_FIXED_HEADER_LEN  (DBF_NAME_LENGTH + 1 + sizeof(short) + sizeof(long) + sizeof(short) + sizeof(short) + sizeof(long))
Lunghezza della parte fissa dell'header escluso il doppio NULL finale. 

•	#define DBF_FIELD_LEN  (FIELD_NAME_LENGTH + 1 + sizeof(short) + sizeof(short))
Lunghezza di ogni definizione campo. 

•	#define FIELD_CHAR_LEN  255
Lunghezza massima del tipo campo CHARACTER. 

•	#define FIELD_NUM_LEN  sizeof(double)
Lunghezza (FISSA) del tipo campo NUMERIC. 

•	#define FIELD_DATE_LEN  sizeof(long)
Lunghezza (FISSA) del tipo campo DATE. 

•	#define FIELD_LOGI_LEN  sizeof(char)
Lunghezza (FISSA) del tipo campo LOGICAL. 

•	#define TOP  1
Inserimento all'inizio del file. 

•	#define BOTTOM  2
Inserimento alla fine del file. 

•	#define CURRENT  3
Inserimento nel punto corrente del file. 

•	#define ABSOLUTE  1
Spostamento assoluto. 

•	#define RELATIVE  2
Spostamento relativo. 

•	#define LPC_OK  0
Tutto bene. 

•	#define LPC_BAD_ARG  -1
Argomento non valido. 

•	#define LPC_BAD_FIELD  -2
Campo non valido. 

•	#define LPC_FILE_EXISTS  -3
File gia' esistente. 

•	#define LPC_FILE_ACCESS  -4
Accesso negato o file inesistente. 

•	#define LPC_ERR_WRITE  -5
Errore di scrittura. 

•	#define LPC_ERR_READ  -6
Errore di lettura. 

•	#define LPC_ERR_SEEK  -7
Errore di posizionamento. 

•	#define LPC_NO_MEMORY  -8
Errore di allocazione memoria. 

•	#define LPC_NO_SPACE  -9
Spazio interno esaurito (vettore full). 

•	#define LPC_DBF_OPEN  -10
Il database è aperto. 

•	#define LPC_NOT_FOUND  -11
Record non trovato. 

•	#define LPC_ERR_EOF  -12
Errore di fine file. 

Functions
•	void LPC_GestioneErrore (int ErrorCode, char *Func, char *Msg)
Stampa l'errore. 

•	int CreateDatabaseFile (char *Name, int NumFields, FIELD_DATA_t *FieldData)
Crea un file di database con nome Name . 

•	int DeleteDatabaseFile (char *Name)
Cancella un file di database con nome Name . 

Detailed Description
Costanti e tipi principali usati da tutti i moduli del compito di LPC. 

Questo file contiene valori costanti comuni a tutti i moduli del compito di LPC e facenti parte dell'interfaccia.
Contiene anche la definizione delle strutture da utilizzare e i prototipi delle funzioni dell'interfaccia.
Author:
Stefano Guerrini 
Andrea Sterbini 
Gianni Campanile 
Date:
Gennaio 2006 
Version:
1.0 

Index

ComuniLPC
CreateDatabaseFile; 12
DeleteDatabaseFile; 13
LPC_GestioneErrore; 14
Costanti; 2
CreateDatabaseFile
ComuniLPC; 12
InterfacciaModulo1; 9
DBF_INFO_t; 18
DeleteDatabaseFile
ComuniLPC; 13
InterfacciaModulo1; 10
FIELD_DATA_t; 20
FIELD_VALUE_t; 21
Funzioni comuni; 15
FunzioniComuni
LPC_GestioneErrore; 16
include/LPC_Include.h; 22
InterfacciaModulo1
CreateDatabaseFile; 9
DeleteDatabaseFile; 10
LPC_GestioneErrore
ComuniLPC; 14
FunzioniComuni; 16
main
TestModulo1; 11
Modulo1; 6
Specifiche comuni a tutti i Moduli; 12
Specifiche Interfaccia; 8
Specifiche Interne Modulo 1; 6
Specifiche per il Test; 10
Strutture; 6
TestModulo1
main; 11