internal MultipartWriter MultipartWriterForRev(RevisionInternal rev, string contentType) { var writer = new MultipartWriter(contentType, null); writer.SetNextPartHeaders(new Dictionary<string, string> { { "Content-Type", "application/json" } }); writer.AddData(rev.GetBody().AsJson()); var attachments = rev.GetAttachments(); if (attachments == null) { return writer; } foreach (var entry in attachments) { var attachment = entry.Value.AsDictionary<string, object>(); if (attachment != null && attachment.GetCast<bool>("follows", false)) { var disposition = String.Format("attachment; filename={0}", Quote(entry.Key)); writer.SetNextPartHeaders(new Dictionary<string, string> { { "Content-Disposition", disposition } }); Status status = new Status(); var attachObj = AttachmentForDict(attachment, entry.Key, status); if (attachObj == null) { return null; } var fileURL = attachObj.ContentUrl; if (fileURL != null) { writer.AddFileUrl(fileURL); } else { writer.AddStream(attachObj.ContentStream); } } } return writer; }
public RevisionInternal LoadRevisionBody(RevisionInternal rev, EnumSet<Database.TDContentOptions > contentOptions) { if (rev.GetBody() != null && contentOptions == EnumSet.NoneOf<Database.TDContentOptions >() && rev.GetSequence() != 0) { return rev; } System.Diagnostics.Debug.Assert(((rev.GetDocId() != null) && (rev.GetRevId() != null ))); Cursor cursor = null; Status result = new Status(Status.NotFound); try { // TODO: on ios this query is: // TODO: "SELECT sequence, json FROM revs WHERE doc_id=? AND revid=? LIMIT 1" string sql = "SELECT sequence, json FROM revs, docs WHERE revid=? AND docs.docid=? AND revs.doc_id=docs.doc_id LIMIT 1"; string[] args = new string[] { rev.GetRevId(), rev.GetDocId() }; cursor = database.RawQuery(sql, args); if (cursor.MoveToNext()) { result.SetCode(Status.Ok); rev.SetSequence(cursor.GetLong(0)); ExpandStoredJSONIntoRevisionWithAttachments(cursor.GetBlob(1), rev, contentOptions ); } } catch (SQLException e) { Log.E(Database.Tag, "Error loading revision body", e); throw new CouchbaseLiteException(Status.InternalServerError); } finally { if (cursor != null) { cursor.Close(); } } if (result.GetCode() == Status.NotFound) { throw new CouchbaseLiteException(result); } return rev; }
/// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception> internal RevisionInternal LoadRevisionBody(RevisionInternal rev, DocumentContentOptions contentOptions) { if (rev.GetBody() != null && contentOptions == DocumentContentOptions.None && rev.GetSequence() != 0) { return rev; } if ((rev.GetDocId() == null) || (rev.GetRevId() == null)) { Log.E(Database.Tag, "Error loading revision body"); throw new CouchbaseLiteException(StatusCode.PreconditionFailed); } Cursor cursor = null; var result = new Status(StatusCode.NotFound); try { // TODO: on ios this query is: // TODO: "SELECT sequence, json FROM revs WHERE doc_id=@ AND revid=@ LIMIT 1" var sql = "SELECT sequence, json FROM revs, docs WHERE revid=? AND docs.docid=? AND revs.doc_id=docs.doc_id LIMIT 1"; var args = new [] { rev.GetRevId(), rev.GetDocId() }; cursor = StorageEngine.RawQuery(sql, CommandBehavior.SequentialAccess, args); if (cursor.MoveToNext()) { result.SetCode(StatusCode.Ok); rev.SetSequence(cursor.GetLong(0)); ExpandStoredJSONIntoRevisionWithAttachments(cursor.GetBlob(1), rev, contentOptions); } } catch (SQLException e) { Log.E(Tag, "Error loading revision body", e); throw new CouchbaseLiteException(StatusCode.InternalServerError); } finally { if (cursor != null) { cursor.Close(); } } if (result.GetCode() == StatusCode.NotFound) { throw new CouchbaseLiteException(result.GetCode()); } return rev; }
//Doesn't handle CouchbaseLiteException internal RevisionInternal LoadRevisionBody(RevisionInternal rev) { if(!IsOpen) { Log.To.Database.W(TAG, "{0} LoadRevisionBody called on closed database, returning null...", this); return null; } if(rev.Sequence > 0) { if(rev.GetBody() != null) { return rev; } else if(rev.Missing) { throw Misc.CreateExceptionAndLog(Log.To.Database, StatusCode.NotFound, TAG, "Attempting to load the body of a compacted revision ({0} {1})", new SecureLogString(rev.DocID, LogMessageSensitivity.PotentiallyInsecure), rev.RevID); } } Debug.Assert(rev.DocID != null && rev.RevID != null); Storage.LoadRevisionBody(rev); return rev; }