/// <summary> /// Extracts the <paramref name="doc"/> into the supplied <paramref name="directory"/> (unless overridden to put it somewhere else) /// </summary> /// <param name="doc"></param> /// <param name="directory"></param> /// <param name="listener"></param> /// <returns></returns> protected virtual bool TryExtractSupportingDocument(SupportingDocument doc, DirectoryInfo directory, IDataLoadEventListener listener) { SupportingDocumentsFetcher fetcher = new SupportingDocumentsFetcher(doc); listener.OnNotify(this, new NotifyEventArgs(ProgressEventType.Information, "Preparing to copy " + doc + " to directory " + directory.FullName)); try { var outputPath = fetcher.ExtractToDirectory(directory); if (_request is ExtractDatasetCommand) { var result = (_request as ExtractDatasetCommand).CumulativeExtractionResults; var supplementalResult = result.AddSupplementalExtractionResult(null, doc); supplementalResult.CompleteAudit(this.GetType(), outputPath, 0); } else { var extractGlobalsCommand = (_request as ExtractGlobalsCommand); Debug.Assert(extractGlobalsCommand != null, "extractGlobalsCommand != null"); var result = new SupplementalExtractionResults(extractGlobalsCommand.RepositoryLocator.DataExportRepository, extractGlobalsCommand.Configuration, null, doc); result.CompleteAudit(this.GetType(), outputPath, 0); extractGlobalsCommand.ExtractionResults.Add(result); } return(true); } catch (Exception e) { listener.OnNotify(this, new NotifyEventArgs(ProgressEventType.Error, "Failed to copy file " + doc + " to directory " + directory.FullName, e)); return(false); } }
/// <summary> /// Checks that the Catalogue has a sensible Name (See <see cref="IsAcceptableName(string)"/>). Then checks that there are no missing ColumnInfos /// </summary> /// <param name="notifier"></param> public void Check(ICheckNotifier notifier) { string reason; if (!IsAcceptableName(Name, out reason)) { notifier.OnCheckPerformed( new CheckEventArgs( "Catalogue name " + Name + " (ID=" + ID + ") does not follow naming conventions reason:" + reason, CheckResult.Fail)); } else { notifier.OnCheckPerformed(new CheckEventArgs("Catalogue name " + Name + " follows naming conventions ", CheckResult.Success)); } ITableInfo[] tables = GetTableInfoList(true); foreach (TableInfo t in tables) { t.Check(notifier); } ExtractionInformation[] extractionInformations = this.GetAllExtractionInformation(ExtractionCategory.Core); if (extractionInformations.Any()) { bool missingColumnInfos = false; foreach (ExtractionInformation missingColumnInfo in extractionInformations.Where(e => e.ColumnInfo == null)) { notifier.OnCheckPerformed( new CheckEventArgs( "ColumnInfo behind ExtractionInformation/CatalogueItem " + missingColumnInfo.GetRuntimeName() + " is MISSING, it must have been deleted", CheckResult.Fail)); missingColumnInfos = true; } if (missingColumnInfos) { return; } notifier.OnCheckPerformed( new CheckEventArgs( "Found " + extractionInformations.Length + " ExtractionInformation(s), preparing to validate SQL with QueryBuilder", CheckResult.Success)); var accessContext = DataAccessContext.InternalDataProcessing; try { var server = DataAccessPortal.GetInstance().ExpectDistinctServer(tables, accessContext, false); using (var con = server.GetConnection()) { con.Open(); string sql; try { QueryBuilder qb = new QueryBuilder(null, null); qb.TopX = 1; qb.AddColumnRange(extractionInformations); sql = qb.SQL; notifier.OnCheckPerformed(new CheckEventArgs("Query Builder assembled the following SQL:" + Environment.NewLine + sql, CheckResult.Success)); } catch (Exception e) { notifier.OnCheckPerformed( new CheckEventArgs("Could not generate extraction SQL for Catalogue " + this, CheckResult.Fail, e)); return; } using (var cmd = DatabaseCommandHelper.GetCommand(sql, con)) { cmd.CommandTimeout = 10; using (DbDataReader r = cmd.ExecuteReader()) { if (r.Read()) { notifier.OnCheckPerformed(new CheckEventArgs("successfully read a row of data from the extraction SQL of Catalogue " + this, CheckResult.Success)); } else { notifier.OnCheckPerformed(new CheckEventArgs("The query produced an empty result set for Catalogue" + this, CheckResult.Warning)); } } } con.Close(); } } catch (Exception e) { notifier.OnCheckPerformed( new CheckEventArgs( "Extraction SQL Checking failed for Catalogue " + this + " make sure that you can access the underlying server under DataAccessContext." + accessContext + " and that the SQL generated runs correctly (see internal exception for details)", CheckResult.Fail, e)); } } //supporting documents var f = new SupportingDocumentsFetcher(this); f.Check(notifier); }