Protokoll #24393

ID24393
Zeitstempel2025-12-27 16:23:22.152166
Clientroot
IP145.224.72.140
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens1,213 (Input: 51, Output: 1,162)
Dauer91 ms
Request-Zeit2025-12-27 16:23:22.152166
Response-Zeit2025-12-27 16:23:22.242723

Request

{
    "event": "PreToolUse",
    "tool_name": "Edit",
    "tool_input": {
        "file_path": "\/var\/www\/mcp-servers\/mcp-db\/tools\/execute_tool.py",
        "old_string": "* 1000)",
        "new_string": "* MS_PER_SECOND)",
        "replace_all": true
    }
}

Response

{
    "tool_response": {
        "filePath": "\/var\/www\/mcp-servers\/mcp-db\/tools\/execute_tool.py",
        "oldString": "* 1000)",
        "newString": "* MS_PER_SECOND)",
        "originalFile": "\"\"\"Execute Tool - Führt DDL\/DML Statements aus.\"\"\"\nimport sys\nimport time\n\nsys.path.insert(0, \"\/var\/www\/mcp-servers\/mcp-db\")\nsys.path.insert(0, \"\/var\/www\/mcp-servers\/shared\")\n\nfrom constants import LOG_QUERY_MAX_LENGTH, MS_PER_SECOND\n\nfrom domain.execute_contract import ExecuteRequest, ExecuteResponse, ExecuteStatus\nfrom domain.log_contract import LogEntry\nfrom infrastructure.db_connection import DatabaseConnection\nfrom infrastructure.protokoll_logger import ProtokollLogger\nfrom validators.execute_validator import ExecuteValidator\n\n\nclass ExecuteExecutor:\n    \"\"\"Führt validierte DDL\/DML Statements aus.\"\"\"\n\n    @staticmethod\n    def execute(request: ExecuteRequest) -> ExecuteResponse:\n        \"\"\"Führt ein validiertes Statement aus.\"\"\"\n        start = time.time()\n\n        try:\n            with DatabaseConnection.get_connection(request.database) as conn:\n                cursor = conn.cursor(buffered=True)\n                cursor.execute(request.statement, request.params)\n                affected_rows = cursor.rowcount\n                conn.commit()\n                cursor.close()\n\n                duration = int((time.time() - start) * 1000)\n\n                return ExecuteResponse(\n                    status=ExecuteStatus.SUCCESS,\n                    affected_rows=affected_rows,\n                    execution_ms=duration,\n                )\n\n        except Exception as e:\n            duration = int((time.time() - start) * 1000)\n\n            return ExecuteResponse(\n                status=ExecuteStatus.ERROR,\n                error=str(e)[:200],\n                execution_ms=duration,\n            )\n\n\ndef register_execute_tool(mcp) -> None:\n    \"\"\"Registriert db_execute Tool.\"\"\"\n    logger = ProtokollLogger()\n\n    @mcp.tool()\n    def db_execute(\n        statement: str,\n        database: str = \"ki_dev\",\n        params: list | None = None,\n    ) -> dict:\n        \"\"\"\n        Führt DDL-Statements aus (ALTER, CREATE, DROP, TRUNCATE).\n\n        Args:\n            statement: SQL DDL Statement\n            database: Zieldatenbank (ki_dev oder ki_content)\n            params: Optional - Parameter für Prepared Statements\n\n        Returns:\n            Dict mit status, affected_rows, error, execution_ms\n        \"\"\"\n        params_tuple = tuple(params) if params else None\n\n        # 1. Validierung\n        valid, error = ExecuteValidator.validate_statement(statement, database)\n\n        if not valid:\n            try:\n                logger.log(\n                    LogEntry(\n                        request=f\"EXECUTE: {statement[:150]}\",\n                        status=\"denied\",\n                        duration_ms=0,\n                        error_message=error,\n                    )\n                )\n            except Exception:\n                pass\n\n            return ExecuteResponse(status=ExecuteStatus.DENIED, error=error).to_dict()\n\n        # 2. Request erstellen\n        request = ExecuteRequest(\n            statement=statement,\n            database=database,\n            params=params_tuple,\n        )\n\n        # 3. Ausführung\n        response = ExecuteExecutor.execute(request)\n\n        # 4. Logging\n        try:\n            logger.log(\n                LogEntry(\n                    request=f\"EXECUTE: {statement[:150]}\",\n                    status=response.status.value,\n                    duration_ms=int(response.execution_ms),\n                    error_message=response.error,\n                )\n            )\n        except Exception:\n            pass\n\n        return response.to_dict()\n",
        "structuredPatch": [
            {
                "oldStart": 30,
                "oldLines": 7,
                "newStart": 30,
                "newLines": 7,
                "lines": [
                    "                 conn.commit()",
                    "                 cursor.close()",
                    " ",
                    "-                duration = int((time.time() - start) * 1000)",
                    "+                duration = int((time.time() - start) * MS_PER_SECOND)",
                    " ",
                    "                 return ExecuteResponse(",
                    "                     status=ExecuteStatus.SUCCESS,"
                ]
            },
            {
                "oldStart": 39,
                "oldLines": 7,
                "newStart": 39,
                "newLines": 7,
                "lines": [
                    "                 )",
                    " ",
                    "         except Exception as e:",
                    "-            duration = int((time.time() - start) * 1000)",
                    "+            duration = int((time.time() - start) * MS_PER_SECOND)",
                    " ",
                    "             return ExecuteResponse(",
                    "                 status=ExecuteStatus.ERROR,"
                ]
            }
        ],
        "userModified": false,
        "replaceAll": true
    }
}
← Vorheriger Zur Liste Nächster →