public IEnumerable <Document> GetRevisions(DocumentsOperationContext context, string key, int start, int take) { var table = context.Transaction.InnerTransaction.OpenTable(DocsSchema, RevisionDocuments); Slice prefixSlice; using (DocumentKeyWorker.GetSliceFromKey(context, key, out prefixSlice)) { // ReSharper disable once LoopCanBeConvertedToQuery foreach ( var sr in table.SeekForwardFrom(DocsSchema.Indexes[KeyAndEtagSlice], prefixSlice, startsWith: true) ) { foreach (var tvr in sr.Results) { if (start > 0) { start--; continue; } if (take-- <= 0) { yield break; } var document = TableValueToDocument(context, tvr); yield return(document); } if (take <= 0) { yield break; } } } }
public bool PutFromDocument(DocumentsOperationContext context, CollectionName collectionName, string key, long newEtagBigEndian, BlittableJsonReaderObject document) { var enableVersioning = false; BlittableJsonReaderObject metadata; if (document.TryGet(Constants.Metadata.Key, out metadata)) { bool disableVersioning; if (metadata.TryGet(Constants.Versioning.RavenDisableVersioning, out disableVersioning)) { DynamicJsonValue mutatedMetadata; Debug.Assert(metadata.Modifications == null); metadata.Modifications = mutatedMetadata = new DynamicJsonValue(metadata); mutatedMetadata.Remove(Constants.Versioning.RavenDisableVersioning); if (disableVersioning) { return(false); } } if (metadata.TryGet(Constants.Versioning.RavenEnableVersioning, out enableVersioning)) { DynamicJsonValue mutatedMetadata = metadata.Modifications; if (mutatedMetadata == null) { metadata.Modifications = mutatedMetadata = new DynamicJsonValue(metadata); } mutatedMetadata.Remove(Constants.Versioning.RavenEnableVersioning); } } var configuration = GetVersioningConfiguration(collectionName); if (enableVersioning == false && configuration.Active == false) { return(false); } var table = context.Transaction.InnerTransaction.OpenTable(DocsSchema, RevisionDocuments); Slice prefixSlice; using (DocumentKeyWorker.GetSliceFromKey(context, key, out prefixSlice)) { var revisionsCount = IncrementCountOfRevisions(context, prefixSlice, 1); DeleteOldRevisions(context, table, prefixSlice, configuration.MaxRevisions, revisionsCount); PutInternal(context, key, newEtagBigEndian, document, table); } return(true); }
private void PutInternal(DocumentsOperationContext context, string key, long newEtagBigEndian, BlittableJsonReaderObject document, Table table) { byte *lowerKey; int lowerSize; byte *keyPtr; int keySize; DocumentKeyWorker.GetLowerKeySliceAndStorageKey(context, key, out lowerKey, out lowerSize, out keyPtr, out keySize); byte recordSeperator = 30; var tbv = new TableValueBuilder { { lowerKey, lowerSize }, {&recordSeperator, sizeof(char) }, { (byte *)&newEtagBigEndian, sizeof(long) }, { keyPtr, keySize }, { document.BasePointer, document.Size } }; table.Insert(tbv); }