From 8c0788335ebc39b6a4dcd2877b9558fe2922c65c Mon Sep 17 00:00:00 2001 From: Luigi Carvalho Date: Tue, 13 Feb 2024 15:54:41 +0000 Subject: [PATCH] Added database synchronization --- Server/Controllers/Admin/AdminController.cs | 72 +++++++++++++++++-- Server/Databases/SQLite/lcpcollection.db-shm | Bin 0 -> 32768 bytes Server/Databases/SQLite/lcpcollection.db-wal | Bin 0 -> 177192 bytes Server/LCPCollection.Server.csproj | 7 ++ Server/appsettings.Development.json | 5 +- Shared/Classes/QryRunner.cs | 5 ++ 6 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 Server/Databases/SQLite/lcpcollection.db-shm create mode 100644 Server/Databases/SQLite/lcpcollection.db-wal diff --git a/Server/Controllers/Admin/AdminController.cs b/Server/Controllers/Admin/AdminController.cs index 853e0e7..574e1ad 100644 --- a/Server/Controllers/Admin/AdminController.cs +++ b/Server/Controllers/Admin/AdminController.cs @@ -1,15 +1,16 @@ -using Microsoft.AspNetCore.Mvc; +using Dotmim.Sync.Sqlite; +using Dotmim.Sync.SqlServer; +using Dotmim.Sync.PostgreSql; +using Dotmim.Sync; +using Dotmim.Sync.MySql; using LCPCollection.Shared.Classes; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; -using Microsoft.AspNetCore.Authorization; using Microsoft.Data.SqlClient; -using NuGet.Protocol; using Microsoft.Data.Sqlite; using MySqlConnector; +using NuGet.Protocol; using Npgsql; -using System.Collections; -using Newtonsoft.Json; -using Microsoft.SqlServer.Server; using System.Diagnostics; namespace LCPCollection.Server.Controllers @@ -59,6 +60,65 @@ public IActionResult DoQryRun([FromBody] QryRunner qryrun) } } + /// + /// This endpoint synchronizes the specific database to the another database + /// + [HttpPost("dbsync")] + public async Task DoDBSync(DBSyncRunner dbsrunner) + { + Stopwatch stopWatch = new Stopwatch(); + + try + { + stopWatch.Start(); + + StringComparison cmp = StringComparison.InvariantCultureIgnoreCase; + SqlSyncProvider serverProvider = new SqlSyncProvider(_configuration[$"ConnectionStrings:SQLServer"]); + dynamic clientProvider; + + if (dbsrunner.DBMode.Contains("SQLite", cmp)) + { + clientProvider = new SqliteSyncProvider(_configuration[$"ConnectionStrings:SQLite"]); + } + else if (dbsrunner.DBMode.Contains("MySQL", cmp)) + { + clientProvider = new MySqlSyncProvider(_configuration[$"ConnectionStrings:MySQL"]); + } + else if (dbsrunner.DBMode.Contains("PostgreSQL", cmp)) + { + clientProvider = new NpgsqlSyncProvider(_configuration[$"ConnectionStrings:PostgreSQL"]); + } + else + { + clientProvider = new SqlSyncProvider(_configuration[$"ConnectionStrings:SQLServer"]); + } + + var setup = new SyncSetup("Games", "Movies", "Books", "TVSeries", "Animes", "FilesData", "Softwares", "Websites"); + + SyncAgent agent = new SyncAgent(clientProvider, serverProvider); + + var result = await agent.SynchronizeAsync(setup); + stopWatch.Stop(); + + return Ok(new + { + Data = result, + DatabaseMode = dbsrunner.DBMode, + DateTimeExecuted = DateTime.UtcNow, + DateMeasureMsg = string.Format("Elapsed time {0} ms", stopWatch.ElapsedMilliseconds) + }); + } + catch(Exception e) + { + return Ok(new { + Data = e.Message, + DatabaseMode = dbsrunner.DBMode, + DateTimeExecuted = DateTime.UtcNow, + DateMeasureMsg = string.Format("Elapsed time {0} ms", stopWatch.ElapsedMilliseconds) + }); + } + } + private IActionResult FetchDataSQLServer(QryRunner qryrun, StringComparison cmp) { Stopwatch stopWatch = Stopwatch.StartNew(); var res = new Dictionary(); diff --git a/Server/Databases/SQLite/lcpcollection.db-shm b/Server/Databases/SQLite/lcpcollection.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..74c5c090481465d30f17281b19a3b06f223b29ae GIT binary patch literal 32768 zcmeI*IZgvX5QX73w%PI6tYbEteNPCv5g}(FFewQV_aG+b0$hNc6yXS7SsG~~RF;se zp8lWogt1Grd+t#g=JV~k_xNykd-;7o=zQg4&KK9V z>;9Bd{@y<8-eE~?shQeVJL+=jZ!uH+zM|h&)irfp-B5G2t8S`W>bAP0?y5btukNY) z>VbNw9;wIbiE8iOP@C$kYR^#Ir?`&3A_yRW00IagfB*srAbYgEHq7tyPtcXXT5f(jT%tR#6kLXz^`>4&)sd|%r z2JZg90(O2O@d!-o3`aZFkyJ;(PVOWgftfJp8Dl0Q0Xwsncm!IbvwS_1%pg!Tfh?R= R?Ui^R1e^kPdOYz6`~r_JFRlOp literal 0 HcmV?d00001 diff --git a/Server/Databases/SQLite/lcpcollection.db-wal b/Server/Databases/SQLite/lcpcollection.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..c36228fc9aad0f9581f9fa1819804e80d1c837d4 GIT binary patch literal 177192 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 afCP{L5 + + + + + + + diff --git a/Server/appsettings.Development.json b/Server/appsettings.Development.json index fdff244..3189ed9 100644 --- a/Server/appsettings.Development.json +++ b/Server/appsettings.Development.json @@ -6,7 +6,10 @@ } }, "Serilog": { - "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], + "Using": [ + "Serilog.Sinks.Console", + "Serilog.Sinks.File" + ], "MinimumLevel": { "Default": "Information" }, diff --git a/Shared/Classes/QryRunner.cs b/Shared/Classes/QryRunner.cs index a0bc055..caf3440 100644 --- a/Shared/Classes/QryRunner.cs +++ b/Shared/Classes/QryRunner.cs @@ -6,6 +6,11 @@ public class QryRunner { [Required] public string QryStr { get; set; } = null!; } +public class DBSyncRunner +{ + [Required] public string DBMode { get; set; } = QryDBModeEnum.SQLServer.ToString(); +} + public enum QryDBModeEnum { SQLServer,