示例#1
0
        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;
                    }
                }
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }