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