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:
|
except Exception:
|
||||||
return False
|
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 ---------------------------------------------------------
|
# -- commands ---------------------------------------------------------
|
||||||
|
|
||||||
def execute(self, command: str) -> str:
|
def execute(self, command: str) -> str:
|
||||||
|
|||||||
@@ -173,6 +173,9 @@ class QueryTab(ctk.CTkFrame):
|
|||||||
return
|
return
|
||||||
|
|
||||||
client = SQLClient(server)
|
client = SQLClient(server)
|
||||||
|
if not client.connect():
|
||||||
|
self._schedule(self._set_status, t("query_error") + ": connection failed", error=True)
|
||||||
|
return
|
||||||
databases = client.list_databases()
|
databases = client.list_databases()
|
||||||
|
|
||||||
def _update():
|
def _update():
|
||||||
@@ -198,7 +201,7 @@ class QueryTab(ctk.CTkFrame):
|
|||||||
if not self._client:
|
if not self._client:
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
self._client.use_database(db_name)
|
self._client.switch_database(db_name)
|
||||||
self._set_status(f"Database: {db_name}")
|
self._set_status(f"Database: {db_name}")
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
self._set_status(str(exc), error=True)
|
self._set_status(str(exc), error=True)
|
||||||
@@ -206,7 +209,7 @@ class QueryTab(ctk.CTkFrame):
|
|||||||
def _disconnect(self):
|
def _disconnect(self):
|
||||||
if self._client:
|
if self._client:
|
||||||
try:
|
try:
|
||||||
self._client.close()
|
self._client.disconnect()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
self._client = None
|
self._client = None
|
||||||
@@ -236,7 +239,9 @@ class QueryTab(ctk.CTkFrame):
|
|||||||
"""Background thread: execute SQL, measure time, post results."""
|
"""Background thread: execute SQL, measure time, post results."""
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
try:
|
try:
|
||||||
columns, rows = self._client.execute(sql)
|
result = self._client.execute_query(sql)
|
||||||
|
columns = result["columns"]
|
||||||
|
rows = result["rows"]
|
||||||
elapsed = time.perf_counter() - start
|
elapsed = time.perf_counter() - start
|
||||||
|
|
||||||
def _update():
|
def _update():
|
||||||
|
|||||||
@@ -105,6 +105,11 @@ class RedisTab(ctk.CTkFrame):
|
|||||||
|
|
||||||
def set_server(self, alias: str | None):
|
def set_server(self, alias: str | None):
|
||||||
"""Called when user selects a server in sidebar."""
|
"""Called when user selects a server in sidebar."""
|
||||||
|
if self._client:
|
||||||
|
try:
|
||||||
|
self._client.disconnect()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
self._current_alias = alias
|
self._current_alias = alias
|
||||||
self._client = None
|
self._client = None
|
||||||
self._command_history.clear()
|
self._command_history.clear()
|
||||||
@@ -143,7 +148,8 @@ class RedisTab(ctk.CTkFrame):
|
|||||||
def _do():
|
def _do():
|
||||||
try:
|
try:
|
||||||
client = self._get_client()
|
client = self._get_client()
|
||||||
result = client.execute(cmd, db=db)
|
client.select_db(db)
|
||||||
|
result = client.execute(cmd)
|
||||||
formatted = self._format_result(result)
|
formatted = self._format_result(result)
|
||||||
self.after(0, lambda: self._append_output(formatted))
|
self.after(0, lambda: self._append_output(formatted))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -162,7 +168,13 @@ class RedisTab(ctk.CTkFrame):
|
|||||||
|
|
||||||
def _get_client(self) -> RedisClient:
|
def _get_client(self) -> RedisClient:
|
||||||
if self._client is None:
|
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
|
return self._client
|
||||||
|
|
||||||
# ── Stats refresh ──
|
# ── Stats refresh ──
|
||||||
@@ -175,8 +187,9 @@ class RedisTab(ctk.CTkFrame):
|
|||||||
try:
|
try:
|
||||||
client = self._get_client()
|
client = self._get_client()
|
||||||
db = int(self._db_var.get())
|
db = int(self._db_var.get())
|
||||||
keys_count = client.execute("DBSIZE", db=db)
|
client.select_db(db)
|
||||||
info = client.execute("INFO memory", db=db)
|
keys_count = client.execute("DBSIZE")
|
||||||
|
info = client.execute("INFO memory")
|
||||||
|
|
||||||
# Parse memory from INFO output
|
# Parse memory from INFO output
|
||||||
memory = "—"
|
memory = "—"
|
||||||
|
|||||||
Binary file not shown.
@@ -1,6 +1,6 @@
|
|||||||
"""Version info for ServerManager."""
|
"""Version info for ServerManager."""
|
||||||
|
|
||||||
__version__ = "1.8.52"
|
__version__ = "1.8.53"
|
||||||
__app_name__ = "ServerManager"
|
__app_name__ = "ServerManager"
|
||||||
__author__ = "aibot777"
|
__author__ = "aibot777"
|
||||||
__description__ = "Desktop GUI for managing remote servers"
|
__description__ = "Desktop GUI for managing remote servers"
|
||||||
|
|||||||
Reference in New Issue
Block a user