using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NewLife.Studio.Core.DTOs;
using NewLife.Studio.Data;
using NewLife.Studio.Store;
using NewLife.Log;
namespace NewLife.Studio.Modules.DataStudio.ViewModels;
/// <summary>查询 Tab</summary>
public partial class QueryTab : ObservableObject
{
[ObservableProperty]
private string _sql = "SELECT * FROM ";
[ObservableProperty]
private QueryResult? _result;
[ObservableProperty]
private string _title = "查询 1";
public ResultGridViewModel ResultGrid { get; } = new();
partial void OnResultChanged(QueryResult? value)
{
if (value != null)
{
ResultGrid.SetResult(value);
}
}
}
/// <summary>SQL 编辑器 ViewModel</summary>
public partial class SqlEditorViewModel : ObservableObject
{
private readonly IStoreService _storeService;
private IDbSession? _session;
[ObservableProperty]
private ObservableCollection<QueryTab> _tabs = [];
[ObservableProperty]
private QueryTab? _activeTab;
private int _tabCounter;
public SqlEditorViewModel(IStoreService storeService)
{
_storeService = storeService;
}
public void SetSession(IDbSession session)
{
_session = session;
}
[RelayCommand]
private void NewTab()
{
_tabCounter++;
var tab = new QueryTab
{
Title = $"查询 {_tabCounter}"
};
Tabs.Add(tab);
ActiveTab = tab;
}
[RelayCommand]
private void CloseTab(QueryTab? tab)
{
if (tab != null)
{
Tabs.Remove(tab);
}
}
[RelayCommand]
private async Task ExecuteAsync()
{
if (ActiveTab == null || _session == null)
return;
var request = new QueryRequest
{
Sql = ActiveTab.Sql,
MaxRows = 1000,
TimeoutSeconds = 30
};
var result = await _session.ExecuteQueryAsync(request);
ActiveTab.Result = result;
// 写入历史
_ = _storeService.AddQueryHistoryAsync(new QueryHistoryEntry
{
Sql = request.Sql,
ConnectionName = _session.Connection.Name,
ElapsedMs = result.ElapsedMs,
RowCount = result.RowCount
});
XTrace.WriteLine($"SqlEditor: Executed query, {result.RowCount} rows, {result.ElapsedMs}ms");
}
}
|