/// <summary> /// Creates a new NQuads formatter /// </summary> /// <param name="syntax">NQuads syntax to output</param> /// <param name="formatName">Format Name</param> public NQuadsFormatter(NQuadsSyntax syntax, String formatName) : base(NQuadsParser.AsNTriplesSyntax(syntax), formatName) { }
/// <summary> /// Thread Worker method which writes Graphs to the output. /// </summary> /// <param name="globalContext">Context for writing the Store.</param> private void SaveGraphs(ThreadedStoreWriterContext globalContext) { try { while (globalContext.TryGetNextUri(out var u)) { // Get the Graph from the Store var g = globalContext.Store.Graphs[u]; // Generate the Graph Output and add to Stream var context = new NTriplesWriterContext(g, new System.IO.StringWriter(), NQuadsParser.AsNTriplesSyntax(Syntax), globalContext.PrettyPrint, globalContext.HighSpeedModePermitted); var graphContent = GraphToNQuads(globalContext, context); if (!graphContent.Equals(String.Empty)) { try { Monitor.Enter(globalContext.Output); globalContext.Output.WriteLine(graphContent); globalContext.Output.Flush(); } catch { throw; } finally { Monitor.Exit(globalContext.Output); } } } } catch (ThreadAbortException) { // We've been terminated, don't do anything Thread.ResetAbort(); } catch (Exception ex) { throw new RdfStorageException("Error in Threaded Writer in Thread ID " + Thread.CurrentThread.ManagedThreadId, ex); } }
/// <summary> /// Saves a Store in NQuads format /// </summary> /// <param name="store">Store to save</param> /// <param name="writer">Writer to save to</param> /// <param name="leaveOpen">Boolean flag indicating if <paramref name="writer"/> should be left open after the store is written</param> public void Save(ITripleStore store, TextWriter writer, bool leaveOpen) { if (store == null) { throw new RdfOutputException("Cannot output a null Triple Store"); } if (writer == null) { throw new RdfOutputException("Cannot output to a null writer"); } var context = new ThreadedStoreWriterContext(store, writer, PrettyPrintMode, false); // Check there's something to do if (context.Store.Graphs.Count == 0) { if (!leaveOpen) { context.Output.Close(); } return; } try { if (UseMultiThreadedWriting) { // Queue the Graphs to be written foreach (var g in context.Store.Graphs) { context.Add(g.BaseUri); } // Start making the async calls var results = new List <IAsyncResult>(); var d = new SaveGraphsDelegate(SaveGraphs); for (var i = 0; i < _threads; i++) { results.Add(d.BeginInvoke(context, null, null)); } // Wait for all the async calls to complete WaitHandle.WaitAll(results.Select(r => r.AsyncWaitHandle).ToArray()); var outputEx = new RdfThreadedOutputException(WriterErrorMessages.ThreadedOutputFailure("TSV")); foreach (var result in results) { try { d.EndInvoke(result); } catch (Exception ex) { outputEx.AddException(ex); } } if (!leaveOpen) { context.Output.Close(); } // If there were any errors we'll throw an RdfThreadedOutputException now if (outputEx.InnerExceptions.Any()) { throw outputEx; } } else { foreach (var g in context.Store.Graphs) { var graphContext = new NTriplesWriterContext(g, context.Output, NQuadsParser.AsNTriplesSyntax(Syntax)); foreach (var t in g.Triples) { context.Output.WriteLine(TripleToNQuads(graphContext, t, g.BaseUri)); } } if (!leaveOpen) { context.Output.Close(); } } } catch { try { if (!leaveOpen) { context.Output.Close(); } } catch { // Just cleaning up } throw; } }
/// <summary> /// Saves a Store in NQuads format. /// </summary> /// <param name="store">Store to save.</param> /// <param name="writer">Writer to save to.</param> /// <param name="leaveOpen">Boolean flag indicating if <paramref name="writer"/> should be left open after the store is written.</param> public void Save(ITripleStore store, TextWriter writer, bool leaveOpen) { if (store == null) { throw new RdfOutputException("Cannot output a null Triple Store"); } if (writer == null) { throw new RdfOutputException("Cannot output to a null writer"); } var context = new ThreadedStoreWriterContext(store, writer, PrettyPrintMode, false); // Check there's something to do if (context.Store.Graphs.Count == 0) { if (!leaveOpen) { context.Output.Close(); } return; } try { if (UseMultiThreadedWriting) { // Queue the Graphs to be written foreach (var g in context.Store.Graphs) { context.Add(g.BaseUri); } // Start making the async calls //var results = new List<IAsyncResult>(); var workers = new Task[_threads]; for (var i = 0; i < _threads; i++) { workers[i] = Task.Factory.StartNew(() => SaveGraphs(context)); } try { Task.WaitAll(workers); } catch (AggregateException ex) { var outputException = new RdfThreadedOutputException(WriterErrorMessages.ThreadedOutputFailure("TSV")); foreach (var innerException in ex.InnerExceptions) { outputException.AddException(innerException); } } finally { if (!leaveOpen) { context.Output.Close(); } } } else { foreach (var g in context.Store.Graphs) { var graphContext = new NTriplesWriterContext(g, context.Output, NQuadsParser.AsNTriplesSyntax(Syntax)); foreach (var t in g.Triples) { context.Output.WriteLine(TripleToNQuads(graphContext, t, g.BaseUri)); } } if (!leaveOpen) { context.Output.Close(); } } } catch { try { if (!leaveOpen) { context.Output.Close(); } } catch { // Just cleaning up } throw; } }
/// <summary> /// Thread Worker method which writes Graphs to the output /// </summary> /// <param name="globalContext">Context for writing the Store</param> private void SaveGraphs(ThreadedStoreWriterContext globalContext) { try { Uri u = null; while (globalContext.TryGetNextUri(out u)) { //Get the Graph from the Store IGraph g = globalContext.Store.Graphs[u]; //Generate the Graph Output and add to Stream NTriplesWriterContext context = new NTriplesWriterContext(g, new System.IO.StringWriter(), NQuadsParser.AsNTriplesSyntax(this.Syntax), globalContext.PrettyPrint, globalContext.HighSpeedModePermitted); String graphContent = this.GraphToNQuads(globalContext, context); if (!graphContent.Equals(String.Empty)) { try { Monitor.Enter(globalContext.Output); globalContext.Output.WriteLine(graphContent); globalContext.Output.Flush(); } catch { throw; } finally { Monitor.Exit(globalContext.Output); } } } } #if !PORTABLE // PCL doesn't provide Thread.Abort() or ThreadAbortException catch (ThreadAbortException) { //We've been terminated, don't do anything #if !SILVERLIGHT Thread.ResetAbort(); #endif } #endif catch (Exception ex) { throw new RdfStorageException("Error in Threaded Writer in Thread ID " + Thread.CurrentThread.ManagedThreadId, ex); } }