v1.8.53: fix Redis and MariaDB GUI tabs — wrong client API calls
- redis_tab: fix RedisClient constructor (pass server dict, not alias+store) - redis_tab: add connect() call, add disconnect on server switch - redis_tab: remove non-existent db= parameter from execute(), use select_db() - redis_client: add select_db() method for runtime DB switching - query_tab: fix use_database() → switch_database(), close() → disconnect() - query_tab: fix execute() → execute_query() with dict unpacking - query_tab: add missing connect() call after SQLClient creation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -62,6 +62,13 @@ class RedisClient:
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def select_db(self, db: int):
|
||||
"""Switch to a different Redis database index."""
|
||||
db = int(db)
|
||||
if self._conn is not None and db != self._db:
|
||||
self._conn.execute_command("SELECT", db)
|
||||
self._db = db
|
||||
|
||||
# -- commands ---------------------------------------------------------
|
||||
|
||||
def execute(self, command: str) -> str:
|
||||
|
||||
@@ -173,6 +173,9 @@ class QueryTab(ctk.CTkFrame):
|
||||
return
|
||||
|
||||
client = SQLClient(server)
|
||||
if not client.connect():
|
||||
self._schedule(self._set_status, t("query_error") + ": connection failed", error=True)
|
||||
return
|
||||
databases = client.list_databases()
|
||||
|
||||
def _update():
|
||||
@@ -198,7 +201,7 @@ class QueryTab(ctk.CTkFrame):
|
||||
if not self._client:
|
||||
return
|
||||
try:
|
||||
self._client.use_database(db_name)
|
||||
self._client.switch_database(db_name)
|
||||
self._set_status(f"Database: {db_name}")
|
||||
except Exception as exc:
|
||||
self._set_status(str(exc), error=True)
|
||||
@@ -206,7 +209,7 @@ class QueryTab(ctk.CTkFrame):
|
||||
def _disconnect(self):
|
||||
if self._client:
|
||||
try:
|
||||
self._client.close()
|
||||
self._client.disconnect()
|
||||
except Exception:
|
||||
pass
|
||||
self._client = None
|
||||
@@ -236,7 +239,9 @@ class QueryTab(ctk.CTkFrame):
|
||||
"""Background thread: execute SQL, measure time, post results."""
|
||||
start = time.perf_counter()
|
||||
try:
|
||||
columns, rows = self._client.execute(sql)
|
||||
result = self._client.execute_query(sql)
|
||||
columns = result["columns"]
|
||||
rows = result["rows"]
|
||||
elapsed = time.perf_counter() - start
|
||||
|
||||
def _update():
|
||||
|
||||
@@ -105,6 +105,11 @@ class RedisTab(ctk.CTkFrame):
|
||||
|
||||
def set_server(self, alias: str | None):
|
||||
"""Called when user selects a server in sidebar."""
|
||||
if self._client:
|
||||
try:
|
||||
self._client.disconnect()
|
||||
except Exception:
|
||||
pass
|
||||
self._current_alias = alias
|
||||
self._client = None
|
||||
self._command_history.clear()
|
||||
@@ -143,7 +148,8 @@ class RedisTab(ctk.CTkFrame):
|
||||
def _do():
|
||||
try:
|
||||
client = self._get_client()
|
||||
result = client.execute(cmd, db=db)
|
||||
client.select_db(db)
|
||||
result = client.execute(cmd)
|
||||
formatted = self._format_result(result)
|
||||
self.after(0, lambda: self._append_output(formatted))
|
||||
except Exception as e:
|
||||
@@ -162,7 +168,13 @@ class RedisTab(ctk.CTkFrame):
|
||||
|
||||
def _get_client(self) -> RedisClient:
|
||||
if self._client is None:
|
||||
self._client = RedisClient(self._current_alias, self.store)
|
||||
server = self.store.get_server(self._current_alias)
|
||||
if not server:
|
||||
raise ConnectionError(f"Server '{self._current_alias}' not found")
|
||||
self._client = RedisClient(server)
|
||||
if not self._client.connect():
|
||||
self._client = None
|
||||
raise ConnectionError(f"Cannot connect to Redis '{self._current_alias}'")
|
||||
return self._client
|
||||
|
||||
# ── Stats refresh ──
|
||||
@@ -175,8 +187,9 @@ class RedisTab(ctk.CTkFrame):
|
||||
try:
|
||||
client = self._get_client()
|
||||
db = int(self._db_var.get())
|
||||
keys_count = client.execute("DBSIZE", db=db)
|
||||
info = client.execute("INFO memory", db=db)
|
||||
client.select_db(db)
|
||||
keys_count = client.execute("DBSIZE")
|
||||
info = client.execute("INFO memory")
|
||||
|
||||
# Parse memory from INFO output
|
||||
memory = "—"
|
||||
|
||||
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
"""Version info for ServerManager."""
|
||||
|
||||
__version__ = "1.8.52"
|
||||
__version__ = "1.8.53"
|
||||
__app_name__ = "ServerManager"
|
||||
__author__ = "aibot777"
|
||||
__description__ = "Desktop GUI for managing remote servers"
|
||||
|
||||
Reference in New Issue
Block a user