Skip to content

Commit 97da026

Browse files
author
Mohsen Esmailpour
committed
Add query builder for MySql.
1 parent f362db4 commit 97da026

24 files changed

+543
-253
lines changed

src/Serilog.Ui.MsSqlServerProvider/Extensions/SqlServerDbOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ namespace Serilog.Ui.MsSqlServerProvider.Extensions;
66

77
public class SqlServerDbOptions(string defaultSchemaName) : RelationalDbOptions(defaultSchemaName)
88
{
9-
internal SinkColumnNames ColumnNames { get; } = new SqlServerSinkColumnNames();
9+
public SinkColumnNames ColumnNames { get; } = new SqlServerSinkColumnNames();
1010
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Serilog.Ui.MySqlProvider.Models;
2+
3+
namespace Serilog.Ui.MySqlProvider.Extensions;
4+
5+
public class MariaDbOptions : MySqlDbOptions
6+
{
7+
public MariaDbOptions(string defaultSchemaName) : base(defaultSchemaName)
8+
{
9+
ColumnNames = new MariaDbSinkColumnNames();
10+
}
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Serilog.Ui.Core.Models.Options;
2+
using Serilog.Ui.Core.QueryBuilder.Sql;
3+
using Serilog.Ui.MySqlProvider.Models;
4+
5+
namespace Serilog.Ui.MySqlProvider.Extensions;
6+
7+
public class MySqlDbOptions(string defaultSchemaName) : RelationalDbOptions(defaultSchemaName)
8+
{
9+
internal SinkColumnNames ColumnNames { get; set; } = new MySqlSinkColumnNames();
10+
}
Lines changed: 58 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,77 @@
1-
using System;
2-
using Microsoft.Extensions.DependencyInjection;
1+
using Microsoft.Extensions.DependencyInjection;
32
using Serilog.Ui.Core;
43
using Serilog.Ui.Core.Interfaces;
54
using Serilog.Ui.Core.Models.Options;
5+
using System;
66

7-
namespace Serilog.Ui.MySqlProvider.Extensions
7+
namespace Serilog.Ui.MySqlProvider.Extensions;
8+
9+
/// <summary>
10+
/// MySQL data provider specific extension methods for <see cref="ISerilogUiOptionsBuilder"/>.
11+
/// </summary>
12+
public static class SerilogUiOptionBuilderExtensions
813
{
914
/// <summary>
10-
/// MySQL data provider specific extension methods for <see cref="ISerilogUiOptionsBuilder"/>.
15+
/// Configures the SerilogUi to connect to a MySQL/MariaDb database expecting
16+
/// <seealso href="https://github.com/saleem-mirza/serilog-sinks-mysql">Serilog.Sinks.MySQL.</seealso> defaults.
17+
/// Provider expects sink to store timestamp in utc.
1118
/// </summary>
12-
public static class SerilogUiOptionBuilderExtensions
19+
/// <param name="optionsBuilder"> The options builder. </param>
20+
/// <param name="setupOptions">The MySql options action.</param>
21+
public static ISerilogUiOptionsBuilder UseMySqlServer(this ISerilogUiOptionsBuilder optionsBuilder, Action<RelationalDbOptions> setupOptions)
1322
{
14-
/// <summary>
15-
/// Configures the SerilogUi to connect to a MySQL/MariaDb database expecting
16-
/// <seealso href="https://github.com/saleem-mirza/serilog-sinks-mysql">Serilog.Sinks.MySQL.</seealso> defaults.
17-
/// Provider expects sink to store timestamp in utc.
18-
/// </summary>
19-
/// <param name="optionsBuilder"> The options builder. </param>
20-
/// <param name="setupOptions">The MySql options action.</param>
21-
public static ISerilogUiOptionsBuilder UseMySqlServer(
22-
this ISerilogUiOptionsBuilder optionsBuilder,
23-
Action<RelationalDbOptions> setupOptions
24-
)
25-
{
26-
var dbOptions = new RelationalDbOptions("dbo");
27-
setupOptions(dbOptions);
28-
dbOptions.Validate();
29-
30-
var providerName = dbOptions.GetProviderName(MySqlDataProvider.MySqlProviderName);
31-
32-
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
23+
MySqlDbOptions dbOptions = new("dbo");
24+
setupOptions(dbOptions);
25+
dbOptions.Validate();
3326

34-
optionsBuilder.Services.AddScoped<IDataProvider, MySqlDataProvider>(_ => new MySqlDataProvider(dbOptions));
27+
string providerName = dbOptions.GetProviderName(MySqlDataProvider.MySqlProviderName);
3528

36-
return optionsBuilder;
37-
}
29+
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
30+
optionsBuilder.Services.AddScoped<IDataProvider, MySqlDataProvider>(_ => new MySqlDataProvider(dbOptions, new MySqlQueryBuilder<MySqlLogModel>()));
3831

39-
/// <summary>
40-
/// Configures the SerilogUi to connect to a MySQL/MariaDb database expecting
41-
/// <seealso href="https://github.com/TeleSoftas/serilog-sinks-mariadb">Serilog.Sinks.MariaDB.</seealso> defaults.
42-
/// Provider expects sink to store timestamp in utc.
43-
/// </summary>
44-
/// <param name="optionsBuilder"> The options builder. </param>
45-
/// <param name="setupOptions">The MySql options action.</param>
46-
public static ISerilogUiOptionsBuilder UseMariaDbServer(
47-
this ISerilogUiOptionsBuilder optionsBuilder,
48-
Action<RelationalDbOptions> setupOptions
49-
) => optionsBuilder.UseMariaDbServer<MySqlLogModel>(setupOptions);
32+
return optionsBuilder;
33+
}
5034

51-
/// <summary>
52-
/// Configures the SerilogUi to connect to a MySQL/MariaDb database expecting
53-
/// <seealso href="https://github.com/TeleSoftas/serilog-sinks-mariadb">Serilog.Sinks.MariaDB.</seealso> defaults.
54-
/// Provider expects sink to store timestamp in utc.
55-
/// </summary>
56-
/// <typeparam name="T">The log model, containing any additional columns. It must inherit <see cref="MySqlLogModel"/>.</typeparam>
57-
/// <param name="optionsBuilder"> The options builder. </param>
58-
/// <param name="setupOptions">The MySql options action.</param>
59-
public static ISerilogUiOptionsBuilder UseMariaDbServer<T>(
60-
this ISerilogUiOptionsBuilder optionsBuilder,
61-
Action<RelationalDbOptions> setupOptions
62-
) where T : MySqlLogModel
63-
{
64-
var dbOptions = new RelationalDbOptions("dbo");
65-
setupOptions(dbOptions);
66-
dbOptions.Validate();
35+
/// <summary>
36+
/// Configures the SerilogUi to connect to a MySQL/MariaDb database expecting
37+
/// <seealso href="https://github.com/TeleSoftas/serilog-sinks-mariadb">Serilog.Sinks.MariaDB.</seealso> defaults.
38+
/// Provider expects sink to store timestamp in utc.
39+
/// </summary>
40+
/// <param name="optionsBuilder"> The options builder. </param>
41+
/// <param name="setupOptions">The MySql options action.</param>
42+
public static ISerilogUiOptionsBuilder UseMariaDbServer(this ISerilogUiOptionsBuilder optionsBuilder, Action<RelationalDbOptions> setupOptions)
43+
=> optionsBuilder.UseMariaDbServer<MySqlLogModel>(setupOptions);
6744

68-
var providerName = dbOptions.GetProviderName(MariaDbDataProvider.ProviderName);
45+
/// <summary>
46+
/// Configures the SerilogUi to connect to a MySQL/MariaDb database expecting
47+
/// <seealso href="https://github.com/TeleSoftas/serilog-sinks-mariadb">Serilog.Sinks.MariaDB.</seealso> defaults.
48+
/// Provider expects sink to store timestamp in utc.
49+
/// </summary>
50+
/// <typeparam name="T">The log model, containing any additional columns. It must inherit <see cref="MySqlLogModel"/>.</typeparam>
51+
/// <param name="optionsBuilder"> The options builder. </param>
52+
/// <param name="setupOptions">The MySql options action.</param>
53+
public static ISerilogUiOptionsBuilder UseMariaDbServer<T>(this ISerilogUiOptionsBuilder optionsBuilder, Action<RelationalDbOptions> setupOptions)
54+
where T : MySqlLogModel
55+
{
56+
MariaDbOptions dbOptions = new("dbo");
57+
setupOptions(dbOptions);
58+
dbOptions.Validate();
6959

70-
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
60+
string providerName = dbOptions.GetProviderName(MariaDbDataProvider.ProviderName);
7161

72-
var customModel = typeof(T) != typeof(MySqlLogModel);
73-
if (customModel)
74-
{
75-
optionsBuilder.RegisterColumnsInfo<T>(providerName);
76-
optionsBuilder.Services.AddScoped<IDataProvider>(_ => new MariaDbDataProvider<T>(dbOptions));
77-
return optionsBuilder;
78-
}
62+
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
7963

80-
optionsBuilder.Services.AddScoped<IDataProvider>(_ => new MariaDbDataProvider(dbOptions));
81-
return optionsBuilder;
64+
bool customModel = typeof(T) != typeof(MySqlLogModel);
65+
if (customModel)
66+
{
67+
optionsBuilder.RegisterColumnsInfo<T>(providerName);
68+
optionsBuilder.Services.AddScoped<IDataProvider>(_ => new MariaDbDataProvider<T>(dbOptions, new MySqlQueryBuilder<T>()));
69+
}
70+
else
71+
{
72+
optionsBuilder.Services.AddScoped<IDataProvider>(_ => new MariaDbDataProvider(dbOptions, new MySqlQueryBuilder<MySqlLogModel>()));
8273
}
74+
75+
return optionsBuilder;
8376
}
8477
}
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1-
using Serilog.Ui.Core.Models.Options;
1+
using Serilog.Ui.MySqlProvider.Extensions;
22
using Serilog.Ui.MySqlProvider.Shared;
33

44
namespace Serilog.Ui.MySqlProvider;
55

6-
public class MariaDbDataProvider(RelationalDbOptions options) : MariaDbDataProvider<MySqlLogModel>(options)
7-
{
8-
protected override string SelectQuery
9-
=> $"SELECT Id, {ColumnMessageName}, {ColumnLevelName} AS 'Level', {ColumnTimestampName}, Exception, Properties ";
10-
11-
protected override string SearchCriteriaWhereQuery() => "OR Exception LIKE @Search";
12-
}
6+
public class MariaDbDataProvider(MariaDbOptions options, MySqlQueryBuilder<MySqlLogModel> queryBuilder)
7+
: MariaDbDataProvider<MySqlLogModel>(options, queryBuilder);
138

14-
public class MariaDbDataProvider<T>(RelationalDbOptions options) : DataProvider<T>(options)
9+
public class MariaDbDataProvider<T>(MariaDbOptions options, MySqlQueryBuilder<T> queryBuilder) : DataProvider<T>(options, queryBuilder)
1510
where T : MySqlLogModel
1611

1712
{
1813
internal const string ProviderName = "MariaDb";
1914

20-
protected override string ColumnLevelName => "LogLevel";
21-
22-
public override string Name => Options.GetProviderName(ProviderName);
15+
public override string Name => options.GetProviderName(ProviderName);
2316
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Serilog.Ui.Core.QueryBuilder.Sql;
2+
3+
namespace Serilog.Ui.MySqlProvider.Models;
4+
5+
internal class MariaDbSinkColumnNames : SinkColumnNames
6+
{
7+
public MariaDbSinkColumnNames()
8+
{
9+
Exception = "Exception";
10+
Level = "LogLevel";
11+
LogEventSerialized = "Properties";
12+
Message = "Message";
13+
MessageTemplate = "";
14+
Timestamp = "TimeStamp";
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Serilog.Ui.Core.QueryBuilder.Sql;
2+
3+
namespace Serilog.Ui.MySqlProvider.Models;
4+
5+
internal class MySqlSinkColumnNames : SinkColumnNames
6+
{
7+
public MySqlSinkColumnNames()
8+
{
9+
Exception = "Exception";
10+
Level = "Level";
11+
LogEventSerialized = "Properties";
12+
Message = "Message";
13+
MessageTemplate = "";
14+
Timestamp = "TimeStamp";
15+
}
16+
}
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
using Serilog.Ui.Core.Models.Options;
1+
using Serilog.Ui.MySqlProvider.Extensions;
22
using Serilog.Ui.MySqlProvider.Shared;
33

44
namespace Serilog.Ui.MySqlProvider;
55

6-
public class MySqlDataProvider(RelationalDbOptions options) : DataProvider<MySqlLogModel>(options)
6+
public class MySqlDataProvider(MySqlDbOptions options, MySqlQueryBuilder<MySqlLogModel> queryBuilder)
7+
: DataProvider<MySqlLogModel>(options, queryBuilder)
78
{
8-
protected override string SelectQuery
9-
=> $"SELECT Id, {ColumnMessageName}, {ColumnLevelName}, {ColumnTimestampName}, Exception, Properties ";
10-
11-
protected override string SearchCriteriaWhereQuery() => "OR Exception LIKE @Search";
9+
private readonly MySqlDbOptions _options = options;
1210

1311
internal const string MySqlProviderName = "MySQL";
14-
public override string Name => Options.GetProviderName(MySqlProviderName);
12+
13+
public override string Name => _options.GetProviderName(MySqlProviderName);
1514
}

src/Serilog.Ui.MySqlProvider/MySqlLogModel.cs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,26 @@
22
using Serilog.Ui.Core.Attributes;
33
using Serilog.Ui.Core.Models;
44

5-
namespace Serilog.Ui.MySqlProvider
5+
namespace Serilog.Ui.MySqlProvider;
6+
7+
/// <summary>
8+
/// MySql/MariaDb Log Model. <br />
9+
/// <see cref="RowNo"/>, <see cref="Level"/>, <see cref="Message"/>, <see cref="Timestamp"/>
10+
/// columns can't be overridden and removed from the model, due to query requirements. <br />
11+
/// To remove a field, apply <see cref="RemovedColumnAttribute"/> on it.
12+
/// To add a field, register the property with the correct datatype on the child class and the sink.
13+
/// </summary>
14+
public class MySqlLogModel : LogModel
615
{
7-
/// <summary>
8-
/// MySql/MariaDb Log Model. <br />
9-
/// <see cref="RowNo"/>, <see cref="Level"/>, <see cref="Message"/>, <see cref="Timestamp"/>
10-
/// columns can't be overridden and removed from the model, due to query requirements. <br />
11-
/// To remove a field, apply <see cref="RemovedColumnAttribute"/> on it.
12-
/// To add a field, register the property with the correct datatype on the child class and the sink.
13-
/// </summary>
14-
public class MySqlLogModel : LogModel
15-
{
16-
public sealed override int RowNo => base.RowNo;
16+
public override sealed int RowNo => base.RowNo;
1717

18-
public sealed override string? Level { get; set; }
18+
public override sealed string? Level { get; set; }
1919

20-
public string LogLevel { get; set; } = string.Empty;
20+
public string LogLevel { get; set; } = string.Empty;
2121

22-
public sealed override string? Message { get; set; } = string.Empty;
22+
public override sealed string? Message { get; set; } = string.Empty;
2323

24-
public sealed override DateTime Timestamp { get; set; }
24+
public override sealed DateTime Timestamp { get; set; }
2525

26-
public override string PropertyType => "json";
27-
}
26+
public override string PropertyType => "json";
2827
}

0 commit comments

Comments
 (0)