/// <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())); } }
/// <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); } }