This is a base class that domain objects can inherit in order to get Id and Rev instance variables. You can also implement ICouchDocument yourself if you are not free to pick this class as your base. Some static methods to read and write CouchDB documents are also kept here. This class can also be used if you only need to retrieve id and revision from CouchDB. See sample subclasses to understand how to use this class.
Inheritance: ICouchDocument, IReconcilingDocument
示例#1
0
        /// <summary>
        /// This is a bulk key request, not to be confused with requests using complex keys, see Key().
        /// </summary>
        public CouchQuery Keys(object[] keys)
        {
            var bulk = new CouchBulkKeys(keys);

            Data(CouchDocument.WriteJson(bulk));
            return(this);
        }
示例#2
0
        /// <summary>
        /// This is a bulk key request, not to be confused with requests using complex keys, see Key().
        /// </summary>
        public CouchQuery Keys(IList <object> keys)
        {
            var bulk = new CouchBulkKeys(keys.ToArray());

            Data(CouchDocument.WriteJson(bulk));
            return(this);
        }
示例#3
0
        /// <summary>
        /// Create or update a list of ICouchDocuments in CouchDB. Uses POST and CouchDB will
        /// allocate new ids if the documents lack them.
        /// </summary>
        /// <param name="documents">List of documents to store.</param>
        /// <remarks>POST may be problematic in some environments.</remarks>
        public void SaveDocuments(IEnumerable <ICouchDocument> documents, bool allOrNothing)
        {
            var bulk = new CouchBulkDocuments(documents);

            try
            {
                var result = Request("_bulk_docs")
                             .Data(CouchDocument.WriteJson(bulk))
                             .Query("?all_or_nothing=" + allOrNothing.ToString().ToLower())
                             .PostJson()
                             .Parse <JArray>();

                int index = 0;
                foreach (var document in documents)
                {
                    document.Id  = (result[index])["id"].Value <string>();
                    document.Rev = (result[index])["rev"].Value <string>();
                    ++index;
                }
            }
            catch (WebException e)
            {
                throw CouchException.Create("Failed to create bulk documents", e);
            }
        }
示例#4
0
        public virtual void ReadJson(JObject obj)
        {
            ReadIdAndRev(this, obj);

            if (ReconcileBy != ReconcileStrategy.None)
            {
                sourceData = (CouchDocument)GetType().GetConstructor(Type.EmptyTypes).Invoke(new object[0]);

                // set this to prevent infinite recursion
                sourceData.ReconcileBy = ReconcileStrategy.None;
                sourceData.ReadJson(obj);
            }
        }
示例#5
0
 /// <summary>
 /// Create a given ICouchDocument in CouchDB. Uses POST and CouchDB will allocate a new id and overwrite any existing id.
 /// </summary>
 /// <param name="document">Document to store.</param>
 /// <returns>Document with Id and Rev set.</returns>
 /// <remarks>POST which may be problematic in some environments.</remarks>
 public ICouchDocument CreateDocument(ICouchDocument document)
 {
     try
     {
         JObject result = Request().Data(CouchDocument.WriteJson(document)).PostJson().Check("Failed to create document").Result();
         document.Id  = result["id"].Value <string>();
         document.Rev = result["rev"].Value <string>();
         return(document);
     }
     catch (WebException e)
     {
         throw CouchException.Create("Failed to create document", e);
     }
 }
示例#6
0
 public override void WriteJson(JsonWriter writer)
 {
     writer.WritePropertyName("docs");
     writer.WriteStartArray();
     foreach (ICouchDocument doc in Docs)
     {
         writer.WriteStartObject();
         CouchDocument.WriteIdAndRev(doc, writer);
         writer.WritePropertyName("_deleted");
         writer.WriteValue(true);
         writer.WriteEndObject();
     }
     writer.WriteEndArray();
 }
