/// <summary>Gets exact timestamp from configuration database for given user supplied timestamp</summary>
 /// <param name="utcTimestamp">User supplied timestamp</param>
 /// <returns>Exact timestamp present in configuration database or DateTime.MinValue if
 /// utcTimestamp is too small or service configuration is empty</returns>
 public DateTime GetExactTimestamp(DateTime utcTimestamp)
 {
     using (FetchConfigurationDataClassesDataContext db = new FetchConfigurationDataClassesDataContext(connectionString))
     {
         if (utcTimestamp == DateTime.MaxValue)
         {
             var result = db.GetLatestTimeStamp().FirstOrDefault();
             if (result != null)
             {
                 return((DateTime)result.TimeStamp);
             }
             else
             {
                 return(DateTime.MinValue);
             }
         }
         else
         {
             var result = db.GetExactTimeStamp(utcTimestamp).FirstOrDefault();
             if (result == null)
             {
                 return(DateTime.MinValue);
             }
             else
             {
                 return((DateTime)result.TimeStamp);
             }
         }
     }
 }
        /// <summary>Returns the ExtendedConfiguration for the time specifed or null if time is before first timestamp in configuration database</summary>
        /// <param name="utcTime">UTC time to fetch the configuration for or DateTime.MaxValue for latest timestamp </param>
        /// <returns>ExtendedConfiguration object or null</returns>
        public ExtendedConfiguration GetConfiguration(DateTime utcTime)
        {
            using (FetchConfigurationDataClassesDataContext db = new FetchConfigurationDataClassesDataContext(connectionString))
            {
                if (utcTime == DateTime.MaxValue)
                {
                    utcTime = (DateTime)db.GetLatestTimeStamp().First().TimeStamp;
                }
                else if (utcTime < db.GetFirstTimeStamp().First().TimeStamp)
                {
                    return(null);
                }

                List <ExtendedDataSourceDefinition> dataSourcesList = new List <ExtendedDataSourceDefinition>();

                Dictionary <string, VariableDefinition> supportedVars = new Dictionary <string, VariableDefinition>();

                var dataSources = db.GetDataSources(utcTime);
                var dsVariables = db.GetEnvVariables().ToArray();

                foreach (var ds in dataSources)
                {
                    var mapping      = db.GetMapping(utcTime, ds.Name).ToArray();
                    var providedVars = mapping.Where(mp => mp.IsOutbound != null && (bool)mp.IsOutbound).Select(mp => mp.FetchVariableName).ToArray();

                    ExtendedDataSourceDefinition dsd = new ExtendedDataSourceDefinition((ushort)ds.ID, ds.Name, ds.Description, ds.Copyright, ds.Uri, ds.FullClrTypeName, providedVars,
                                                                                        (ds.RemoteName != null) ? ds.Uri : string.Empty,
                                                                                        mapping.ToDictionary(map => map.FetchVariableName, map => map.DataVariableName),
                                                                                        ds.RemoteName,
                                                                                        (ushort)(ds.RemoteID == null ? -1 : ds.RemoteID));

                    dataSourcesList.Add(dsd);
                    foreach (var envVar in providedVars)
                    {
                        if (!supportedVars.ContainsKey(envVar))
                        {
                            var v = dsVariables.Where(dsv => dsv.DisplayName == envVar).First();
                            supportedVars[envVar] = new VariableDefinition(v.DisplayName, v.Units, v.Description);
                        }
                    }
                }

                return(new ExtendedConfiguration(utcTime, dataSourcesList.ToArray(), supportedVars.Values.ToArray())
                {
                    FetchEngineTypeName = db.GetFetchEngine(utcTime).First().FullClrTypeName
                });
            }
        }
        /// <summary>
        /// Produces the configuration for the time specified
        /// </summary>
        /// <param name="utcTime">A time to produce the configuration for</param>
        /// <returns></returns>
        public IFetchConfiguration GetConfiguration(DateTime utcTime)
        {
            using (FetchConfigurationDataClassesDataContext db = new FetchConfigurationDataClassesDataContext(connectionString))
            {
                if (utcTime == DateTime.MaxValue)
                {
                    utcTime = (DateTime)db.GetLatestTimeStamp().First().TimeStamp;
                }
                else if (utcTime < db.GetFirstTimeStamp().First().TimeStamp)
                {
                    throw new ArgumentException("No configuration exists for given timestamp");
                }

                List <IDataSourceDefinition> dataSourcesList = new List <IDataSourceDefinition>();

                Dictionary <string, IVariableDefinition> supportedVars = new Dictionary <string, IVariableDefinition>();
                var dataSources = db.GetDataSources(utcTime);
                var dsVariables = db.GetEnvVariables().ToArray();
                foreach (var ds in dataSources)
                {
                    var mappings     = db.GetMapping(utcTime, ds.Name);
                    var providedVars = mappings.Where(mp => mp.IsOutbound != null && (bool)mp.IsOutbound).Select(mp => mp.FetchVariableName).ToArray();

                    if (providedVars.Length > 0) //otherwise there are no mappings for the data source
                    {
                        IDataSourceDefinition dsd = new DataSourceDefinition((ushort)ds.ID, ds.Name, ds.Description, ds.Copyright,
                                                                             (ds.RemoteName != null) ? ds.Uri : string.Empty,
                                                                             providedVars);
                        dataSourcesList.Add(dsd);
                        foreach (var evn in providedVars)
                        {
                            if (!supportedVars.ContainsKey(evn))
                            {
                                var v = dsVariables.Where(dsv => dsv.DisplayName == evn).First();
                                supportedVars[v.DisplayName] = new VariableDefinition(v.DisplayName, v.Units, v.Description);
                            }
                        }
                    }
                }

                return(new FetchConfiguration(utcTime, dataSourcesList.ToArray(), supportedVars.Values.ToArray()));
            }
        }
Exemple #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="localSqlConnString">SQL connection string to configuration data base (null for automatic extraction from blob)</param>
        /// <param name="storageConnStr">An azure storage to work with (null for in-process operation)</param>
        /// <param name="isWorkingWithCloud">identifies whether the configurator works with cloud deployment of FetchClimate or with "in-process" deployment</param>
        /// <remarks>This constructor is invoked by "use command".
        /// use cloud accountkey=... accountname=... sqlconnstr=... invokes FetchConfigurator(storageconnstr, sqlconnstr, true),
        /// use local sqlconnstr=... invokes FetchConfigurator(null, sqlconnstr, false)</remarks>
        public FetchConfigurator(string storageConnStr, string sqlConnectionStr, bool isWorkingWithCloud)
        {
            this.storageConnectionString = storageConnStr;
            this.isConnectedToCloud      = isWorkingWithCloud;

            if (!string.IsNullOrEmpty(storageConnectionString) && sqlConnectionStr == null) //extracting sql connection string from the azure storage
            {
                sqlConnectionStr = ExtractSqlConnectionString(sqlConnectionStr);
            }
            sqlConnStringIncludingPassword = sqlConnectionStr;
            db = new FetchConfigurationDataClassesDataContext(sqlConnectionStr);

            //caching sql conn string to blob storage
            if (!string.IsNullOrEmpty(storageConnStr))
            {
                var csa        = CloudStorageAccount.Parse(storageConnectionString);
                var client     = csa.CreateCloudBlobClient();
                var contatiner = client.GetContainerReference(ConfigurationContainerName);
                contatiner.CreateIfNotExist();
                var blob = contatiner.GetBlobReference(SqlConnectionStringBlobName);
                blob.UploadText(sqlConnStringIncludingPassword);
                astore = new AssemblyStore(storageConnectionString, true);
            }
        }