예제 #1
0
        public List <MetricMeasurement> UpdateMetrics(Dictionary <string, string> deviceVars)
        {
            SQLiteConnection         connection;
            List <MetricMeasurement> metricMeasurements = new List <MetricMeasurement>();

            using (connection = this.CreateConnection())
            {
                foreach (KeyValuePair <string, string> deviceVar in deviceVars)
                {
                    if (!TryGetVariableMetric(deviceVar.Key, out VariableMetric metric))
                    {
                        continue;
                    }

                    if (!metric.Initialized)
                    {
                        InitializeMetric(connection, metric);
                    }

                    MetricMeasurement metricMeasurement = new MetricMeasurement()
                    {
                        VariableName = metric.VariableName,
                        Timestamp    = DateTime.UtcNow,
                        Value        = double.Parse(deviceVar.Value)
                    };

                    InsertMetricRaw(connection, metric, metricMeasurement);

                    InsertMetric1Minute(connection, metric, metricMeasurement);

                    metricMeasurements.Add(metricMeasurement);
                }

                connection.Close();
            }

            return(metricMeasurements);
        }
예제 #2
0
        private static void InsertMetricRaw(
            SQLiteConnection connection,
            VariableMetric metric,
            MetricMeasurement metricMeasurement)
        {
            if (!metric.Initialized)
            {
                throw new Exception("Metric is not initialized!");
            }



            SQLiteCommand cmd;

            using (cmd = new SQLiteCommand(connection))
            {
                cmd.CommandText = $"INSERT INTO [{metric.TableName}_raw] (timestamp, value) VALUES (@timestamp, @value)";
                cmd.Parameters.AddWithValue("@timestamp", metricMeasurement.Timestamp.ToEpochSeconds());
                cmd.Parameters.AddWithValue("@value", metricMeasurement.Value);

                cmd.ExecuteNonQuery();
            }
        }
예제 #3
0
        private static void InsertMetric1Minute(
            SQLiteConnection connection,
            VariableMetric metric,
            MetricMeasurement metricMeasurement)
        {
            if (!metric.Initialized)
            {
                throw new Exception("Metric is not initialized!");
            }

            var timestamp = new DateTime(
                metricMeasurement.Timestamp.Year,
                metricMeasurement.Timestamp.Month,
                metricMeasurement.Timestamp.Day,
                metricMeasurement.Timestamp.Hour,
                metricMeasurement.Timestamp.Minute,
                0);

            double?newValue   = null;
            int    valueCount = 0;

            using (var cmd = new SQLiteCommand(connection))
            {
                cmd.CommandText = $"SELECT * FROM [{metric.TableName}_1m] WHERE [timestamp] = @ts";
                cmd.Parameters.AddWithValue("@ts", timestamp.ToEpochSeconds());

                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        if (string.IsNullOrWhiteSpace(metric.TableName))
                        {
                            throw new Exception("TableName read from metric row is empty");
                        }

                        double value = (double)reader["value"];
                        valueCount = (int)reader["count"];

                        newValue = ((value * valueCount) + metricMeasurement.Value) / (valueCount + 1);
                        break;
                    }
                }
            }

            if (newValue != null)
            {
                using (var cmd = new SQLiteCommand(connection))
                {
                    cmd.CommandText = $"UPDATE [{metric.TableName}_1m] SET [value] = @value, [count] = @count WHERE [timestamp] = @ts";
                    cmd.Parameters.AddWithValue("@value", newValue.Value);
                    cmd.Parameters.AddWithValue("@count", valueCount + 1);
                    cmd.Parameters.AddWithValue("@ts", timestamp.ToEpochSeconds());

                    cmd.ExecuteNonQuery();
                }

                return;
            }

            using (var cmd = new SQLiteCommand(connection))
            {
                cmd.CommandText = $"INSERT INTO [{metric.TableName}_1m] (timestamp, value, count) VALUES (@ts, @value, @count)";
                cmd.Parameters.AddWithValue("@ts", timestamp.ToEpochSeconds());
                cmd.Parameters.AddWithValue("@value", metricMeasurement.Value);
                cmd.Parameters.AddWithValue("@count", 1);

                cmd.ExecuteNonQuery();
            }
        }