|
3 | 3 | import threading |
4 | 4 | from datetime import datetime |
5 | 5 | from pathlib import Path |
6 | | -from typing import Any, Dict, Optional |
| 6 | +from typing import Any, Dict, Optional, List |
| 7 | +from peewee import Model, AutoField, DateTimeField, TextField |
| 8 | +from playhouse.reflection import Introspector |
7 | 9 |
|
8 | 10 | # Lazy imports for database components |
9 | 11 | peewee = None |
@@ -204,6 +206,52 @@ def write_to_db(table_name: str, data: Dict[str, Any]) -> bool: |
204 | 206 | return False |
205 | 207 |
|
206 | 208 |
|
| 209 | +def read_from_db( |
| 210 | + table_name: str, |
| 211 | + filters: Optional[Dict[str, Any]] = None, |
| 212 | + limit: int = 1 |
| 213 | +) -> List[Dict[str, Any]]: |
| 214 | + db_config = _get_db_config() |
| 215 | + if not db_config.get("enabled", False): |
| 216 | + logger.warning("Database disabled. Skipping read.") |
| 217 | + return [] |
| 218 | + |
| 219 | + db = _get_db() |
| 220 | + if db is None: |
| 221 | + logger.error("Failed to connect to database.") |
| 222 | + return [] |
| 223 | + |
| 224 | + _ensure_peewee_imported() |
| 225 | + |
| 226 | + try: |
| 227 | + introspector = Introspector.from_database(db) |
| 228 | + DynamicModel = introspector.generate_models(table_names=[table_name]).get(table_name) |
| 229 | + |
| 230 | + if DynamicModel is None: |
| 231 | + logger.warning(f"Table '{table_name}' not found in database.") |
| 232 | + return [] |
| 233 | + |
| 234 | + query = DynamicModel.select() |
| 235 | + |
| 236 | + if filters: |
| 237 | + for key, value in filters.items(): |
| 238 | + if hasattr(DynamicModel, key): |
| 239 | + field = getattr(DynamicModel, key) |
| 240 | + query = query.where(field == value) |
| 241 | + else: |
| 242 | + logger.warning(f"Filter key '{key}' does not exist in table '{table_name}'. Skipped.") |
| 243 | + |
| 244 | + query = query.order_by(DynamicModel.created_at.desc()).limit(limit) |
| 245 | + |
| 246 | + results = [] |
| 247 | + for row in query: |
| 248 | + results.append(row.__data__) |
| 249 | + return results |
| 250 | + |
| 251 | + except Exception as e: |
| 252 | + logger.error(f"Error reading from table '{table_name}': {e}") |
| 253 | + return [] |
| 254 | + |
207 | 255 | def database_connection(build_id: str) -> None: |
208 | 256 | logger.info(f"Setting test build ID: {build_id}") |
209 | 257 | _set_test_build_id(build_id) |
|
0 commit comments