예제 #1
0
        } // end of WriteSlowSingleRowToRepository function

        /// <summary>Saves single row & fast changing metric</summary>
        private void WriteFastSingleRowToRepository(int targetId, MetricGroup metricGroup, ProbeResultingData data)
        {
            // generate SQL statement
            string dataSqlStmt = GenerateSqlSingleRowFast(targetId, metricGroup, data);

            _logger.Trace(dataSqlStmt);

            SqlServerProbe.ExecuteSql(dataSqlStmt, targetId, metricGroup);

            // update in-memory data
            object[] newValues = new object[data.NumberOfColumns];
            for (int i = 0; i < data.NumberOfColumns; i++)
            {
                newValues[i] = data.values[0, i];
            }

            // create in-memory cache table if it doesn't exist
            string cacheKey = InMemoryCache.GetCacheKey(-1, metricGroup);

            if (!InMemoryCache.ContainsKey(cacheKey))
            {
                // Do no create new cache table if target has been deleted
                if (!Configuration.targets.ContainsKey(targetId))
                {
                    return;
                }

                InMemoryCache.CreateCacheTableSingleRow(metricGroup, CacheType.Data);
            }

            Configuration.inMemoryCache[cacheKey].AddOrUpdateRowValues(-1, new object[] { targetId }, newValues);
        } // end of WriteFastSingleRowToRepository function
예제 #2
0
        /// <summary>Returns true if new data matches in-memory copy or no history is found - single row - slow changing</summary>
        private int CompareSlowSingleRowWithInMemoryData(int targetId, MetricGroup metricGroup, ProbeResultingData data, SqlConnection connection)
        {
            bool       noHistory = false;
            CacheTable dataCache;

            // create in-memory cache table if it doesn't exist
            if (!InMemoryCache.ContainsKey(InMemoryCache.GetCacheKey(-1, metricGroup)))
            {
                // Do not create tables if target has been deleted
                if (!Configuration.targets.ContainsKey(targetId))
                {
                    return(-1);
                }

                InMemoryCache.CreateCacheTableSingleRow(metricGroup, CacheType.Data);
            }

            dataCache = Configuration.inMemoryCache[InMemoryCache.GetCacheKey(-1, metricGroup, CacheType.Data)];
            // load latest row from the repository if it is not in-memory yet
            int id = dataCache.GetIdByKey(new object[] { targetId });

            if (id == -1)
            {
                string sqlStmt = "SELECT ";

                for (int i = 0; i < metricGroup.NumberOfMetrics; i++)
                {
                    sqlStmt += metricGroup.metrics[i].name.Replace(' ', '_') + ",";
                }

                sqlStmt  = sqlStmt.Remove(sqlStmt.Length - 1); // remove last comma
                sqlStmt += " FROM " + SqlServerProbe.DataTableName(targetId, metricGroup);
                sqlStmt += " WHERE startDate = (SELECT MAX(startDate) FROM " + SqlServerProbe.DataTableName(targetId, metricGroup) + ")";

                using (SqlCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = sqlStmt;

                    try
                    {
                        SqlDataReader dataReader = cmd.ExecuteReader();

                        if (dataReader.Read())
                        {
                            object[] oldValues = new object[metricGroup.NumberOfMetrics];

                            for (int i = 0; i < metricGroup.NumberOfMetrics; i++)
                            {
                                // check data type before casting
                                switch (metricGroup.metrics[i].type)
                                {
                                case DataType.Ansi:
                                    if (!DataTypeMappingSqlServer.DoesBelong(dataReader.GetDataTypeName(i), DataType.Ansi))
                                    {
                                        throw new Exception("Data type of column #" + (i + 1).ToString() + " of '" + metricGroup.name + "' metric does not match any allowed data type for internal data type Ansi");
                                    }

                                    oldValues[i] = (object)dataReader.GetString(i);

                                    break;

                                case DataType.Unicode:
                                    if (!DataTypeMappingSqlServer.DoesBelong(dataReader.GetDataTypeName(i), DataType.Unicode))
                                    {
                                        throw new Exception("Data type of column #" + (i + 1).ToString() + " of '" + metricGroup.name + "' metric does not match any allowed data type for internal data type Unicode");
                                    }

                                    oldValues[i] = (object)dataReader.GetString(i);

                                    break;

                                case DataType.Double:
                                    if (!DataTypeMappingSqlServer.DoesBelong(dataReader.GetDataTypeName(i), DataType.Double))
                                    {
                                        throw new Exception("Data type of column #" + (i + 1).ToString() + " of '" + metricGroup.name + "' metric does not match any allowed data type for internal data type Double");
                                    }

                                    oldValues[i] = (object)dataReader.GetDouble(i);

                                    break;

                                case DataType.SmallInt:
                                    if (!DataTypeMappingSqlServer.DoesBelong(dataReader.GetDataTypeName(i), DataType.SmallInt))
                                    {
                                        throw new Exception("Data type of column #" + (i + 1).ToString() + " of '" + metricGroup.name + "' metric does not match any allowed data type for internal data type Int16");
                                    }

                                    oldValues[i] = (object)dataReader.GetInt16(i);

                                    break;

                                case DataType.Datetime:
                                    if (!DataTypeMappingSqlServer.DoesBelong(dataReader.GetDataTypeName(i), DataType.Datetime))
                                    {
                                        throw new Exception("Data type of column #" + (i + 1).ToString() + " of '" + metricGroup.name + "' metric does not match any allowed data type for internal data type Datetime");
                                    }

                                    oldValues[i] = (object)dataReader.GetDateTime(i);

                                    break;

                                default:
                                    throw new Exception("Unknown data type");
                                } // end of switch
                                i++;
                            }

                            id = dataCache.Add(-1, new object[] { targetId }, oldValues);
                        }
                        else
                        {
                            noHistory = true;
                        }

                        dataReader.Close();
                        dataReader.Dispose();
                    }
                    catch (SqlException e)
                    {
                        if (e.Number == 208) // Invalid object
                        {
                            // Do not create tables if target has been deleted
                            if (!Configuration.targets.ContainsKey(targetId))
                            {
                                return(-1);
                            }

                            SqlServerProbe.CreateTablesForMetricGroup(targetId, metricGroup);
                            noHistory = true;
                        }
                        else
                        {
                            throw;
                        }
                    }
                }

                if (noHistory)
                {
                    return(-1);
                }
            }

            // compare old and new values
            object[] newValues = new object[metricGroup.NumberOfMetrics];
            for (int i = 0; i < metricGroup.NumberOfMetrics; i++)
            {
                newValues[i] = data.values[0, i];
            }

            if (dataCache.CompareAttributesForKey(id, newValues))
            {
                return(0);
            }
            else
            {
                return(1);
            }
        }