From 46c5a524270cb98774a575a6c19b8e9f6fe98127 Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Mon, 27 Jul 2026 19:43:50 +0300 Subject: [PATCH] =?UTF-8?q?perf(mysql):=20yield=20during=20table=20browse?= =?UTF-8?q?=20row=E2=86=92string=20conversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-land #422 onto dev — prior PR merged into issue/421 base and never reached the default branch. Closes #422 --- lib/features/mysql/mysql_table_view.dart | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/features/mysql/mysql_table_view.dart b/lib/features/mysql/mysql_table_view.dart index a234d3f3..d365c2fc 100644 --- a/lib/features/mysql/mysql_table_view.dart +++ b/lib/features/mysql/mysql_table_view.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart' as material; import 'package:mysql_client/mysql_client.dart'; import 'package:querya_desktop/core/database/mysql_connection.dart'; import 'package:querya_desktop/core/database/mysql_service.dart'; +import 'package:querya_desktop/core/database/result_row_string_convert.dart'; import 'package:querya_desktop/core/storage/local_db.dart'; import 'package:querya_desktop/features/mysql/mysql_sql_editor_dialog.dart'; import 'package:querya_desktop/features/mysql/mysql_table_utils.dart'; @@ -144,15 +145,20 @@ class _MysqlTableViewState extends material.State { return rs.cols.map((c) => c.name.isNotEmpty ? c.name : 'col').toList(); } - List> _resultRows(IResultSet rs) { + Future>> _resultRowsAsync(IResultSet rs) async { final out = >[]; + var n = 0; for (final row in rs.rows) { out.add( List.generate( row.numOfColumns, - (i) => row.colAt(i) ?? 'NULL', + (i) => resultCellToDisplayString(row.colAt(i)), ), ); + n++; + if (n % kResultStringConvertYieldEvery == 0) { + await Future.delayed(Duration.zero); + } } return out; } @@ -186,7 +192,7 @@ class _MysqlTableViewState extends material.State { if (!mounted) return; final colNames = _resultColumns(result); - final stringRows = _resultRows(result); + final stringRows = await _resultRowsAsync(result); setState(() { _columnNames = colNames; @@ -223,9 +229,10 @@ class _MysqlTableViewState extends material.State { try { final result = await conn.execute(sql); if (!mounted) return; + final stringRows = await _resultRowsAsync(result); setState(() { _columnNames = _resultColumns(result); - _rows = _resultRows(result); + _rows = stringRows; _rowsOnPage = _rows.length; _totalRowCount = null; _loading = false;