- Rename files: cog_cli.py, test_cog.py, k8s/cog-*.yaml - Update all Python tool names: cog_* -> assay_* - Update FastAPI titles, MCP server names, URLs - Update K8s manifests: deployments, services, secrets, ingress - Update Docker env vars: COG_API -> ASSAY_API - Domain: cog.loop42.de -> assay.loop42.de - SQLite path: /tmp/cog_db.sqlite -> /tmp/assay_db.sqlite Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
"""Shared database access for Thinker and Expert nodes."""
|
|
|
|
import logging
|
|
import os
|
|
|
|
log = logging.getLogger("runtime")
|
|
|
|
DB_HOST = os.environ.get("DB_HOST", "mariadb-eras")
|
|
DB_USER = "root"
|
|
DB_PASS = "root"
|
|
ALLOWED_DATABASES = ("eras2_production", "plankiste_test")
|
|
|
|
|
|
def run_db_query(query: str, database: str = "eras2_production",
|
|
host: str = DB_HOST, user: str = DB_USER, password: str = DB_PASS) -> str:
|
|
"""Execute a read-only SQL query against MariaDB. Returns tab-separated results."""
|
|
import pymysql
|
|
trimmed = query.strip().upper()
|
|
if not (trimmed.startswith("SELECT") or trimmed.startswith("DESCRIBE") or trimmed.startswith("SHOW")):
|
|
return "Error: Only SELECT/DESCRIBE/SHOW queries allowed"
|
|
if database not in ALLOWED_DATABASES:
|
|
return f"Error: Unknown database '{database}'"
|
|
conn = pymysql.connect(host=host, user=user, password=password,
|
|
database=database, connect_timeout=5, read_timeout=15)
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query)
|
|
rows = cur.fetchall()
|
|
if not rows:
|
|
return "(no results)"
|
|
cols = [d[0] for d in cur.description]
|
|
lines = ["\t".join(cols)]
|
|
for row in rows:
|
|
lines.append("\t".join(str(v) if v is not None else "" for v in row))
|
|
return "\n".join(lines)
|
|
finally:
|
|
conn.close()
|