Pulastya B commited on
Commit
b7165a8
·
1 Parent(s): d92d2aa

fix: Add robust error handling for sessions database initialization

Browse files

- Add try-catch in _init_database() to handle corrupted databases
- Automatically delete and recreate corrupted session databases
- Add retry logic in save() when 'no such table: sessions' error occurs
- Add informative console messages for database initialization status
- Prevents 500 Internal Server Error when session database is missing

This fixes the OperationalError: no such table: sessions issue

Files changed (1) hide show
  1. src/session_store.py +100 -39
src/session_store.py CHANGED
@@ -44,26 +44,56 @@ class SessionStore:
44
 
45
  def _init_database(self):
46
  """Create sessions table if it doesn't exist."""
47
- conn = sqlite3.connect(self.db_path)
48
- cursor = conn.cursor()
49
-
50
- cursor.execute("""
51
- CREATE TABLE IF NOT EXISTS sessions (
52
- session_id TEXT PRIMARY KEY,
53
- created_at TEXT NOT NULL,
54
- last_active TEXT NOT NULL,
55
- context_json TEXT NOT NULL
56
- )
57
- """)
58
-
59
- # Create index on last_active for faster queries
60
- cursor.execute("""
61
- CREATE INDEX IF NOT EXISTS idx_last_active
62
- ON sessions(last_active DESC)
63
- """)
64
-
65
- conn.commit()
66
- conn.close()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
  def _make_json_serializable(self, obj: Any) -> Any:
69
  """
@@ -116,25 +146,56 @@ class SessionStore:
116
  Args:
117
  session: SessionMemory instance to save
118
  """
119
- conn = sqlite3.connect(self.db_path)
120
- cursor = conn.cursor()
121
-
122
- # Serialize session to JSON - clean non-serializable objects first
123
- data = session.to_dict()
124
- clean_data = self._make_json_serializable(data)
125
-
126
- cursor.execute("""
127
- INSERT OR REPLACE INTO sessions (session_id, created_at, last_active, context_json)
128
- VALUES (?, ?, ?, ?)
129
- """, (
130
- session.session_id,
131
- session.created_at.isoformat(),
132
- session.last_active.isoformat(),
133
- json.dumps(clean_data)
134
- ))
135
-
136
- conn.commit()
137
- conn.close()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
 
139
  def load(self, session_id: str) -> Optional[SessionMemory]:
140
  """
 
44
 
45
  def _init_database(self):
46
  """Create sessions table if it doesn't exist."""
47
+ try:
48
+ conn = sqlite3.connect(self.db_path)
49
+ cursor = conn.cursor()
50
+
51
+ cursor.execute("""
52
+ CREATE TABLE IF NOT EXISTS sessions (
53
+ session_id TEXT PRIMARY KEY,
54
+ created_at TEXT NOT NULL,
55
+ last_active TEXT NOT NULL,
56
+ context_json TEXT NOT NULL
57
+ )
58
+ """)
59
+
60
+ # Create index on last_active for faster queries
61
+ cursor.execute("""
62
+ CREATE INDEX IF NOT EXISTS idx_last_active
63
+ ON sessions(last_active DESC)
64
+ """)
65
+
66
+ conn.commit()
67
+ conn.close()
68
+ print(f"✅ Sessions database initialized at {self.db_path}")
69
+ except Exception as e:
70
+ print(f"⚠️ Failed to initialize sessions database: {e}")
71
+ # Try to recreate the database if corrupted
72
+ try:
73
+ Path(self.db_path).unlink(missing_ok=True)
74
+ print(f" Deleted corrupted database, reinitializing...")
75
+ conn = sqlite3.connect(self.db_path)
76
+ cursor = conn.cursor()
77
+
78
+ cursor.execute("""
79
+ CREATE TABLE IF NOT EXISTS sessions (
80
+ session_id TEXT PRIMARY KEY,
81
+ created_at TEXT NOT NULL,
82
+ last_active TEXT NOT NULL,
83
+ context_json TEXT NOT NULL
84
+ )
85
+ """)
86
+
87
+ cursor.execute("""
88
+ CREATE INDEX IF NOT EXISTS idx_last_active
89
+ ON sessions(last_active DESC)
90
+ """)
91
+
92
+ conn.commit()
93
+ conn.close()
94
+ print(f"✅ Sessions database reinitialized successfully")
95
+ except Exception as retry_error:
96
+ print(f"❌ Failed to reinitialize sessions database: {retry_error}")
97
 
98
  def _make_json_serializable(self, obj: Any) -> Any:
99
  """
 
146
  Args:
147
  session: SessionMemory instance to save
148
  """
149
+ try:
150
+ conn = sqlite3.connect(self.db_path)
151
+ cursor = conn.cursor()
152
+
153
+ # Serialize session to JSON - clean non-serializable objects first
154
+ data = session.to_dict()
155
+ clean_data = self._make_json_serializable(data)
156
+
157
+ cursor.execute("""
158
+ INSERT OR REPLACE INTO sessions (session_id, created_at, last_active, context_json)
159
+ VALUES (?, ?, ?, ?)
160
+ """, (
161
+ session.session_id,
162
+ session.created_at.isoformat(),
163
+ session.last_active.isoformat(),
164
+ json.dumps(clean_data)
165
+ ))
166
+
167
+ conn.commit()
168
+ conn.close()
169
+ except sqlite3.OperationalError as e:
170
+ if "no such table" in str(e):
171
+ print(f"⚠️ Sessions table not found, reinitializing database...")
172
+ self._init_database()
173
+ # Retry save after reinitialization
174
+ try:
175
+ conn = sqlite3.connect(self.db_path)
176
+ cursor = conn.cursor()
177
+
178
+ data = session.to_dict()
179
+ clean_data = self._make_json_serializable(data)
180
+
181
+ cursor.execute("""
182
+ INSERT OR REPLACE INTO sessions (session_id, created_at, last_active, context_json)
183
+ VALUES (?, ?, ?, ?)
184
+ """, (
185
+ session.session_id,
186
+ session.created_at.isoformat(),
187
+ session.last_active.isoformat(),
188
+ json.dumps(clean_data)
189
+ ))
190
+
191
+ conn.commit()
192
+ conn.close()
193
+ print(f"✅ Session saved successfully after database reinitialization")
194
+ except Exception as retry_error:
195
+ print(f"❌ Failed to save session after reinitialization: {retry_error}")
196
+ raise
197
+ else:
198
+ raise
199
 
200
  def load(self, session_id: str) -> Optional[SessionMemory]:
201
  """