示例#7
0
        /// <summary>
        /// Write a CouchDocument or ICouchDocument, it may already exist in db and will then be overwritten.
        /// </summary>
        /// <param name="document">Couch document</param>
        /// <param name="batch">True if we don't want to wait for flush (commit).</param>
        /// <returns>Couch Document with new Rev set.</returns>
        /// <remarks>This relies on the document to already have an id.</remarks>
        public ICouchDocument WriteDocument(ICouchDocument document, bool batch)
        {
            if (document.Id == null)
            {
                throw CouchException.Create(
                          "Failed to write document using PUT because it lacks an id, use CreateDocument instead to let CouchDB generate an id");
            }
            JObject result =
                Request(document.Id).Query(batch ? "?batch=ok" : null).Data(CouchDocument.WriteJson(document)).Put().Check("Failed to write document").Result();

            document.Id  = result["id"].Value <string>(); // Not really needed
            document.Rev = result["rev"].Value <string>();

            return(document);
        }
示例#8
0
        public void SaveCommited()
        {
            switch (ReconcileBy)
            {
            case ReconcileStrategy.AutoMergeFields:
                sourceData = AutoClone();
                break;

            case ReconcileStrategy.ManualMergeFields:
                sourceData = Clone();
                break;
            }

            if (sourceData != null)
            {
                sourceData.ReconcileBy = ReconcileStrategy.None;
            }
        }
示例#9
0
 /// <summary>
 /// Delete documents in bulk fashion.
 /// </summary>
 public void DeleteDocuments(ICanJson bulk)
 {
     try
     {
         var result = Request("_bulk_docs").Data(CouchDocument.WriteJson(bulk)).PostJson().Parse <JArray>();
         for (int i = 0; i < result.Count(); i++)
         {
             //documents[i].id = (result[i])["id"].Value<string>();
             //documents[i].rev = (result[i])["rev"].Value<string>();
             if ((result[i])["error"] != null)
             {
                 throw CouchException.Create(string.Format(CultureInfo.InvariantCulture,
                                                           "Document with id {0} was not deleted: {1}: {2}",
                                                           (result[i])["id"].Value <string>(), (result[i])["error"], (result[i])["reason"]));
             }
         }
     }
     catch (WebException e)
     {
         throw CouchException.Create("Failed to bulk delete documents", e);
     }
 }
示例#10
0
        public void SaveCommited()
        {
            switch (ReconcileBy)
            {
                case ReconcileStrategy.AutoMergeFields:
                    sourceData = AutoClone();
                    break;
                case ReconcileStrategy.ManualMergeFields:
                    sourceData = Clone();
                    break;
            }

            if (sourceData != null)
                sourceData.ReconcileBy = ReconcileStrategy.None;
        }
示例#11
0
        public virtual void ReadJson(JObject obj)
        {
            ReadIdAndRev(this, obj);

            if (ReconcileBy != ReconcileStrategy.None)
            {
                sourceData = GetType().GetConstructor(Type.EmptyTypes).Invoke(new object[0]) as CouchDocument;

                // set this to prevent infinite recursion
                sourceData.ReconcileBy = ReconcileStrategy.None;
                sourceData.ReadJson(obj);
            }
        }
示例#12
0
        public IEnumerable <T> GetArbitraryDocuments <T>(IEnumerable <string> documentIds, Func <T> ctor)
        {
            var bulk = new CouchBulkKeys(documentIds.Cast <object>());

            return(QueryAllDocuments().Data(CouchDocument.WriteJson(bulk)).IncludeDocuments().GetResult().ArbitraryDocuments(ctor));
        }
示例#13
0
        public IEnumerable <T> GetDocuments <T>(IEnumerable <string> documentIds) where T : ICouchDocument, new()
        {
            var bulk = new CouchBulkKeys(documentIds.Cast <object>());

            return(QueryAllDocuments().Data(CouchDocument.WriteJson(bulk)).IncludeDocuments().GetResult().Documents <T>());
        }