Beispiel #1
0
 private void GenerateExtraIndexingData(IFitsFileInfo ff, FitsHeaderIndexedRow indexingData)
 {
     // Convert RA, DEC to decimal format for searches.
     try
     {
         if (ff.HasHeaderSingleValue("RA") && ff.HasHeaderSingleValue("DEC"))
         {
             indexingData.ParsedRa  = (double)ff.GetSingleHeaderValue("RA").Value;
             indexingData.ParsedDec = (double)ff.GetSingleHeaderValue("DEC").Value;
         }
         else if (ff.HasHeaderSingleValue("RA_OBJ") && ff.HasHeaderSingleValue("DEC_OBJ"))
         {
             indexingData.ParsedRa  = (double)ff.GetSingleHeaderValue("RA_OBJ").Value;
             indexingData.ParsedDec = (double)ff.GetSingleHeaderValue("DEC_OBJ").Value;
         }
         else if (ff.HasHeaderSingleValue("OBJCTRA") && ff.HasHeaderSingleValue("OBJCTDEC"))
         {
             string ra  = (string)ff.GetSingleHeaderValue("OBJCTRA").Value;
             string dec = (string)ff.GetSingleHeaderValue("OBJCTDEC").Value;
             indexingData.ParsedRa  = CoordinateTransform.HmsToDegrees(ra);
             indexingData.ParsedDec = CoordinateTransform.DmsToDegrees(dec);
         }
     }
     catch (Exception e)
     {
         _log?.Write(LogEventCategory.Error, $"Failed to convert RA/DEC coordinates to search index format with file '{ff.FilePath}'", e);
     }
 }
Beispiel #2
0
 private async Task <IFitsFileInfo> ReadFitsFileInfo(string filePath, Action <string> readComplete)
 {
     try
     {
         return(await Task.Run(() =>
         {
             IFitsFileInfo ff = _fitsReader.GetFitsFileInfo(filePath);
             EventUtils.IgnoreExceptions(() => readComplete?.Invoke(filePath));
             return ff;
         }));
     }
     catch (Exception e)
     {
         _log?.Write(LogEventCategory.Error, $"Reading FITS file info failed for file '{filePath}'", e);
         EventUtils.IgnoreExceptions(() => readComplete?.Invoke(filePath));
     }
     return(null);
 }
Beispiel #3
0
        private async Task <DataChange> PerformFitsTableChangesTransaction(IFitsFileInfo ff)
        {
            return(await Task.Run(() =>
            {
                var opResult = DataChange.NotChanged;
                using (var context = Context())
                {
                    context.Connection.Open();
                    using (var transaction = context.BeginTransaction())
                    {
                        var fileTableChanges = false;
                        var entry = context.Files.Where(x => x.Filename == ff.FilePath).ToList().FirstOrDefault();
                        if (entry != null && entry.Checksum != ff.FileHash)
                        {
                            fileTableChanges = true;
                            opResult = DataChange.Updated;
                            entry.Checksum = ff.FileHash;
                            entry.Size = ff.FileSize;
                            entry.DateIndexed = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
                        }
                        else if (entry == null)
                        {
                            fileTableChanges = true;
                            opResult = DataChange.Created;
                            entry = new FitsTableRow()
                            {
                                Checksum = ff.FileHash,
                                DateIndexed = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(),
                                Filename = ff.FilePath,
                                Size = ff.FileSize
                            };

                            entry.Id = context.InsertWithInt64Identity(entry);
                        }

                        if (fileTableChanges)
                        {
                            var createHeaderRow = false;
                            var headers = context.Headers.Where(x => x.FitsId == entry.Id).ToList().FirstOrDefault();
                            if (headers == null)
                            {
                                createHeaderRow = true;
                                headers = new FitsHeaderIndexedRow()
                                {
                                    FitsId = entry.Id.Value
                                };
                            }
                            var headerProps = typeof(FitsHeaderIndexedRow).GetProperties()
                                              .Where(x => x.HasAttribute <FitsFieldAttribute>());

                            foreach (var prop in headerProps)
                            {
                                var fitsFieldAttr = prop.GetCustomAttribute <FitsFieldAttribute>();
                                var dbColAndHeaderName = fitsFieldAttr.Name;
                                if (!ff.HeaderKeys.Contains(dbColAndHeaderName))
                                {
                                    continue;
                                }
                                var updatedVal = fitsFieldAttr.MultiValue
                                    ? string.Join("\n",
                                                  ff.GetHeaderMultiValue(dbColAndHeaderName).Select(kv => kv.Value ?? kv.Comment))
                                    : ff.GetSingleHeaderValue(dbColAndHeaderName).Value;
                                prop.SetValue(headers, CoerceValue(prop, updatedVal));
                            }

                            GenerateExtraIndexingData(ff, headers);

                            if (createHeaderRow)
                            {
                                context.Insert(headers);
                            }
                        }

                        transaction.Commit();
                    }
                }
                return opResult;
            }));
        }