Exemple #1
0
        /// <summary>
        /// Process request to save a resultSet to a file in XML format
        /// </summary>
        internal async Task HandleSaveResultsAsXmlRequest(SaveResultsAsXmlRequestParams saveParams,
                                                          RequestContext <SaveResultRequestResult> requestContext)
        {
            // Use the default XML file factory if we haven't overridden it
            IFileStreamFactory xmlFactory = XmlFileFactory ?? new SaveAsXmlFileStreamFactory
            {
                SaveRequestParams      = saveParams,
                QueryExecutionSettings = Settings.QueryExecutionSettings
            };

            await SaveResultsHelper(saveParams, requestContext, xmlFactory);
        }
Exemple #2
0
        /// <summary>
        /// Constructor, writes the header to the file, chains into the base constructor
        /// </summary>
        /// <param name="stream">FileStream to access the JSON file output</param>
        /// <param name="requestParams">XML save as request parameters</param>
        public SaveAsXmlFileStreamWriter(Stream stream, SaveResultsAsXmlRequestParams requestParams)
            : base(stream, requestParams)
        {
            // Setup the internal state
            var encoding = GetEncoding(requestParams);

            xmlTextWriter            = new XmlTextWriter(stream, encoding);
            xmlTextWriter.Formatting = requestParams.Formatted ? Formatting.Indented : Formatting.None;

            //Start the document and the root element
            xmlTextWriter.WriteStartDocument();
            xmlTextWriter.WriteStartElement(RootElementTag);
        }
        /// <summary>
        /// Request to save query results as XML
        /// </summary>
        public async Task <SaveResultRequestResult> SaveAsXml(string ownerUri, string filename, int batchIndex, int resultSetIndex)
        {
            var saveParams = new SaveResultsAsXmlRequestParams
            {
                OwnerUri       = ownerUri,
                BatchIndex     = batchIndex,
                ResultSetIndex = resultSetIndex,
                FilePath       = filename
            };

            var result = await Driver.SendRequest(SaveResultsAsXmlRequest.Type, saveParams);

            return(result);
        }
        private static IFileStreamFactory GetXmlStreamFactory(IDictionary <string, byte[]> storage,
                                                              SaveResultsAsXmlRequestParams saveParams)
        {
            Mock <IFileStreamFactory> mock = new Mock <IFileStreamFactory>();

            mock.Setup(fsf => fsf.GetReader(It.IsAny <string>()))
            .Returns <string>(output => new ServiceBufferFileStreamReader(new MemoryStream(storage[output]), new QueryExecutionSettings()));
            mock.Setup(fsf => fsf.GetWriter(It.IsAny <string>()))
            .Returns <string>(output =>
            {
                storage.Add(output, new byte[8192]);
                return(new SaveAsXmlFileStreamWriter(new MemoryStream(storage[output]), saveParams));
            });

            return(mock.Object);
        }
        public async Task SaveResultAsXmlFailure()
        {
            // Given:
            // ... A working query and workspace service
            WorkspaceService <SqlToolsSettings>   ws = Common.GetPrimedWorkspaceService(Constants.StandardQuery);
            ConcurrentDictionary <string, byte[]> storage;
            QueryExecutionService qes = Common.GetPrimedExecutionService(Common.StandardTestDataSet, true, false, false, ws, out storage);

            // ... The query execution service has executed a query with results
            var executeParams = new ExecuteDocumentSelectionParams {
                QuerySelection = null, OwnerUri = Constants.OwnerUri
            };
            var executeRequest = RequestContextMocks.Create <ExecuteRequestResult>(null);
            await qes.HandleExecuteRequest(executeParams, executeRequest.Object);

            await qes.WorkTask;
            await qes.ActiveQueries[Constants.OwnerUri].ExecutionTask;

            // If: I attempt to save a result set and get it to throw because of invalid column selection
            SaveResultsAsXmlRequestParams saveParams = new SaveResultsAsXmlRequestParams
            {
                BatchIndex       = 0,
                FilePath         = "qqq",
                OwnerUri         = Constants.OwnerUri,
                ResultSetIndex   = 0,
                ColumnStartIndex = -1,
                ColumnEndIndex   = 100,
                RowStartIndex    = 0,
                RowEndIndex      = 5
            };

            qes.XmlFileFactory = GetXmlStreamFactory(storage, saveParams);
            var efv = new EventFlowValidator <SaveResultRequestResult>()
                      .AddStandardErrorValidation()
                      .Complete();
            await qes.HandleSaveResultsAsXmlRequest(saveParams, efv.Object);

            await qes.ActiveQueries[saveParams.OwnerUri]
            .Batches[saveParams.BatchIndex]
            .ResultSets[saveParams.ResultSetIndex]
            .SaveTasks[saveParams.FilePath];

            // Then:
            // ... An error event should have been fired
            // ... No success event should have been fired
            efv.Validate();
        }
        public async Task SaveResultsAsXmlSuccess()
        {
            // Given:
            // ... A working query and workspace service
            WorkspaceService <SqlToolsSettings>   ws = Common.GetPrimedWorkspaceService(Constants.StandardQuery);
            ConcurrentDictionary <string, byte[]> storage;
            QueryExecutionService qes = Common.GetPrimedExecutionService(Common.StandardTestDataSet, true, false, false, ws, out storage);

            // ... The query execution service has executed a query with results
            var executeParams = new ExecuteDocumentSelectionParams {
                QuerySelection = null, OwnerUri = Constants.OwnerUri
            };
            var executeRequest = RequestContextMocks.Create <ExecuteRequestResult>(null);
            await qes.HandleExecuteRequest(executeParams, executeRequest.Object);

            await qes.WorkTask;
            await qes.ActiveQueries[Constants.OwnerUri].ExecutionTask;

            // If: I attempt to save a result set from a query
            SaveResultsAsXmlRequestParams saveParams = new SaveResultsAsXmlRequestParams
            {
                OwnerUri       = Constants.OwnerUri,
                FilePath       = "qqq",
                BatchIndex     = 0,
                ResultSetIndex = 0,
                Formatted      = true
            };

            qes.XmlFileFactory = GetXmlStreamFactory(storage, saveParams);

            var efv = new EventFlowValidator <SaveResultRequestResult>()
                      .AddStandardResultValidator()
                      .Complete();
            await qes.HandleSaveResultsAsXmlRequest(saveParams, efv.Object);

            await qes.ActiveQueries[saveParams.OwnerUri]
            .Batches[saveParams.BatchIndex]
            .ResultSets[saveParams.ResultSetIndex]
            .SaveTasks[saveParams.FilePath];

            // Then:
            // ... I should have a successful result
            // ... There should not have been an error
            efv.Validate();
        }
        public async Task SaveResultsXmlNonExistentQuery()
        {
            // Given: A working query and workspace service
            WorkspaceService <SqlToolsSettings> ws = Common.GetPrimedWorkspaceService(null);
            QueryExecutionService qes = Common.GetPrimedExecutionService(null, false, false, false, ws);

            // If: I attempt to save a result set from a query that doesn't exist
            SaveResultsAsXmlRequestParams saveParams = new SaveResultsAsXmlRequestParams
            {
                OwnerUri = Constants.OwnerUri // Won't exist because nothing has executed
            };
            var efv = new EventFlowValidator <SaveResultRequestResult>()
                      .AddStandardErrorValidation()
                      .Complete();
            await qes.HandleSaveResultsAsXmlRequest(saveParams, efv.Object);

            // Then:
            // ... An error event should have been fired
            // ... No success event should have been fired
            efv.Validate();
        }
Exemple #8
0
        /// <summary>
        /// Get the encoding for the XML file according to <param name="requestParams"></param>
        /// </summary>
        /// <param name="requestParams">XML save as request parameters</param>
        /// <returns></returns>
        private Encoding GetEncoding(SaveResultsAsXmlRequestParams requestParams)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            Encoding encoding;

            try
            {
                if (int.TryParse(requestParams.Encoding, out var codepage))
                {
                    encoding = Encoding.GetEncoding(codepage);
                }
                else
                {
                    encoding = Encoding.GetEncoding(requestParams.Encoding);
                }
            }
            catch
            {
                // Fallback encoding when specified codepage is invalid
                encoding = Encoding.GetEncoding("utf-8");
            }

            return(encoding);
        }