mirror of
https://github.com/UofCBaja/Interview-Backend.git
synced 2025-06-15 13:24:19 -06:00
feat(ReadDB): Added file-lock check for when the file is being written to, if not locked, will read file.
This commit is contained in:
parent
fedbfff60c
commit
742b4360e3
85
ReadDB.py
85
ReadDB.py
@ -1,42 +1,75 @@
|
||||
import pandas as pd
|
||||
import json
|
||||
from filelock import FileLock, Timeout
|
||||
import time
|
||||
|
||||
# Define the path to the Excel file and the lock file
|
||||
excel_file_path = "./interview_database.xlsx"
|
||||
lock_file_path = "./interview_database.xlsx.lock"
|
||||
|
||||
def ReadDatabase():
|
||||
"""
|
||||
Reads the Database
|
||||
|
||||
``REQUIRES``: None
|
||||
|
||||
``PROMISES``: JSON (Interview Avaiable Slots)
|
||||
``PROMISES``: JSON (Interview Available Slots)
|
||||
|
||||
``Develop in part by``: Ahmad
|
||||
``Developed in part by``: Ahmad
|
||||
|
||||
``Contact``: ahmad.ahmad1@ucalgary.ca
|
||||
|
||||
"""
|
||||
# Load the updated Excel file into a pandas DataFrame
|
||||
excel_file_path = "./interview_database.xlsx"
|
||||
df = pd.read_excel(excel_file_path)
|
||||
# Retry parameters
|
||||
max_retries = 60 # Maximum number of retries if the file is locked
|
||||
retry_interval = 0.5 # Wait time (in seconds) between retries
|
||||
|
||||
# Initialize the dictionary to store the structured data
|
||||
interview_data = {}
|
||||
retries = 0
|
||||
while retries < max_retries:
|
||||
try:
|
||||
# Attempt to acquire a shared read (non-blocking) access
|
||||
with FileLock(lock_file_path, timeout=0): # Non-blocking, checks if the lock exists
|
||||
# Load the Excel file into a pandas DataFrame
|
||||
df = pd.read_excel(excel_file_path)
|
||||
|
||||
# Group the DataFrame by Date, Start Time, and Slot for organization
|
||||
for _, row in df.iterrows():
|
||||
date = str(row['Date'])
|
||||
start_time = str(row['Start Time'])
|
||||
slot = int(row['Slot']) if not pd.isna(row['Slot']) else 0
|
||||
#Returns amount of interviewees in the slot and if it's empty it will return 0
|
||||
interviewee_amount = len(str(row['Interviewee Name']).split()) if str(row['Interviewee Name']) != "nan" else 0
|
||||
# Initialize the dictionary to store the structured data
|
||||
interview_data = {}
|
||||
|
||||
# Check if the slot is available for an interviewee to attend
|
||||
avaliable_slots = interviewee_amount != slot
|
||||
if avaliable_slots:
|
||||
# Initialize nested structure if not present
|
||||
if date not in interview_data:
|
||||
interview_data[date] = {}
|
||||
#Adds the start time and duration if not present
|
||||
if start_time not in interview_data[date]:
|
||||
interview_data[date][start_time] = {
|
||||
'Meeting Duration': row['Meeting Duration'],
|
||||
}
|
||||
return interview_data
|
||||
# Group the DataFrame by Date, Start Time, and Slot for organization
|
||||
for _, row in df.iterrows():
|
||||
date = str(row['Date'])
|
||||
start_time = str(row['Start Time'])
|
||||
slot = int(row['Slot']) if not pd.isna(row['Slot']) else 0
|
||||
|
||||
# Returns the number of interviewees in the slot; returns 0 if empty
|
||||
interviewee_amount = len(str(row['Interviewee Name']).split()) if str(row['Interviewee Name']) != "nan" else 0
|
||||
|
||||
# Check if the slot is available for an interviewee to attend
|
||||
available_slots = interviewee_amount != slot
|
||||
if available_slots:
|
||||
# Initialize nested structure if not present
|
||||
if date not in interview_data:
|
||||
interview_data[date] = {}
|
||||
# Add the start time and duration if not present
|
||||
if start_time not in interview_data[date]:
|
||||
interview_data[date][start_time] = {
|
||||
'Meeting Duration': row['Meeting Duration'],
|
||||
}
|
||||
return interview_data # Successfully read the database
|
||||
|
||||
except Timeout:
|
||||
# File is locked; wait and retry
|
||||
retries += 1
|
||||
print(f"File is locked, retrying ({retries}/{max_retries})...")
|
||||
time.sleep(retry_interval)
|
||||
|
||||
# If max retries are exceeded, raise an error
|
||||
raise RuntimeError("Unable to access the database after multiple attempts due to a file lock.")
|
||||
|
||||
# Example usage of the ReadDatabase function
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
data = ReadDatabase()
|
||||
print(json.dumps(data, indent=4))
|
||||
except RuntimeError as e:
|
||||
print(e)
|
||||
|
Loading…
x
Reference in New Issue
Block a user