api/modules/database/tools/db_operations.py
2025-07-11 13:52:19 +00:00

74 lines
2.7 KiB
Python

from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
import os
import modules.logger_tool as logger
log_name = 'api_modules_database_tools_db_operations'
log_dir = os.getenv("LOG_PATH", "/logs") # Default path as fallback
logging = logger.get_logger(
name=log_name,
log_level=os.getenv("LOG_LEVEL", "DEBUG"),
log_path=log_dir,
log_file=log_name,
runtime=True,
log_format='default'
)
from fastapi.testclient import TestClient
from fastapi import HTTPException
import time
from neo4j import GraphDatabase
class DatabaseNotFoundError(Exception):
"""Exception raised when the specified database cannot be found."""
def __init__(self, db_name):
super().__init__(f"Database '{db_name}' not found.")
# Dev ??
def get_client():
from main import app # Delayed import to avoid circular dependency
return TestClient(app)
# Ops ??
def stop_database(db_name):
client = get_client()
try:
logging.debug(f"Stopping database {db_name}")
response = client.post("/database/admin/stop-database", json={"db_name": db_name})
except DatabaseNotFoundError:
logging.info(f"Database {db_name} not found when attempting to stop. Skipping.")
else:
logging.info(response.text)
return response
def drop_database(db_name):
client = get_client()
try:
response = client.post("/database/admin/drop-database", json={"db_name": db_name})
except DatabaseNotFoundError:
logging.info(f"Database {db_name} not found when attempting to drop. Skipping.")
else:
logging.info(response.text)
return response
def create_database(db_name):
client = get_client()
response = client.post("/database/admin/create-database", params={"db_name": db_name})
logging.info(response.text)
return response
def check_database_availability(db_name, retries=5, delay=5): # Increased delay
client = get_client()
attempt = 0
while attempt < retries:
try:
logging.info(f"Attempt {attempt + 1}: Checking availability for database {db_name}")
response = client.get(f"/check-database-availability?db_name={db_name}")
if response.status_code == 200 and response.json().get('status') == "ready":
logging.info(f"Database {db_name} is ready.")
return response.json()
else:
logging.error(f"Database {db_name} is not available: {response.text}")
except Exception as e:
logging.error(f"Error checking database availability for {db_name} on attempt {attempt + 1}: {e}")
time.sleep(delay) # Increased delay before the next retry
attempt += 1
raise HTTPException(status_code=503, detail="Database availability check failed after retries")