Exemplo n.º 1
0
        private void OnJobCompleted(object sender, JobCompletedEventArgs e)
        {
            var jobStatus = _serverCore.GetJobStatus(e.StoreId, e.CompletedJob.JobId.ToString());

            if (jobStatus != null && jobStatus.JobStatus == JobStatus.TransactionError)
            {
                // Because all transactions should be processable, this indicates a hardware problem or persistent software problem
                _serverCore.Shutdown(true);
                _state = CoreState.Broken;
            }
            _storeInfo[e.StoreId].Commit(e.CompletedJob.JobId);
        }
 /// <summary>
 /// Execute an update transaction.
 /// </summary>
 /// <param name="storeName">The name of the store to modify</param>
 /// <param name="preconditions">NTriples that must be in the store in order for the transaction to execute</param>
 /// <param name="deletePatterns">The delete patterns that will be removed from the store</param>
 /// <param name="insertData">The NTriples data that will be inserted into the store.</param>
 /// <param name="waitForCompletion">If set to true the method will block until the transaction completes</param>
 /// <returns>Job Info</returns>
 public IJobInfo ExecuteTransaction(string storeName, string preconditions, string deletePatterns, string insertData, bool waitForCompletion = true)
 {
     try
     {
         if (!waitForCompletion)
         {
             var jobId = _serverCore.ProcessTransaction(storeName, preconditions, deletePatterns, insertData);
             return(new JobInfoWrapper(new JobInfo {
                 JobId = jobId.ToString(), JobPending = true
             }));
         }
         else
         {
             var jobId = _serverCore.ProcessTransaction(storeName, preconditions, deletePatterns, insertData);
             JobExecutionStatus status = _serverCore.GetJobStatus(storeName, jobId.ToString());
             while (status.JobStatus != JobStatus.CompletedOk && status.JobStatus != JobStatus.TransactionError)
             {
                 Thread.Sleep(50);
                 status = _serverCore.GetJobStatus(storeName, jobId.ToString());
             }
             return(new JobInfoWrapper(new JobInfo
             {
                 JobId = jobId.ToString(),
                 StatusMessage = status.Information,
                 JobCompletedOk = (status.JobStatus == JobStatus.CompletedOk),
                 JobCompletedWithErrors =
                     (status.JobStatus == JobStatus.TransactionError)
             }));
         }
     }
     catch (Exception ex)
     {
         Logging.LogError(BrightstarEventId.ServerCoreException, "Error Queing Transaction {0} {1} {2}", storeName, deletePatterns, insertData);
         throw new BrightstarClientException("Error queing transaction in store " + storeName + ". " + ex.Message, ex);
     }
 }
        /// <summary>
        /// Commits all changes. Waits for the operation to complete.
        /// </summary>
        protected override void DoSaveChanges()
        {
            if (_optimisticLockingEnabled)
            {
                // get subject entity and see if there is a version triple
                var subjects = AddTriples.Subjects
                               .Union(DeletePatterns.Subjects)
                               .Except(new[] { Constants.WildcardUri }).ToList();
                foreach (var subject in subjects)
                {
                    var entity = LookupDataObject(subject);
                    if (entity == null)
                    {
                        throw new BrightstarClientException("No Entity Found for Subject " + subject);
                    }

                    var version = entity.GetPropertyValue(Constants.VersionPredicateUri);
                    if (version == null)
                    {
                        // no existing version information so assume this is the first time using it with 1
                        entity.SetProperty(Constants.VersionPredicateUri, 1);
                    }
                    else
                    {
                        var intVersion = Convert.ToInt32(version);
                        // inc version
                        intVersion++;
                        entity.SetProperty(Constants.VersionPredicateUri, intVersion);
                        Preconditions.Add(new Triple
                        {
                            Graph     = VersionGraphUri,
                            DataType  = RdfDatatypes.Integer,
                            IsLiteral = true,
                            LangCode  = null,
                            Object    = version.ToString(),
                            Predicate = Constants.VersionPredicateUri,
                            Subject   = subject
                        });
                    }
                }
            }

            var deleteData = new StringWriter();
            var dw         = new BrightstarTripleSinkAdapter(new NQuadsWriter(deleteData));

            foreach (var triple in DeletePatterns.Items)
            {
                dw.Triple(triple);
            }
            deleteData.Close();

            var addData = new StringWriter();
            var aw      = new BrightstarTripleSinkAdapter(new NQuadsWriter(addData));

            foreach (var triple in AddTriples.Items)
            {
                aw.Triple(triple);
            }
            addData.Close();

            var preconditionsData = new StringWriter();
            var pw = new BrightstarTripleSinkAdapter(new NQuadsWriter(preconditionsData));

            foreach (var triple in Preconditions.Items)
            {
                pw.Triple(triple);
            }
            preconditionsData.Close();

            var nePreconditionsData = new StringWriter();
            var nw = new BrightstarTripleSinkAdapter(new NQuadsWriter(nePreconditionsData));

            foreach (var triple in NonExistencePreconditions.Items)
            {
                nw.Triple(triple);
            }
            nePreconditionsData.Close();

            var jobId = _serverCore.ProcessTransaction(_storeName, preconditionsData.ToString(),
                                                       nePreconditionsData.ToString(),
                                                       deleteData.ToString(), addData.ToString(), UpdateGraphUri);
            var status = _serverCore.GetJobStatus(_storeName, jobId.ToString());

            status.WaitEvent.WaitOne();
//            while (!(status.JobStatus == JobStatus.CompletedOk || status.JobStatus == JobStatus.TransactionError))
//            {
//                // wait for completion.
//#if !PORTABLE
//                Thread.Sleep(5);
//#endif
//                status = _serverCore.GetJobStatus(_storeName, jobId.ToString());
//            }

            if (status.JobStatus == JobStatus.TransactionError)
            {
                if (status.ExceptionDetail.Type.Equals(typeof(PreconditionFailedException).FullName))
                {
                    Preconditions.Clear();
                    throw TransactionPreconditionsFailedException.FromExceptionDetail(status.ExceptionDetail);
                }
                throw new BrightstarClientException(status.ExceptionDetail != null && !String.IsNullOrEmpty(status.ExceptionDetail.Message) ? status.ExceptionDetail.Message : "The transaction encountered an error");
            }
            if (status.JobStatus != JobStatus.CompletedOk)
            {
                throw new BrightstarClientException("Unexpected job status on completion: " + status.JobStatus + ". Last message was: " + status.Information);
            }

            // reset changes
            ResetTransactionData();
        }
        /// <summary>
        /// Commits all changes. Waits for the operation to complete.
        /// </summary>
        protected override void DoSaveChanges()
        {
            if (_optimisticLockingEnabled)
            {
                // get subject entity and see if there is a version triple
                var subjects = AddTriples.Select(x => x.Subject).Distinct().Union(DeletePatterns.Select(x => x.Subject).Distinct()).ToList();
                foreach (var subject in subjects)
                {
                    var entity = LookupDataObject(subject);
                    if (entity == null)
                    {
                        throw new BrightstarClientException("No Entity Found for Subject " + subject);
                    }

                    var version = entity.GetPropertyValue(Constants.VersionPredicateUri);
                    if (version == null)
                    {
                        // no existing version information so assume this is the first time using it with OL
                        entity.SetProperty(Constants.VersionPredicateUri, 1);
                    }
                    else
                    {
                        var intVersion = Convert.ToInt32(version);
                        // inc version
                        intVersion++;
                        entity.SetProperty(Constants.VersionPredicateUri, intVersion);
                        Preconditions.Add(new Triple
                        {
                            Graph     = Constants.DefaultGraphUri,
                            DataType  = RdfDatatypes.Integer,
                            IsLiteral = true,
                            LangCode  = null,
                            Object    = version.ToString(),
                            Predicate = Constants.VersionPredicateUri,
                            Subject   = subject
                        });
                    }
                }
            }

            var deleteData = new StringWriter();
            var dw         = new BrightstarTripleSinkAdapter(new NTriplesWriter(deleteData));

            foreach (var triple in DeletePatterns)
            {
                dw.Triple(triple);
            }
            deleteData.Close();

            var addData = new StringWriter();
            var aw      = new BrightstarTripleSinkAdapter(new NTriplesWriter(addData));

            foreach (var triple in AddTriples)
            {
                aw.Triple(triple);
            }
            addData.Close();

            var preconditionsData = new StringWriter();
            var pw = new BrightstarTripleSinkAdapter(new NTriplesWriter(preconditionsData));

            foreach (var triple in Preconditions)
            {
                pw.Triple(triple);
            }
            preconditionsData.Close();

            var jobId  = _serverCore.ProcessTransaction(_storeName, preconditionsData.ToString(), deleteData.ToString(), addData.ToString());
            var status = _serverCore.GetJobStatus(_storeName, jobId.ToString());

            while (!(status.JobStatus == JobStatus.CompletedOk || status.JobStatus == JobStatus.TransactionError))
            {
                // wait for completion.
                Thread.Sleep(5);
                status = _serverCore.GetJobStatus(_storeName, jobId.ToString());
            }

            if (status.JobStatus == JobStatus.TransactionError)
            {
                if (status.ExceptionDetail.Type.Equals(typeof(PreconditionFailedException).FullName))
                {
                    var failedTriples =
                        status.ExceptionDetail.Message.Substring(status.ExceptionDetail.Message.IndexOf("\n") + 1);
                    Preconditions.Clear();
                    throw new TransactionPreconditionsFailedException(failedTriples);
                }
                // todo: fix me and report inner exception
                throw new BrightstarClientException(status.ExceptionDetail != null ? status.ExceptionDetail.Message : "The transaction encountered an error");
            }

            // reset changes
            ResetTransactionData();
        }