Υλοποίηση Συστηματων Βάσεων Δεδομένων - Εργασία 1#


Ομάδα

  • Βασταρδής Νικόλαος (1115201900020)
  • Δημήτρης Γιαννάκος-Καίσαρης(1115201900315)

Κοινές Παρατηρήσεις

  • Όλες οι δομές με μεταδεδομένα αρχείου κρατάνε τον FileDescriptor του αρχείου.
  • Το πεδίο FileDescriptor δεν ορίζεται στις συναρτήσεις CreateFile αλλά διαβάζεται και ενημερώνεται στις Open, καθώς αν ανοίξουν πολλαπλά αρχεία στο επίπεδο BF όλα θα έχουν το ίδιο FileDescriptor προκαλώντας προβλήματα στις Insert και GetAllEntries.
  • Όλες οι δομές με μεταδεδομένα των block κρατάνε την πληροφορία RecordCount, η οποία βοηθάει στην εύρεση εγγραφών και στον έλεγχο για το αν το block είναι γεμάτο
  • Κάθε μπλοκ διατηρεί μέχρι 6 εγγραφές προτού γεμίσει.

Συναρτήσεις Hash Table

  • Η αντιστοίχιση μεταξύ bucket και blocks γίνεται μέσω ενός array από δομές τύπου Bucket_Info, οι οποίες περιλαμβάνουν γενικές πληροφορίες για το εκάστοτε bucket. Τα bucket αναπαρίστανται από το index του array και κάθε εγγραφή αντιστοιχίζεται σε ένα μέσω της συνάρτησησ hash.
  • Η δομή Bucket_Info, περιέχει τον αριθμό των εγγραφών, τον αριθμό των block που αντιστοιχούν στο συγεκριμένο bucket και το id του block στο οποίο θα πέσουν οι καινούριες εγγραφές που αντιστοιχούν στο bucket. Η δομή αυτή είναι αρκετά χρήσιμη για την υλοποίηση της HashStatistics( η οποία έχει μετανομαστεί σε HT_HashStatistics προκειμένου να υλοποιηθεί και η SHT_HashStatistics).

Συναρτήσεις Secondary Hash Table

  • Οι εγγραφές στα block του δευτερεύοντος ευρετηρίου, είναι τύπου SHT_Records, που περιλαμβάνουν ένα πεδίο με το Name και ένα για το αντίσοτοιχο block Id. Αποτελούν αντιστοίχιση, δλδ ονόματος με blockId.
  • Η αντιστοίχιση blocks και buckets γίνεται ακριβώς όπως στις συναρτήσεις του πρωτεύοντος ευρετηρίου ( Hash Table).
  • Η συνάρτηση SecondaryInsert ελέγχει αν το block που αντιστοιχεί στο bucket της είναι initialized, μετά αν υπάρχει ξανά εγγραφή με ίδιο όνομα και block. Αν υπάρχει, απλά ενημερώνει για το πόσες φορές εντοπίστηκε η εγγραφή στο sht και γυρίζει το block_id στο οποίο βρίσκεται. Αν δε βρεθεί γίνεται έλεγχος για το αν το block που αντιστοιχεί στο bucket είναι γεμάτο. Αν είναι γεμάτο, φτιάχνει νέο block και περνάει εκεί την εγγραφή. Αν δεν είναι γεμάτο, απλά προδθέτει την εγγραφή και ενημερώνει τον recordCounter.
  • Στην SecondaryGetAllEntries, αρχικά γίνεται αναζήτηση όλων των εγγραφών SHT_Records που υπάρχουν στο αντίστοιχο bucket που προκύπτει από τη συνάρτηση κατακερματισμού hashName, και στη συνέχεια αποθηκεύονται τα blockId που αντιστοιχούν στο συγκεκριμένο Name, σε μια δομή λίστας με όνομα BlockList. Τέλος διαβάζονται τα blockId που είναι αποθηκευμένα στο blockList και για κάθε ένα, φορτώνεται το αντίστοιχο block στο επίπεδο BF και διαβάζονται οι εγγραφές, τυπώνοντας αυτές με το όνομα που αναζητούμε.