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

Topic attachments
I Attachment History Action Size Date Who CommentSorted ascending
Unknown file formatgz Modulo5.tar.gz r1 manage 86.8 K 2007-03-14 - 12:44 StefanoGuerrini Modulo Cinque
Edit | Attach | Watch | Print version | History: r12 < r11 < r10 < r9 < r8 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r12 - 2007-03-15 - StefanoGuerrini






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback