Πληροφορική & Τηλεπικοινωνίες K25 Ανάπτυξη Λογισμικού Εαρινό Εξάμηνο 2008 Καθηγητής Γιάννης Ιωαννίδης Επίπεδο Αρχείου Εγγραφών Εισαγωγή Το επίπεδο Αρχείου Εγγραφών δίνει ρουτίνες για τη διαχείριση αδόμητων αρχείων σε επίπεδο εγγραφών. Τα ονόματα όλων των ρουτινών αρχίζουν με το πρόθεμα HF, ώστε να υποδεικνύουν το γεγονός ότι πρόκειται για υλοποίηση αρχείου χωρίς δομή (HF=Heap File. Το HF επίπεδο στηρίζεται στο BF. Ρουτίνες Υλοποίησης Επιπέδου Αρχείου Εγγραφών HF_Init( void HF_Init( void Η ρουτίνα αυτή χρησιμοποιείται για την αρχικοποίηση της HF διεπαφής. Πρέπει να καλείται προτού χρησιμοποιηθούν οι HF ρουτίνες. Δεν έχει καμμία παράμετρο εισόδου και δεν παράγει καμμία έξοδο. HF_CreateFile( int HF_CreateFile( char *filename, /* όνομα αρχείου */ Η ρουτίνα αυτή δημιουργεί και αρχικοποιεί ένα αρχείο με όνομα filename. Το αρχείο δεν πρέπει να υπάρχει ήδη. Επιστρέφει HFE_OK εάν το καινούργιο αρχείο δημιουργηθεί με επιτυχία, ειδ' αλλοιώς κάποιον κωδικό σφάλματος. HF_DestroyFile( int HF_DestroyFile( char *filename /* όνομα αρχείου */
Η ρουτίνα αυτή καταστρέφει το αρχείο filename, σβήνοντας όλα τα δεδομένα του. Το αρχείο πρέπει να υπάρχει ήδη αλλά να μην είναι ανοιχτό. Επιστρέφει HFE_OK εάν επιτύχει, ειδ' αλλοιώς κάποιον κωδικό σφάλματος. HF_OpenFile( int HF_OpenFile ( char *filename /* όνομα αρχείου */ Η ρουτίνα αυτή ανοίγει το αρχείο filename. Εάν το αρχείο ανοιχτεί κανονικά, η ρουτίνα επιστρέφει έναν μικρό μη αρνητικό ακέραιο, ο οποίος χρησιμοποιείται για να αναγνωρίζεται το αρχείο, ειδ' αλλοιώς επιστρέφει κάποιον κωδικό σφάλματος. Ένα αρχείο μπορεί να έχει ανοιχτεί παραπάνω από μία φορές. HF_CloseFile( int HF_CloseFile ( int filedesc /* αριθμός που αντιστοιχεί σε ανοιχτό αρχείο */ Η ρουτίνα αυτή κλείνει το αρχείο με αναγνωριστικό αριθμό filedesc. Επιστρέφει HFE_OK εάν το αρχείο κλείσει επιτυχώς, ειδ' αλλοιώς κάποιον κωδικό σφάλματος. HF_InsertRec( int HF_InsertRec( char *record, /* δείκτης προς τα περιεχόμενα εγγραφής */ Η ρουτίνα εισάγει την εγγραφή που δείχνει ο δείκτης record στο ανοιχτό αρχείο με αναγνωριστικό αριθμό filedesc. Το μέγεθος της εγγραφής είναι recordsize. Η ρουτίνα επιστρέφει ένα έναν μη αρνητικό ακέραιο ως το αναγνωριστικό εγγραφής (recid το οποίο έχει ανατεθεί στη νεοεισελθούσα εγγραφή, αν η εισαγωγή είναι επιτυχής, ειδ' αλλοιώς έναν κωδικό σφάλματος. HF_DeleteRec( int HF_DeleteRec( int recid, /* αναγνωριστικό εγγραφής */ Η ρουτίνα διαγράφει την εγγραφή που υποδηλώνεται από το αναγνωριστικό εγγραφής recid από το ανοιχτό αρχείο με αναγνωριστικό αριθμό filedesc. Το μέγεθος της εγγραφής είναι recordsize. Η ρουτίνα επιστρέφει HFE_OK εάν η διαγραφή επιτύχει ή κάποιον κωδικό σφάλματος του επιπέδου HF εάν κάτι δεν λειτουργήσει
HF_GetFirstRec( int HF_GetFirstRec( Η ρουτίνα αυτή ανακτά ένα αντίγραφο της πρώτης εγγραφής του αρχείου με αναγνωριστικό αριθμό filedesc. Το μέγεθος της εγγραφής είναι recordsize. Αν πετύχει, τότε επιστρέφει το αντίστοιχο αναγνωριστικό εγγραφής (recid ενώ τα περιεχόμενα της ίδιας της εγγραφής μπαίνουν στο χώρο που δείχνει ο δείκτης record. Ειδ' αλλοιώς, η ρουτίνα επιστρέφει HFE_EOF εάν είμαστε στο τέλος του αρχείου (δηλαδή, εάν το αρχείο δεν έχει καμμία εγγραφή, ή κάποιον άλλον κωδικό σφάλματος εάν κάτι δεν λειτουργήσει όπως πρέπει. HF_GetNextRec( int HF_GetNextRec( int recid, /* αναγνωριστικό προηγούμενης εγγραφής */ Η ρουτίνα αυτή ανακτά ένα αντίγραφο της εγγραφής του αρχείου με αναγνωριστικό αριθμό filedesc που βρίσκεται μετά την εγγραφή με αναγνωριστικό εγγραφής recid. Το μέγεθος της εγγραφής είναι recordsize. Αν πετύχει, τότε επιστρέφει το αντίστοιχο αναγνωριστικό εγγραφής (recid ενώ τα περιεχόμενα της ίδιας της εγγραφής μπαίνουν στο χώρο που δείχνει ο δείκτης record. Ειδ' αλλοιώς, η ρουτίνα επιστρέφει HFE_EOF εάν έχουμε φτάσει στο τέλος του αρχείου, ή κάποιον άλλον κωδικό σφάλματος εάν κάτι δεν λειτουργήσει HF_GetThisRec( int HF_GetThisRec( int recid, /* αναγνωριστικό εγγραφής */ Η ρουτίνα αυτή ανακτά ένα αντίγραφο της εγγραφής με αναγνωριστικό εγγραφής recid του αρχείου με αναγνωριστικό αριθμό filedesc Το μέγεθος της εγγραφής είναι recordsize. Αν πετύχει, τότε επιστρέφει HFE_OK ενώ τα περιεχόμενα της ίδιας της εγγραφής μπαίνουν στο χώρο που δείχνει ο δείκτης record. Ειδ' αλλοιώς, η ρουτίνα επιστρέφει HFE_INVALIDRECORD εάν η τιμή του recid δεν αντιστοιχεί σε αναγνωριστικό αριθμό υπαρκτής εγγραφής, ή κάποιον άλλον κωδικό σφάλματος εάν κάτι δεν λειτουργήσει HF_OpenFileScan( int HF_OpenFileScan( int recordsize, /* μέγεθος κάθε εγγραφής του αρχείου */ char attrtype, /* τύπος πεδίου: 'c', 'i', ή 'f' */
int attrlength, /* μέγεθος πεδίου σε μπάιτ: 4 για 'i' ή 'f', 1-255 για 'c' */ int attroffset, /* απόσταση πεδίου σε μπάιτ από την αρχή της εγγραφής */ int op, /* τελεστής σύγκρισης */ char *value /* δείκτης προς τιμή για σύγκριση */ Η ρουτίνα αυτή ξεκινά μια σάρωση των εγγραφών του αρχείου με αναγνωριστικό αριθμό filedesc οι οποίες έχουν στο σημείο (πεδίο που προσδιορίζεται τιμές που ικανοποιούν την καθορισμένη συνθήκη. Το μέγεθος της εγγραφής είναι recordsize. Αν η παράμετρος value έχει μηδενικό δείκτη ως τιμή (null, τότε ξεκινά σάρωση όλων των εγγραφών ανεξαρτήτως των τιμών των παραμέτρων attrtype, attrlength, attroffset, και op. Ειδ' αλλοιώς, ο δείκτης value δείχνει στην τιμή με την οποία τα αντίστοιχα σημεία των εγγραφών πρέπει να συγκριθούν σύμφωνα με τον τελεστή op. Ο μη αρνητικός ακέραιος που επιστρέφεται από τη ρουτίνα αντιπροσωπεύει το αναγνωριστικό της σάρωσης. Η παράμετρος op καθορίζει τον τρόπο με τον οποίο η τιμή που δείχνει ο δείκτης value πρέπει να συγκριθεί με τις προσδιορισμένες τιμές από τις εγγραφές. ΟΙ διαφορετικές επιλογές για την τιμή της παραμέτρου op είναι οι εξής: 1 για EQUAL (δηλαδή, attribute = value 2 για LESS THAN (δηλαδή, attribute < value 3 για GREATER THAN (δηλαδή, attribute > value 4 για LESS THAN OR EQUAL (δηλαδή, attribute <= value 5 για GREATER THAN OR EQUAL (δηλαδή, attribute >= value 6 για NOT EQUAL (δηλαδή, attribute!= value HF_FindNextRec( int HF_FindNextRec( int scandesc, /* αριθμός που αντιστοιχεί σε ενεργή σάρωση */ char *record /* δείκτης προς τα περιεχόμενα της εγγραφής που ζητήθηκε */ Η ρουτίνα αυτή ανακτά ένα αντίγραφο της επόμενης εγγραφής που συναντά κατά τη σάρωση με αναγνωριστικό σάρωσης scandesc και που ικανοποιεί τη συνθήκη της σάρωσης. Αν πετύχει, τότε επιστρέφει το αντίστοιχο αναγνωριστικό εγγραφής (recid ενώ τα περιεχόμενα της ίδιας της εγγραφής μπαίνουν στο χώρο που δείχνει ο δείκτης record. Ειδ' αλλοιώς, η ρουτίνα επιστρέφει HFE_EOF εάν έχουμε φτάσει στο τέλος του αρχείου, ή κάποιον άλλον κωδικό σφάλματος εάν κάτι δεν λειτουργήσει HF_CloseFileScan( int HF_CloseFileScan( int scandesc /* αριθμός που αντιστοιχεί σε ενεργή σάρωση */ Η ρουτίνα αυτή τερματίζει τη σάρωση με αναγνωριστικό σάρωσης scandesc. Αν πετύχει, τότε επιστρέφει HFE_OK, ειδ' αλλοιώς, κάποιον κωδικό σφάλματος. HF_PrintError( void HF_PrintError( char *errstring /* κείμενο για εκτύπωση */ Η ρουτίνα τυπώνει το κείμενο που δείχνει η παράμετρος errstring, και μετά τυπώνει το μήνυμα που
αντιστοιχεί στο τελευταίο σφάλμα που προέκυψε από οποιαδήποτε από τις ρουτίνες του επιπέδου HF. Η ρουτίνα αυτή δεν έχει δική της τιμή επιστροφής.