Modulo Cinque
- Chi ha 2 o 3 moduli può fare questo modulo per migliorare il voto
- Data di consegna: 15 aprile 2007
- Argomento: indicizzazione del database
- Per chi: chi come minimo ha fatto almeno un modulo buono
- Valutazione: come al solito
- almeno 2 moduli perfetti
- oppure 3 buoni
- meno qualche cosa per patch, warning e non aderenza alle specifiche
- con discussione orale dei moduli consegnati
Specifiche
Le regole da seguire nell'implementazione del modulo 5 sono
le stesse degli altri moduli. In particolare si dovrà rispettare
la struttura generale del progetto.
La nuova versione dell'include di interfaccia e il sorgente di test sono
contenuti nell'archivio
Modulo5.tar.gz.
Funzioni da implementare
Creazione degli indici
int BuildIndexFile(int handle, char *fieldname);
Crea il file contenente l'indice per un certo campo del database
L'indice e' un file binario contenente una successione di coppie
<valore campo><numero del record>
(per semplicita', il file indice non ha header)
La dimensione degli elementi delle coppie contenuti negli indici
sono determinate da:
<valore campo> la stessa dimensione dichiarata nello header del DBF
<numero record> intero long (4 bytes)
I dati contenuti nell'indice vanno memorizzati in network byte order (NBO).
Le coppie sono ordinate in ordine crescente rispetto a <valore campo>.
Per confrontare i valori, usare le seguenti regole:
stringhe usare strcmp
interi confronto numerico
date ordine crescente di data
logical FALSE < TRUE
Nel caso di due record contenenti lo stesso valore nell campo indicizzato,
si deve mantenere l'ordine in cui occorrono nel database. In altre parole,
le coppie con lo stesso valore sono ordinate in ordine crescente rispetto
al numero del record.
Argomenti:
int handle handle del database (già aperto)
char *fieldname nome del campo per il quale va creato l'indice
Il nome del file indice da creare e' "<database name>.<field name>.ndx"
Valori di ritorno:
La funzione restituisce un codice di errore negativo in caso di errore, o
LP_OK quando la creazione dell'indice puo' essere completata con successo.
Errori:
(l'insieme puo' essere esteso con altre situazioni di errore individuate
durante l'implementazione)
LPC_BAD_ARG argomenti non validi o errati
Ricerca di un valore in un indice
int SearchRecordPosition(int handle,
FIELD_VALUE_t *FieldValue,
long *position);
Cerca il valore di un campo nel corrispondente file indice e restituisce
il numero di un record contenente il valore.
Argomenti:
int handle handle del database (già aperto)
char *fieldname nome del campo e suo valore da cercare
long *numrec in : numero di record da cui cominciare
la ricerca
out: il primo record contenente il valore
con numero strettamente maggiore del
numero di record ricevuto in input
Valori di ritorno:
Se NumRecStart e' il valore ricevuto in input attraverso numrec, restituisce
in numrec il numero del primo record contenente il valore con numero
strettamente maggiore di NumRecStart, se tale record esiste, e ritorna LPC_OK.
Ad esempio, per cercare il primo record occorre fornire come input 0 in
numrec. Se non ci sono record in posizione maggiore di NumRecStart, ritorna
LPC_NOT_FOUND.
In caso di errore, ritorna un codice di errore negativo.
Errori:
(l'insieme puo' essere esteso con altre situazioni di errore individuate
durante l'implementazione)
LPC_BAD_ARG
LPC_ERR_READ errori nel leggere dall'indice
Aggiornamento incrementale degli indici
int IncrementalReindex(int handle,
FIELD_VALUE_t *FieldValue,
int isInsertion,
long numrec);
Aggiorna il file contenente l'indice a seguito dell'inserimento/cancellazione
di un solo record nel database.
Argomenti:
int handle, handle del database (già aperto)
FIELD_VALUE_t *FieldValue nome del campo e suo valore da
inserire/cancellare dall'indice
int isInsertion tipo di operazione eseguita
valori possibili:
ADD_RECORD inserimento
DEL_RECORD cancellazione
long numrec numero del record aggiunto/eliminato
dal database
Valori di ritorno:
La funzione restituisce un codice di errore negativo in caso di errore, o
LP_OK quando l'aggiornamento del'indice puo' essere completato con successo.
Errori:
(l'insieme puo' essere esteso con altre situazioni di errore individuate
durante l'implementazione)
LPC_BAD_ARG
Note:
Quando si inserisce un nuovo record nel database occorre aggiornare
l'indice inserendo nell'opportuna posizione una nuova coppia <valore campo>
<numero record>. Quando si cancella un reecord, occorre cancellare dall'indice
la coppia corrispondente al record eliminato.
In entrambi i casi occorre aggiornare le coppie relative ai record che hanno
cambiato posizione a causa dell'inserimento/cancellazione (quelli che prima
dell'inserimento avevano un numero di record maggiore o uguale di numrec).
Le costanti ADD_RECORD e DEL_RECORD sono definite nell'interfaccia.
--
AndreaSterbini - 05 Jun 2006