1+ using Dapper ;
2+ using MySql . Data . MySqlClient ;
3+ using Serilog . Ui . Core ;
4+ using System ;
5+ using System . Collections . Generic ;
6+ using System . Text ;
7+ using System . Threading . Tasks ;
8+
9+ namespace Serilog . Ui . MySqlProvider
10+ {
11+ public class MySqlDataProvider : IDataProvider
12+ {
13+ private readonly RelationalDbOptions _options ;
14+
15+ public MySqlDataProvider ( RelationalDbOptions options )
16+ {
17+ _options = options ?? throw new ArgumentNullException ( nameof ( options ) ) ;
18+ }
19+
20+ public async Task < ( IEnumerable < LogModel > , int ) > FetchDataAsync (
21+ int page ,
22+ int count ,
23+ string logLevel = null ,
24+ string searchCriteria = null ,
25+ DateTime ? startDate = null ,
26+ DateTime ? endDate = null
27+ )
28+ {
29+ var logsTask = GetLogsAsync ( page - 1 , count , logLevel , searchCriteria , startDate , endDate ) ;
30+ var logCountTask = CountLogsAsync ( logLevel , searchCriteria , startDate , endDate ) ;
31+
32+ await Task . WhenAll ( logsTask , logCountTask ) ;
33+
34+ return ( await logsTask , await logCountTask ) ;
35+ }
36+
37+ private async Task < IEnumerable < LogModel > > GetLogsAsync (
38+ int page ,
39+ int count ,
40+ string level ,
41+ string searchCriteria ,
42+ DateTime ? startDate ,
43+ DateTime ? endDate )
44+ {
45+ var queryBuilder = new StringBuilder ( ) ;
46+ queryBuilder . Append ( "SELECT Id, Message, LogLevel AS `Level`, TimeStamp, Exception, Properties From `" ) ;
47+ queryBuilder . Append ( _options . TableName ) ;
48+ queryBuilder . Append ( "` " ) ;
49+
50+ GenerateWhereClause ( queryBuilder , level , searchCriteria , startDate , endDate ) ;
51+
52+ queryBuilder . Append ( "ORDER BY Id DESC LIMIT @Offset, @Count" ) ;
53+
54+ using ( var connection = new MySqlConnection ( _options . ConnectionString ) )
55+ {
56+ var param = new
57+ {
58+ Offset = page * count ,
59+ Count = count ,
60+ Level = level ,
61+ Search = searchCriteria != null ? $ "%{ searchCriteria } %" : null ,
62+ StartDate = startDate ,
63+ EndDate = endDate
64+ } ;
65+ var logs = await connection . QueryAsync < MySqlLogModel > ( queryBuilder . ToString ( ) , param ) ;
66+ var index = 1 ;
67+ foreach ( var log in logs )
68+ log . RowNo = ( page * count ) + index ++ ;
69+
70+ return logs ;
71+ }
72+ }
73+
74+ private async Task < int > CountLogsAsync (
75+ string level ,
76+ string searchCriteria ,
77+ DateTime ? startDate = null ,
78+ DateTime ? endDate = null )
79+ {
80+ var queryBuilder = new StringBuilder ( ) ;
81+ queryBuilder . Append ( "SELECT COUNT(Id) FROM `" ) ;
82+ queryBuilder . Append ( _options . TableName ) ;
83+ queryBuilder . Append ( "` " ) ;
84+
85+ GenerateWhereClause ( queryBuilder , level , searchCriteria , startDate , endDate ) ;
86+
87+ using ( var connection = new MySqlConnection ( _options . ConnectionString ) )
88+ {
89+ return await connection . ExecuteScalarAsync < int > ( queryBuilder . ToString ( ) ,
90+ new
91+ {
92+ Level = level ,
93+ Search = searchCriteria != null ? "%" + searchCriteria + "%" : null ,
94+ StartDate = startDate ,
95+ EndDate = endDate
96+ } ) ;
97+ }
98+ }
99+
100+ private void GenerateWhereClause (
101+ StringBuilder queryBuilder ,
102+ string level ,
103+ string searchCriteria ,
104+ DateTime ? startDate = null ,
105+ DateTime ? endDate = null )
106+ {
107+ var whereIncluded = false ;
108+
109+ if ( ! string . IsNullOrEmpty ( level ) )
110+ {
111+ queryBuilder . Append ( "WHERE LogLevel = @Level " ) ;
112+ whereIncluded = true ;
113+ }
114+
115+ if ( ! string . IsNullOrEmpty ( searchCriteria ) )
116+ {
117+ queryBuilder . Append ( whereIncluded
118+ ? "AND (Message LIKE @Search OR Exception LIKE @Search) "
119+ : "WHERE (Message LIKE @Search OR Exception LIKE @Search) " ) ;
120+ whereIncluded = true ;
121+ }
122+
123+ if ( startDate != null )
124+ {
125+ queryBuilder . Append ( whereIncluded
126+ ? "AND TimeStamp >= @StartDate "
127+ : "WHERE TimeStamp >= @StartDate " ) ;
128+ whereIncluded = true ;
129+ }
130+
131+ if ( endDate != null )
132+ {
133+ queryBuilder . Append ( whereIncluded
134+ ? "AND TimeStamp <= @EndDate "
135+ : "WHERE TimeStamp <= @EndDate " ) ;
136+ }
137+ }
138+ }
139+ }
0 commit comments