diff --git a/lib/features/connections/extension_connection_form.dart b/lib/features/connections/extension_connection_form.dart index f148044f..788cb125 100644 --- a/lib/features/connections/extension_connection_form.dart +++ b/lib/features/connections/extension_connection_form.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'package:flutter/widgets.dart'; import 'dart:convert'; import 'dart:io'; @@ -108,11 +110,11 @@ class _ExtensionConnectionFormContentState ? 'Connection form schema not found for this driver.' : null; }); - } catch (e) { + } catch (e, st) { if (!mounted) return; setState(() { _loading = false; - _loadError = 'Failed to load connection form: $e'; + _loadError = failureMessage('Failed to load connection form', e, where: 'ExtensionConnectionForm', stack: st, driver: DatabaseDriver.extension); }); } } @@ -183,12 +185,12 @@ class _ExtensionConnectionFormContentState ? 'Connection successful.' : 'Connection successful — server version $version.'; }); - } catch (e) { + } catch (e, st) { if (!mounted) return; setState(() { _testing = false; _testSucceeded = false; - _testMessage = 'Connection failed: $e'; + _testMessage = failureMessage('Connection failed', e, where: 'ExtensionConnectionForm', stack: st, driver: DatabaseDriver.extension); }); } } diff --git a/lib/features/connections/sqlite_connection_form.dart b/lib/features/connections/sqlite_connection_form.dart index cbc755fc..1f450415 100644 --- a/lib/features/connections/sqlite_connection_form.dart +++ b/lib/features/connections/sqlite_connection_form.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'package:flutter/widgets.dart'; import 'dart:async'; import 'package:file_selector/file_selector.dart'; @@ -165,9 +167,9 @@ class _SqliteConnectionFormContentState 'error:${result.error ?? 'Failed to open SQLite database.'}', ); } - } catch (e) { + } catch (e, st) { if (!mounted) return; - _showTestResult('error:$e'); + _showTestResult(failureMessage('error', e, where: 'SqliteConnectionForm', stack: st, driver: DatabaseDriver.sqlite)); } } @@ -177,9 +179,9 @@ class _SqliteConnectionFormContentState if (!_isEditing) { try { await SqliteConnection.createFileIfMissing(path); - } catch (e) { + } catch (e, st) { if (!mounted) return; - _showTestResult('error:$e'); + _showTestResult(failureMessage('error', e, where: 'SqliteConnectionForm', stack: st, driver: DatabaseDriver.sqlite)); return; } } diff --git a/lib/features/extensions/extension_sql_workspace.dart b/lib/features/extensions/extension_sql_workspace.dart index 127cbc05..96b2d453 100644 --- a/lib/features/extensions/extension_sql_workspace.dart +++ b/lib/features/extensions/extension_sql_workspace.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'dart:async'; import 'package:flutter/material.dart' as material; @@ -153,18 +155,25 @@ class _ExtensionSqlWorkspaceState extends material.State if (ws != null) { await ws.execute(ws.activeSession); } - } catch (e) { + } catch (e, st) { + final message = failureMessage( + 'Driver restart failed', + e, + where: 'ExtensionSqlWorkspace', + stack: st, + driver: DatabaseDriver.extension, + ); if (!mounted) return; setState(() { final ws = _workspaceKey.currentState; if (ws != null) { - ws.activeSession.error = 'Driver restart failed: $e'; + ws.activeSession.error = message; } _restartingDriver = false; }); showAppToast( context: context, - message: 'Driver restart failed: $e', + message: message, variant: AppToastVariant.error, ); } diff --git a/lib/features/extensions/extension_table_view.dart b/lib/features/extensions/extension_table_view.dart index 31d12067..9196519b 100644 --- a/lib/features/extensions/extension_table_view.dart +++ b/lib/features/extensions/extension_table_view.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'package:flutter/widgets.dart'; import 'dart:async' show unawaited; @@ -353,14 +355,14 @@ class _ExtensionTableViewState extends material.State { _restartingDriver = false; }); await state.refresh(); - } catch (e) { + } catch (e, st) { if (!mounted) return; setState(() { _restartingDriver = false; }); showAppToast( context: context, - message: 'Driver restart failed: $e', + message: failureMessage('Driver restart failed', e, where: 'ExtensionTableView', stack: st, driver: DatabaseDriver.extension), variant: AppToastVariant.error, ); } @@ -432,12 +434,12 @@ class _ExtensionTableViewState extends material.State { ), ), ); - } catch (e) { + } catch (e, st) { if (navigator.canPop()) navigator.pop(); if (!mounted) return; showAppToast( context: context, - message: 'Failed to fetch DDL: $e', + message: failureMessage('Failed to fetch DDL', e, where: 'ExtensionTableView', stack: st, driver: DatabaseDriver.extension), variant: AppToastVariant.error, ); } diff --git a/lib/features/extensions/presentation/pages/extension_manager_dialog.dart b/lib/features/extensions/presentation/pages/extension_manager_dialog.dart index 0a575a9b..c4a2eb6c 100644 --- a/lib/features/extensions/presentation/pages/extension_manager_dialog.dart +++ b/lib/features/extensions/presentation/pages/extension_manager_dialog.dart @@ -1,3 +1,4 @@ +import 'package:querya_desktop/shared/report_error.dart'; import 'package:flutter/widgets.dart'; import 'dart:async'; @@ -201,9 +202,9 @@ class _ExtensionManagerContentState }); } on MarketplaceException catch (e) { if (mounted) setState(() => _sideloadError = e.message); - } catch (e) { + } catch (e, st) { if (mounted) { - setState(() => _sideloadError = 'Failed to install extension: $e'); + setState(() => _sideloadError = failureMessage('Failed to install extension', e, where: 'ExtensionManagerDialog', stack: st)); } } finally { if (mounted) setState(() => _sideloading = false); diff --git a/lib/features/mysql/mysql_connection_form.dart b/lib/features/mysql/mysql_connection_form.dart index 6d82f1bf..05382157 100644 --- a/lib/features/mysql/mysql_connection_form.dart +++ b/lib/features/mysql/mysql_connection_form.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'package:flutter/widgets.dart'; import 'dart:async'; @@ -249,8 +251,8 @@ class _MysqlConnectionFormContentState if (mounted) { _showTestResult(result.ok ? 'success' : (result.error ?? 'failed')); } - } catch (e) { - if (mounted) _showTestResult('error: $e'); + } catch (e, st) { + if (mounted) _showTestResult(failureMessage('error', e, where: 'MysqlConnectionForm', stack: st, driver: DatabaseDriver.mysql)); } } diff --git a/lib/features/postgresql/postgres_table_view.dart b/lib/features/postgresql/postgres_table_view.dart index c69db4a6..851c9413 100644 --- a/lib/features/postgresql/postgres_table_view.dart +++ b/lib/features/postgresql/postgres_table_view.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'dart:async' show unawaited; import 'package:flutter/material.dart' as material; @@ -345,11 +347,11 @@ class _PostgresTableViewState extends material.State { try { await _delegate.refreshMaterializedView(); await state.refresh(); - } catch (e) { + } catch (e, st) { if (!context.mounted) return; showAppToast( context: context, - message: 'Refresh materialized view failed: $e', + message: failureMessage('Refresh materialized view failed', e, where: 'PostgresTableView', stack: st, driver: DatabaseDriver.postgres), variant: AppToastVariant.error, ); } diff --git a/lib/features/postgresql/postgresql_connection_form.dart b/lib/features/postgresql/postgresql_connection_form.dart index ecd0211c..e1a9fab4 100644 --- a/lib/features/postgresql/postgresql_connection_form.dart +++ b/lib/features/postgresql/postgresql_connection_form.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'package:flutter/widgets.dart'; import 'dart:async'; @@ -355,8 +357,8 @@ class _PostgresConnectionFormContentState result.ok ? 'success' : (result.error ?? 'failed'), ); } - } catch (e) { - if (mounted) _showTestResult('error: $e'); + } catch (e, st) { + if (mounted) _showTestResult(failureMessage('error', e, where: 'PostgresConnectionForm', stack: st, driver: DatabaseDriver.postgres)); } } diff --git a/lib/features/settings/preferences_extensions_section.dart b/lib/features/settings/preferences_extensions_section.dart index 843920dd..357a3a77 100644 --- a/lib/features/settings/preferences_extensions_section.dart +++ b/lib/features/settings/preferences_extensions_section.dart @@ -1,3 +1,4 @@ +import 'package:querya_desktop/shared/report_error.dart'; import 'package:flutter/widgets.dart'; import 'dart:async' show unawaited; @@ -70,9 +71,9 @@ class PreferencesExtensionsSectionState } on MarketplaceException catch (e) { if (!mounted) return; setState(() => _error = e.message); - } catch (e) { + } catch (e, st) { if (!mounted) return; - setState(() => _error = 'Failed to install extension: $e'); + setState(() => _error = failureMessage('Failed to install extension', e, where: 'PreferencesExtensionsSection', stack: st)); } finally { if (mounted) setState(() => _installing = false); } diff --git a/lib/features/settings/preferences_mcp_section.dart b/lib/features/settings/preferences_mcp_section.dart index af04ee22..05d5cdce 100644 --- a/lib/features/settings/preferences_mcp_section.dart +++ b/lib/features/settings/preferences_mcp_section.dart @@ -1,3 +1,4 @@ +import 'package:querya_desktop/shared/report_error.dart'; import 'package:flutter/widgets.dart'; import 'dart:async' show StreamSubscription, unawaited; @@ -121,12 +122,12 @@ class PreferencesMcpSectionState extends material.State { }); try { await _controller.setEnabled(v); - } catch (e) { + } catch (e, st) { if (mounted) { setState(() => _enabled = false); showAppToast( context: context, - message: 'MCP server did not start: $e', + message: failureMessage('MCP server did not start', e, where: 'PreferencesMcpSection', stack: st), variant: AppToastVariant.error, ); } diff --git a/lib/features/sqlite/sqlite_table_view.dart b/lib/features/sqlite/sqlite_table_view.dart index 36634587..ba2c660b 100644 --- a/lib/features/sqlite/sqlite_table_view.dart +++ b/lib/features/sqlite/sqlite_table_view.dart @@ -1,3 +1,5 @@ +import 'package:querya_desktop/shared/report_error.dart'; +import 'package:querya_desktop/core/database/database_error_mapper.dart'; import 'package:flutter/widgets.dart'; import 'dart:async' show unawaited; @@ -355,12 +357,12 @@ class _SqliteTableViewState extends material.State { ), ), ); - } catch (e) { + } catch (e, st) { if (navigator.canPop()) navigator.pop(); if (!mounted) return; showAppToast( context: context, - message: 'Failed to fetch DDL: $e', + message: failureMessage('Failed to fetch DDL', e, where: 'SqliteTableView', stack: st, driver: DatabaseDriver.sqlite), variant: AppToastVariant.error, ); } diff --git a/lib/features/workspace/generic_sql_workspace.dart b/lib/features/workspace/generic_sql_workspace.dart index bc863cd7..504b6128 100644 --- a/lib/features/workspace/generic_sql_workspace.dart +++ b/lib/features/workspace/generic_sql_workspace.dart @@ -1,3 +1,4 @@ +import 'package:querya_desktop/shared/report_error.dart'; import 'package:flutter/widgets.dart'; import 'package:querya_desktop/core/erd/erd_saved_layout.dart'; import 'package:querya_desktop/core/database/query_error_text.dart'; @@ -967,10 +968,10 @@ class GenericSqlWorkspaceState extends material.State { if (!session.running || !widget.delegate.supportsCancel) return; try { await widget.delegate.cancelQuery(); - } catch (e) { + } catch (e, st) { if (mounted) { invalidatePane(session); - setState(() => session.error = 'Cancel failed: $e'); + setState(() => session.error = failureMessage('Cancel failed', e, where: 'GenericSqlWorkspace', stack: st)); } } } @@ -1088,11 +1089,11 @@ class GenericSqlWorkspaceState extends material.State { } else { addNewTab(initialSql: text, title: file.name, filePath: file.path); } - } catch (e) { + } catch (e, st) { if (!mounted) return; showAppToast( context: context, - message: 'Failed to open SQL file: $e', + message: failureMessage('Failed to open SQL file', e, where: 'GenericSqlWorkspace', stack: st), variant: AppToastVariant.error, ); } @@ -1137,11 +1138,11 @@ class GenericSqlWorkspaceState extends material.State { message: 'Saved to ${session.title}', variant: AppToastVariant.success, ); - } catch (e) { + } catch (e, st) { if (!mounted) return; showAppToast( context: context, - message: 'Failed to save SQL file: $e', + message: failureMessage('Failed to save SQL file', e, where: 'GenericSqlWorkspace', stack: st), variant: AppToastVariant.error, ); }