This commit is contained in:
@@ -8,17 +8,26 @@ from app.config import (
|
|||||||
POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD
|
POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD
|
||||||
)
|
)
|
||||||
|
|
||||||
# Import PostgreSQL dependencies only if needed
|
|
||||||
if USE_POSTGRES:
|
|
||||||
import psycopg2
|
|
||||||
from psycopg2.extras import RealDictCursor
|
|
||||||
|
|
||||||
class DatabaseManager:
|
class DatabaseManager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.db_type = "postgresql" if USE_POSTGRES else "sqlite"
|
self.db_type = "postgresql" if USE_POSTGRES else "sqlite"
|
||||||
self.connection_params = None
|
self.connection_params = None
|
||||||
|
self.db_path = None
|
||||||
|
|
||||||
if USE_POSTGRES:
|
if USE_POSTGRES:
|
||||||
|
# Import PostgreSQL dependencies only when needed
|
||||||
|
try:
|
||||||
|
import psycopg2
|
||||||
|
from psycopg2.extras import RealDictCursor
|
||||||
|
self.psycopg2 = psycopg2
|
||||||
|
self.RealDictCursor = RealDictCursor
|
||||||
|
except ImportError as e:
|
||||||
|
print(f"PostgreSQL dependencies not available: {e}")
|
||||||
|
print("Falling back to SQLite")
|
||||||
|
self.db_type = "sqlite"
|
||||||
|
self._init_sqlite_path()
|
||||||
|
return
|
||||||
|
|
||||||
self.connection_params = {
|
self.connection_params = {
|
||||||
'host': POSTGRES_HOST,
|
'host': POSTGRES_HOST,
|
||||||
'port': POSTGRES_PORT,
|
'port': POSTGRES_PORT,
|
||||||
@@ -31,8 +40,6 @@ class DatabaseManager:
|
|||||||
|
|
||||||
def _init_sqlite_path(self):
|
def _init_sqlite_path(self):
|
||||||
"""Initialize SQLite database path with fallback logic"""
|
"""Initialize SQLite database path with fallback logic"""
|
||||||
global DB_PATH
|
|
||||||
|
|
||||||
# Try to use the mounted volume first
|
# Try to use the mounted volume first
|
||||||
db_path = '/db/cache.db'
|
db_path = '/db/cache.db'
|
||||||
db_dir = os.path.dirname(db_path)
|
db_dir = os.path.dirname(db_path)
|
||||||
@@ -67,18 +74,18 @@ class DatabaseManager:
|
|||||||
db_path = 'cache.db'
|
db_path = 'cache.db'
|
||||||
print(f"Using local database file: {db_path}")
|
print(f"Using local database file: {db_path}")
|
||||||
|
|
||||||
DB_PATH = db_path
|
self.db_path = db_path
|
||||||
|
|
||||||
def get_connection(self):
|
def get_connection(self):
|
||||||
"""Get database connection based on configured database type"""
|
"""Get database connection based on configured database type"""
|
||||||
if USE_POSTGRES:
|
if self.db_type == "postgresql":
|
||||||
return psycopg2.connect(**self.connection_params)
|
return self.psycopg2.connect(**self.connection_params)
|
||||||
else:
|
else:
|
||||||
return sqlite3.connect(DB_PATH)
|
return sqlite3.connect(self.db_path)
|
||||||
|
|
||||||
def init_db(self):
|
def init_db(self):
|
||||||
"""Initialize database and create tables"""
|
"""Initialize database and create tables"""
|
||||||
if USE_POSTGRES:
|
if self.db_type == "postgresql":
|
||||||
self._init_postgres_db()
|
self._init_postgres_db()
|
||||||
else:
|
else:
|
||||||
self._init_sqlite_db()
|
self._init_sqlite_db()
|
||||||
@@ -105,7 +112,10 @@ class DatabaseManager:
|
|||||||
print(f"PostgreSQL database initialized at {POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DB}")
|
print(f"PostgreSQL database initialized at {POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DB}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error initializing PostgreSQL database: {e}")
|
print(f"Error initializing PostgreSQL database: {e}")
|
||||||
raise
|
print("Falling back to SQLite")
|
||||||
|
self.db_type = "sqlite"
|
||||||
|
self._init_sqlite_path()
|
||||||
|
self._init_sqlite_db()
|
||||||
|
|
||||||
def _init_sqlite_db(self):
|
def _init_sqlite_db(self):
|
||||||
"""Initialize SQLite database"""
|
"""Initialize SQLite database"""
|
||||||
@@ -123,15 +133,14 @@ class DatabaseManager:
|
|||||||
''')
|
''')
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
print(f"SQLite database initialized at {DB_PATH}")
|
print(f"SQLite database initialized at {self.db_path}")
|
||||||
except sqlite3.OperationalError as e:
|
except sqlite3.OperationalError as e:
|
||||||
print(f"Error initializing database at {DB_PATH}: {e}")
|
print(f"Error initializing database at {self.db_path}: {e}")
|
||||||
# Fallback to using a local database file if the mounted volume has permission issues
|
# Fallback to using a local database file if the mounted volume has permission issues
|
||||||
global DB_PATH
|
self.db_path = 'cache.db'
|
||||||
DB_PATH = 'cache.db'
|
print(f"Falling back to local database file: {self.db_path}")
|
||||||
print(f"Falling back to local database file: {DB_PATH}")
|
|
||||||
try:
|
try:
|
||||||
conn = sqlite3.connect(DB_PATH)
|
conn = sqlite3.connect(self.db_path)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute('''
|
cursor.execute('''
|
||||||
CREATE TABLE IF NOT EXISTS cache (
|
CREATE TABLE IF NOT EXISTS cache (
|
||||||
@@ -144,7 +153,7 @@ class DatabaseManager:
|
|||||||
''')
|
''')
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
print(f"Local database initialized at {DB_PATH}")
|
print(f"Local database initialized at {self.db_path}")
|
||||||
except sqlite3.OperationalError as e2:
|
except sqlite3.OperationalError as e2:
|
||||||
print(f"Error initializing local database: {e2}")
|
print(f"Error initializing local database: {e2}")
|
||||||
raise
|
raise
|
||||||
@@ -182,7 +191,7 @@ class DatabaseManager:
|
|||||||
# Convert data to JSON string
|
# Convert data to JSON string
|
||||||
data_json = json.dumps(data)
|
data_json = json.dumps(data)
|
||||||
|
|
||||||
if USE_POSTGRES:
|
if self.db_type == "postgresql":
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"INSERT INTO cache (url, route, data, timestamp) VALUES (%s, %s, %s, %s) ON CONFLICT (url, route) DO UPDATE SET data = %s, timestamp = %s",
|
"INSERT INTO cache (url, route, data, timestamp) VALUES (%s, %s, %s, %s) ON CONFLICT (url, route) DO UPDATE SET data = %s, timestamp = %s",
|
||||||
(url, route, data_json, timestamp, data_json, timestamp)
|
(url, route, data_json, timestamp, data_json, timestamp)
|
||||||
|
|||||||
Reference in New Issue
Block a user