public bool Execute(MeterDataSet meterDataSet)
        {
            try
            {
                s_mutex.WaitOne();

                using (AdoDataConnection connection = new AdoDataConnection("systemSettings"))
                {
                    string url        = connection.ExecuteScalar <string>("SELECT Value FROM Setting WHERE Name = 'SystemCenter.Url'");
                    string credential = connection.ExecuteScalar <string>("SELECT Value FROM Setting WHERE Name = 'SystemCenter.Credential'");
                    string password   = connection.ExecuteScalar <string>("SELECT Value FROM Setting WHERE Name = 'SystemCenter.Password'");

                    // Get MiMD Statistic record for current meter and date
                    string meter = meterDataSet.Meter.AssetKey;

                    MiMDDailyStatistic record = GetRecord(url, credential, password, meter);

                    // if
                    if (record == null)
                    {
                        record       = new MiMDDailyStatistic();
                        record.Meter = meterDataSet.Meter.AssetKey;
                        record.Date  = DateTime.Now.Date.ToString("MM/dd/yyyy");

                        if (meterDataSet.FileProcessingError == null)
                        {
                            record.LastSuccessfulFileProcessed = DateTime.Now;
                        }
                        else
                        {
                            record.LastUnsuccessfulFileProcessed = DateTime.Now;
                        }

                        record.LastUnsuccessfulFileProcessedExplanation = meterDataSet.FileProcessingError;
                        record.TotalFilesProcessed             = 1;
                        record.TotalSuccessfulFilesProcessed   = (meterDataSet.FileProcessingError == null ? 1 : 0);
                        record.TotalUnsuccessfulFilesProcessed = (meterDataSet.FileProcessingError == null ? 0 : 1);
                        record.ConfigChanges = meterDataSet.ConfigChanges;

                        if (meterDataSet.ConfigChanges > 0)
                        {
                            record.LastConfigFileChange = DateTime.Now;
                        }

                        record.DiagnosticAlarms = meterDataSet.DiagnosticAlarms;
                        record.ComplianceIssues = meterDataSet.ComplianceIssues;
                    }
                    else if (record.Date != DateTime.Now.Date.ToString("MM/dd/yyyy"))
                    {
                        MiMDDailyStatistic lastRecord = record;
                        record       = new MiMDDailyStatistic();
                        record.Meter = lastRecord.Meter;
                        record.Date  = DateTime.Now.Date.ToString("MM/dd/yyyy");

                        if (meterDataSet.FileProcessingError == null)
                        {
                            record.LastSuccessfulFileProcessed = DateTime.Now;
                        }
                        else
                        {
                            record.LastUnsuccessfulFileProcessed = DateTime.Now;
                        }

                        if (meterDataSet.ConfigChanges > 0)
                        {
                            record.LastConfigFileChange = DateTime.Now;
                        }



                        record.LastUnsuccessfulFileProcessedExplanation = (meterDataSet.FileProcessingError == null ? lastRecord.LastUnsuccessfulFileProcessedExplanation : meterDataSet.FileProcessingError);
                        record.TotalFilesProcessed             = lastRecord.TotalFilesProcessed + 1;
                        record.TotalSuccessfulFilesProcessed   = lastRecord.TotalSuccessfulFilesProcessed + (meterDataSet.FileProcessingError == null ? 1 : 0);
                        record.TotalUnsuccessfulFilesProcessed = lastRecord.TotalUnsuccessfulFilesProcessed + (meterDataSet.FileProcessingError == null ? 0 : 1);
                        record.ConfigChanges    = lastRecord.ConfigChanges + meterDataSet.ConfigChanges;
                        record.DiagnosticAlarms = lastRecord.DiagnosticAlarms + meterDataSet.DiagnosticAlarms;
                        record.ComplianceIssues = lastRecord.ComplianceIssues + meterDataSet.ComplianceIssues;
                    }
                    else
                    {
                        if (meterDataSet.FileProcessingError == null)
                        {
                            record.LastSuccessfulFileProcessed = DateTime.Now;
                        }
                        else
                        {
                            record.LastUnsuccessfulFileProcessed = DateTime.Now;
                        }

                        record.LastUnsuccessfulFileProcessedExplanation = (meterDataSet.FileProcessingError == null ? record.LastUnsuccessfulFileProcessedExplanation : meterDataSet.FileProcessingError);;
                        record.TotalFilesProcessed             += 1;
                        record.TotalSuccessfulFilesProcessed   += (meterDataSet.FileProcessingError == null ? 1 : 0);
                        record.TotalUnsuccessfulFilesProcessed += (meterDataSet.FileProcessingError == null ? 0 : 1);
                        record.ConfigChanges += meterDataSet.ConfigChanges;

                        if (meterDataSet.ConfigChanges > 0)
                        {
                            record.LastConfigFileChange = DateTime.Now;
                        }

                        record.DiagnosticAlarms += meterDataSet.DiagnosticAlarms;
                        record.ComplianceIssues += meterDataSet.ComplianceIssues;
                    }

                    HttpStatusCode code = UpdateRecord(url, credential, password, record);

                    if (code != HttpStatusCode.OK)
                    {
                        throw new Exception("Failed to add or update daily statistics.");
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error($"Failed to create daily statistic for {meterDataSet.Meter.AssetKey} - {ex.Message}");
            }
            finally
            {
                s_mutex.ReleaseMutex();
            }

            return(true);
        }
        public HttpStatusCode UpdateRecord(string url, string credential, string password, MiMDDailyStatistic record)
        {
            string antiForgeryToken = GenerateAntiForgeryToken(url, credential, password);

            using (WebRequestHandler handler = new WebRequestHandler())
                using (HttpClient client = new HttpClient(handler))
                {
                    handler.ServerCertificateValidationCallback += HandleCertificateValidation;

                    client.BaseAddress = new Uri(url);
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    client.DefaultRequestHeaders.Add("X-GSF-Verify", antiForgeryToken);
                    client.AddBasicAuthenticationHeader(credential, password);

                    HttpResponseMessage response = client.PutAsJsonAsync($"api/SystemCenter/Statistics/MiMD/Update", record).Result;
                    return(response.StatusCode);
                }
        }