src/lindorm_mcp_server/lindorm_wide_table.py (65 lines of code) (raw):
import mysql.connector
from mysql.connector import Error
class LindormWideTableClient:
def __init__(self, table_host: str, username: str, password: str, database='default'):
self.config = {
'host': table_host,
'port': 33060,
'user': username,
'password': password,
'database': database
}
self.connection = None
self.cursor = None
self._connect()
def _connect(self):
self.connection = mysql.connector.connect(**self.config)
self.cursor = self.connection.cursor()
def __del__(self):
self._close()
def _close(self):
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
def show_tables(self) -> str:
try:
self.cursor.execute(f"SHOW TABLES")
tables = self.cursor.fetchall()
result = ["Tables_in_" + self.config["database"]] # Header
result.extend([table[0] for table in tables])
return "\n".join(result)
except Error as e:
return f"Error executing SHOW TABLES: {str(e)}"
def describe_table(self, table_name: str) -> str:
try:
self.cursor.execute(f"DESCRIBE TABLE {table_name}")
columns = [desc[0] for desc in self.cursor.description]
rows = self.cursor.fetchall()
result = [",".join(map(str, row)) for row in rows]
return "\n".join([",".join(columns)] + result)
except Error as e:
return f"Error executing DESCRIBE TABLE {table_name}: {str(e)}"
def execute_query(self, query: str) -> str:
"""Execute SQL commands."""
try:
if not query.strip().upper().startswith("SELECT"):
return (f"Query should start with SELECT. " +
"Example: SELECT * FROM table ")
self.cursor.execute(query)
# Regular SELECT queries
columns = [desc[0] for desc in self.cursor.description]
rows = self.cursor.fetchall()
result = [",".join(map(str, row)) for row in rows]
return "\n".join([",".join(columns)] + result)
except Error as e:
error_msg = str(e)
if "Detect inefficient query" in error_msg:
return ("Your query was identified as inefficient. " +
"Please add /*+ _l_allow_filtering_ */ hint after the SELECT keyword.\n" +
"Example: SELECT /*+ _l_allow_filtering_ */ * FROM table\n" +
"Instead of: SELECT * FROM table")
elif "JOIN is not allowed" in error_msg or "UNION is not allowed" in error_msg:
return "JOIN UNION is not allowed. Please execute 'ALTER SYSTEM SET `lindorm.sql.join_union.disabled`=FALSE' to enable join."
return f"Error executing query: {str(e)}"
def reconnect(self):
"""Reconnect to the database."""
self._close()
self._connect()