From 88e113d66d8fce71ccf4174fa621ef134fafb142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Tue, 31 Jan 2023 10:50:41 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=9E=D1=82=D1=81=D0=BB=D0=B5=D0=B6=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=B3=D0=B0=20=D0=BF=D0=BE=20=D1=82=D0=B0=D0=B9?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D1=83,=20=D0=B0=20=D0=BD=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F=D0=BC=20?= =?UTF-8?q?=D0=A4=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=BE=D0=B9=20=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OneSTools.EventLog/EventLogReader.cs | 33 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/OneSTools.EventLog/EventLogReader.cs b/OneSTools.EventLog/EventLogReader.cs index 2799b43..eb42a0b 100644 --- a/OneSTools.EventLog/EventLogReader.cs +++ b/OneSTools.EventLog/EventLogReader.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Threading; +using System.Timers; namespace OneSTools.EventLog { @@ -14,8 +15,8 @@ public class EventLogReader : IDisposable private readonly EventLogReaderSettings _settings; private bool _disposedValue; private LgfReader _lgfReader; - private ManualResetEvent _lgpChangedCreated; - private FileSystemWatcher _lgpFilesWatcher; + private ManualResetEvent _lgpChangedCreated; + private System.Timers.Timer _Timer; private LgpReader _lgpReader; public EventLogReader(EventLogReaderSettings settings) @@ -57,8 +58,8 @@ public EventLogItem ReadNextEventLogItem(CancellationToken cancellationToken = d if (_lgpReader == null) SetNextLgpReader(); - if (_settings.LiveMode && _lgpFilesWatcher == null) - StartLgpFilesWatcher(); + if (_settings.LiveMode && _Timer == null) + StartTimer(); EventLogItem item = null; @@ -151,31 +152,29 @@ private bool SetNextLgpReader() return true; } - private void StartLgpFilesWatcher() + private void StartTimer() { _lgpChangedCreated = new ManualResetEvent(false); - _lgpFilesWatcher = new FileSystemWatcher(_settings.LogFolder, "*.lgp") - { - NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.Size - }; - _lgpFilesWatcher.Changed += LgpFilesWatcher_Event; - _lgpFilesWatcher.Created += LgpFilesWatcher_Event; - _lgpFilesWatcher.EnableRaisingEvents = true; + _Timer = new System.Timers.Timer(_settings.ReadingTimeout); + _Timer.Elapsed += OnTimedEvent; + _Timer.AutoReset = true; + _Timer.Enabled = true; } - private void LgpFilesWatcher_Event(object sender, FileSystemEventArgs e) + private void OnTimedEvent(Object source, ElapsedEventArgs e) { - if (e.ChangeType == WatcherChangeTypes.Created || e.ChangeType == WatcherChangeTypes.Changed) - _lgpChangedCreated.Set(); + //Console.WriteLine("Срабатывание таймера: {0:HH:mm:ss.fff}", e.SignalTime); + _lgpChangedCreated.Set(); } protected virtual void Dispose(bool disposing) { if (!_disposedValue) { - _lgpFilesWatcher?.Dispose(); - _lgpFilesWatcher = null; + _Timer?.Stop(); + _Timer?.Dispose(); + _Timer = null; _lgpChangedCreated?.Dispose(); _lgpChangedCreated = null; _lgfReader?.Dispose(); From bfd02d066498f92ccbf17e13fffd35f70e5f48d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Tue, 31 Jan 2023 11:20:54 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B0=D0=BC=20=D0=B8=D0=BC=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OneSTools.EventLog/EventLogReader.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/OneSTools.EventLog/EventLogReader.cs b/OneSTools.EventLog/EventLogReader.cs index eb42a0b..482df18 100644 --- a/OneSTools.EventLog/EventLogReader.cs +++ b/OneSTools.EventLog/EventLogReader.cs @@ -3,7 +3,7 @@ using System.IO; using System.Linq; using System.Threading; -using System.Timers; +using Timers = System.Timers; namespace OneSTools.EventLog { @@ -16,7 +16,7 @@ public class EventLogReader : IDisposable private bool _disposedValue; private LgfReader _lgfReader; private ManualResetEvent _lgpChangedCreated; - private System.Timers.Timer _Timer; + private Timers.Timer _Timer; private LgpReader _lgpReader; public EventLogReader(EventLogReaderSettings settings) @@ -156,15 +156,14 @@ private void StartTimer() { _lgpChangedCreated = new ManualResetEvent(false); - _Timer = new System.Timers.Timer(_settings.ReadingTimeout); + _Timer = new Timers.Timer(_settings.ReadingTimeout); _Timer.Elapsed += OnTimedEvent; _Timer.AutoReset = true; _Timer.Enabled = true; } - private void OnTimedEvent(Object source, ElapsedEventArgs e) + private void OnTimedEvent(Object source, Timers.ElapsedEventArgs e) { - //Console.WriteLine("Срабатывание таймера: {0:HH:mm:ss.fff}", e.SignalTime); _lgpChangedCreated.Set(); } From 7543bb2e2c1b67e6e0e29ee482008ce811cd8eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Tue, 31 Jan 2023 15:55:22 +0300 Subject: [PATCH 3/8] =?UTF-8?q?#55=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B1=D0=B0=D0=B7=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=BD=D0=BE=D0=BF=D0=BE=D0=BB=D1=8C=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs index 8bd6deb..703bab8 100644 --- a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs +++ b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs @@ -46,8 +46,10 @@ public void Dispose() private Dictionary ReadInfoBases() { var items = new Dictionary(); - - var fileData = File.ReadAllText(_path); + + using var fs = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + using var stream = new StreamReader(fs); + var fileData = stream.ReadToEnd(); var parsedData = BracketsParser.ParseBlock(fileData); var infoBasesNode = parsedData[2]; From 77a5607def5b6629505d1d4c6979e593d75072cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Tue, 31 Jan 2023 18:01:11 +0300 Subject: [PATCH 4/8] =?UTF-8?q?#55=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=20=D0=B2=20=D1=86=D0=B8=D0=BA=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClstWatcher.cs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs index 703bab8..ee07766 100644 --- a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs +++ b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text.RegularExpressions; using OneSTools.BracketsFile; +using System.Threading; namespace OneSTools.EventLog.Exporter.Manager { @@ -46,10 +47,28 @@ public void Dispose() private Dictionary ReadInfoBases() { var items = new Dictionary(); + + String fileData = null; + int tryCount = 10; + const int sleepTimeout = 1000; + while (fileData == null && tryCount > 0) + { + try + { + using StreamReader stream = new StreamReader(new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); + { + fileData = stream.ReadToEnd(); + } + } + catch (Exception e) + { + tryCount--; + if (tryCount == 0) + throw new Exception("Ошибка чтения файла списка баз", e); + Thread.Sleep(sleepTimeout); + } + } - using var fs = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - using var stream = new StreamReader(fs); - var fileData = stream.ReadToEnd(); var parsedData = BracketsParser.ParseBlock(fileData); var infoBasesNode = parsedData[2]; From 6b2d67af9b71e0f75a847bd3abe43c0c94c40df2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Wed, 1 Feb 2023 11:10:56 +0300 Subject: [PATCH 5/8] =?UTF-8?q?#56=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8,=20=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BF=D0=BE=20=D0=B4=D0=B0=D1=82=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OneSTools.EventLog/EventLogReader.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/OneSTools.EventLog/EventLogReader.cs b/OneSTools.EventLog/EventLogReader.cs index 482df18..be27eec 100644 --- a/OneSTools.EventLog/EventLogReader.cs +++ b/OneSTools.EventLog/EventLogReader.cs @@ -115,12 +115,12 @@ public EventLogItem ReadNextEventLogItem(CancellationToken cancellationToken = d private bool SetNextLgpReader() { - var currentReaderLastWriteDateTime = DateTime.MinValue; + string currentFileName = "19000101000000"; if (_lgpReader != null) - currentReaderLastWriteDateTime = new FileInfo(_lgpReader.LgpPath).LastWriteTime; + currentFileName = new FileInfo(_lgpReader.LgpPath).Name; - var filesDateTime = new List<(string, DateTime)>(); + var filesDateTime = new List<(string, string)>(); var files = Directory.GetFiles(_settings.LogFolder, "*.lgp"); @@ -128,16 +128,15 @@ private bool SetNextLgpReader() if (_lgpReader != null) { if (_lgpReader.LgpPath != file) - filesDateTime.Add((file, new FileInfo(file).LastWriteTime)); + filesDateTime.Add((file, new FileInfo(file).Name)); } else { - filesDateTime.Add((file, new FileInfo(file).LastWriteTime)); + filesDateTime.Add((file, new FileInfo(file).Name)); } - - var orderedFiles = filesDateTime.OrderBy(c => c.Item2).ToList(); - - var (item1, _) = orderedFiles.FirstOrDefault(c => c.Item2 > currentReaderLastWriteDateTime); + + filesDateTime.Sort((x, y) => string.Compare(y.Item2, x.Item2)); + var (item1, _) = filesDateTime.FirstOrDefault(c => string.Compare(c.Item2, currentFileName) > 0); if (string.IsNullOrEmpty(item1)) { From a972a54dfa93a80c417b8eceb4a3da22f878ab7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Thu, 2 Feb 2023 21:38:46 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=20sleep=20=D0=BD=D0=B0=20=D0=B0=D1=81=D0=B8=D0=BD?= =?UTF-8?q?=D1=85=D1=80=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs index ee07766..6254ed6 100644 --- a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs +++ b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text.RegularExpressions; using OneSTools.BracketsFile; -using System.Threading; +using System.Threading.Tasks; namespace OneSTools.EventLog.Exporter.Manager { @@ -44,14 +44,13 @@ public void Dispose() public event InfoBaseAddedHandler InfoBasesAdded; public event InfoBaseDeletedHandler InfoBasesDeleted; - private Dictionary ReadInfoBases() + private async Task> ReadInfoBases() { var items = new Dictionary(); String fileData = null; - int tryCount = 10; - const int sleepTimeout = 1000; - while (fileData == null && tryCount > 0) + int tryCount = 10; + while (fileData == null) { try { @@ -65,7 +64,7 @@ public void Dispose() tryCount--; if (tryCount == 0) throw new Exception("Ошибка чтения файла списка баз", e); - Thread.Sleep(sleepTimeout); + await Task.Delay(1000); } } From c6076abd327eefbf283b501fd0346e043168a42d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Thu, 2 Feb 2023 22:17:40 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B5=20=D0=B0=D1=81=D0=B8=D0=BD?= =?UTF-8?q?=D1=85=D1=80=D0=BE=D0=BD=D0=BD=D0=BE=D0=B5=20=D1=87=D1=82=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B1=D0=B0=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs index 6254ed6..1d0e9b5 100644 --- a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs +++ b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs @@ -28,8 +28,7 @@ public ClstWatcher(string folder, List templates) _path = Path.Combine(_folder, "1CV8Clst.lst"); if (!File.Exists(_path)) throw new Exception("Couldn't find LST \"1CV8Clst.lst\" file"); - - _infoBases = ReadInfoBases(); + InitializeWatcher(); } @@ -94,9 +93,9 @@ public void Dispose() return items; } - private void ReadInfoBasesAndRaiseEvents() + private async void ReadInfoBasesAndRaiseEvents() { - var newInfoBases = ReadInfoBases(); + var newInfoBases = await ReadInfoBases(); var added = newInfoBases.Except(_infoBases); foreach (var (key, (item1, item2)) in added) @@ -109,8 +108,9 @@ private void ReadInfoBasesAndRaiseEvents() _infoBases = newInfoBases; } - private void InitializeWatcher() + private async void InitializeWatcher() { + _infoBases = await ReadInfoBases(); _clstWatcher = new FileSystemWatcher(_folder, "1CV8Clst.lst") { NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite From e0d09b82526bc19840fad85f836a830b361be60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=D0=BD=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2?= Date: Thu, 2 Feb 2023 22:19:21 +0300 Subject: [PATCH 8/8] =?UTF-8?q?#57=20=D0=A1=D1=82=D0=BE=D0=B9=D0=BA=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=AD=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=B0,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B5=D0=BD=20=D0=9A=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D1=85=D0=B0=D1=83=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseStorage.cs | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs b/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs index 9116d87..98b8068 100644 --- a/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs +++ b/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs @@ -92,16 +92,18 @@ public async Task WriteEventLogDataAsync(List entities, item.Session }).AsEnumerable(); - try - { - await copy.WriteToServerAsync(data, cancellationToken); - } - catch (Exception ex) - { - _logger?.LogError(ex, $"Failed to write data to {_databaseName}"); - throw; + while(true){ + try + { + await copy.WriteToServerAsync(data, cancellationToken); + break; + } + catch (Exception ex) + { + _logger?.LogWarning(ex, $"Failed to write data to {_databaseName}." + System.Environment.NewLine + ex.Message); + await Task.Delay(1000); + } } - _logger?.LogDebug($"{entities.Count} items were being written to {_databaseName}"); }