46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using DataModel.Database.Common;
							 | 
						|||
| 
								 | 
							
								using Microsoft.Extensions.DependencyInjection;
							 | 
						|||
| 
								 | 
							
								using Timer = System.Timers.Timer;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace Processor;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								public static class ExportProcessor
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    private static readonly Timer EXPORT_TIMER = new();
							 | 
						|||
| 
								 | 
							
								    private static readonly object EXPORT_LOCK = new();
							 | 
						|||
| 
								 | 
							
								    private static readonly SemaphoreSlim EXPORT_SEMAPHORE = new(2);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    static ExportProcessor()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        EXPORT_TIMER.Interval = 6_000; // 6 seconds
							 | 
						|||
| 
								 | 
							
								        EXPORT_TIMER.AutoReset = false;
							 | 
						|||
| 
								 | 
							
								        EXPORT_TIMER.Elapsed += async (sender, args) => await ExportToJson();
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    private static async Task ExportToJson()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        if(!await EXPORT_SEMAPHORE.WaitAsync(1))
							 | 
						|||
| 
								 | 
							
								            return;
							 | 
						|||
| 
								 | 
							
								        
							 | 
						|||
| 
								 | 
							
								        Monitor.Enter(EXPORT_LOCK);
							 | 
						|||
| 
								 | 
							
								        try
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            await using var db = ProcessorMeta.ServiceProvider.GetRequiredService<DataContext>();
							 | 
						|||
| 
								 | 
							
								            await db.ExportAsync(Environment.ExpandEnvironmentVariables(Path.Join(await AppSettings.GetAutoExportDestinationPath(), await AppSettings.GetAutoExportFilename())));
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        finally
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Monitor.Exit(EXPORT_LOCK);
							 | 
						|||
| 
								 | 
							
								            EXPORT_SEMAPHORE.Release();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    
							 | 
						|||
| 
								 | 
							
								    public static async Task TriggerExport()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        if (!await AppSettings.GetAutoExportEnabled())
							 | 
						|||
| 
								 | 
							
								            return;
							 | 
						|||
| 
								 | 
							
								        
							 | 
						|||
| 
								 | 
							
								        EXPORT_TIMER.Stop();
							 | 
						|||
| 
								 | 
							
								        EXPORT_TIMER.Start();
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |