TraceIntel / db /setup.py
Siddhant Belkhede
Deploying
2b13511
# File: db/setup.py
import logging
from db.postgres import db_manager
from db.neo4j import neo4j_conn
# Standardized professional logging configuration
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger("DatabaseSetup")
def init_postgres_schema():
"""
Initializes the PostgreSQL database schema for forensic evidence storage.
Creates necessary tables with case isolation logic and data integrity constraints.
"""
try:
with db_manager.get_connection() as conn:
with conn.cursor() as cursor:
logger.info("Dropping legacy PostgreSQL evidence tables...")
cursor.execute("""
DROP TABLE IF EXISTS messages CASCADE;
DROP TABLE IF EXISTS calls CASCADE;
DROP TABLE IF EXISTS contacts CASCADE;
DROP TABLE IF EXISTS media_sharing CASCADE;
DROP TABLE IF EXISTS timeline CASCADE;
""")
logger.info("Applying core PostgreSQL schema definitions...")
cursor.execute("""
CREATE TABLE messages (
id SERIAL PRIMARY KEY,
case_id VARCHAR(100),
sender VARCHAR(255),
receiver VARCHAR(255),
timestamp TIMESTAMP,
message TEXT
);
CREATE TABLE calls (
id SERIAL PRIMARY KEY,
case_id VARCHAR(100),
caller VARCHAR(255),
receiver VARCHAR(255),
timestamp TIMESTAMP,
call_duration_seconds INTEGER,
call_type VARCHAR(50)
);
CREATE TABLE contacts (
id SERIAL PRIMARY KEY,
case_id VARCHAR(100),
name VARCHAR(255),
phone VARCHAR(50)
);
CREATE TABLE media_sharing (
id SERIAL PRIMARY KEY,
case_id VARCHAR(100),
sender VARCHAR(255),
receiver VARCHAR(255),
timestamp TIMESTAMP,
file_path VARCHAR(500),
file_name VARCHAR(255),
file_type VARCHAR(50),
file_data BYTEA
);
CREATE TABLE timeline (
id SERIAL PRIMARY KEY,
case_id VARCHAR(100),
timestamp TIMESTAMP,
event_type VARCHAR(100),
user_name VARCHAR(255),
details TEXT
);
""")
conn.commit()
logger.info("PostgreSQL evidence schema initialized successfully.")
# Initialize internal analysis result tables and chat history
db_manager.initialize_tables()
except Exception as e:
logger.error(f"Error during PostgreSQL schema initialization: {e}")
def init_neo4j_schema():
"""
Configures Neo4j graph database schema, constraints, and wipes legacy nodes.
"""
driver = neo4j_conn.get_driver()
if not driver:
logger.error("Neo4j driver unavailable. Skipping graph schema initialization.")
return
try:
with driver.session() as session:
logger.info("Clearing legacy Neo4j graph data...")
session.run("MATCH (n) DETACH DELETE n")
logger.info("Configuring Neo4j unique identity constraints...")
# Clean up deprecated constraints if they exist
session.run("DROP CONSTRAINT person_name IF EXISTS")
# Apply standard UID constraint for forensic entity resolution
session.run("""
CREATE CONSTRAINT person_uid IF NOT EXISTS
FOR (p:Person) REQUIRE p.uid IS UNIQUE
""")
logger.info("Neo4j schema constraints initialized successfully.")
except Exception as e:
logger.error(f"Error during Neo4j schema initialization: {e}")
if __name__ == "__main__":
logger.info("Starting Enterprise Database Setup sequence...")
init_postgres_schema()
init_neo4j_schema()
logger.info("Database setup sequence complete.")