Example #1
0
        static CountersStorage()
        {
            using (StorageEnvironment.GetStaticContext(out var ctx))
            {
                Slice.From(ctx, "AllCountersEtags", ByteStringType.Immutable, out AllCountersEtagSlice);
                Slice.From(ctx, "CollectionCountersEtags", ByteStringType.Immutable, out CollectionCountersEtagsSlice);
                Slice.From(ctx, "CounterKeys", ByteStringType.Immutable, out CounterKeysSlice);
                Slice.From(ctx, CountersTombstones, ByteStringType.Immutable, out CountersTombstonesSlice);
            }
            CountersSchema.DefineKey(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)CountersTable.CounterKey,
                Count      = 1,
                Name       = CounterKeysSlice,
                IsGlobal   = true,
            });

            CountersSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                StartIndex = (int)CountersTable.Etag,
                Name       = AllCountersEtagSlice,
                IsGlobal   = true
            });

            CountersSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                StartIndex = (int)CountersTable.Etag,
                Name       = CollectionCountersEtagsSlice
            });
        }
Example #2
0
 static RevisionsStorage()
 {
     using (StorageEnvironment.GetStaticContext(out var ctx))
     {
         Slice.From(ctx, "RevisionsChangeVector", ByteStringType.Immutable, out var changeVectorSlice);
         Slice.From(ctx, "RevisionsIdAndEtag", ByteStringType.Immutable, out IdAndEtagSlice);
         Slice.From(ctx, "DeleteRevisionEtag", ByteStringType.Immutable, out DeleteRevisionEtagSlice);
         Slice.From(ctx, "AllRevisionsEtags", ByteStringType.Immutable, out AllRevisionsEtagsSlice);
         Slice.From(ctx, "CollectionRevisionsEtags", ByteStringType.Immutable, out CollectionRevisionsEtagsSlice);
         Slice.From(ctx, "RevisionsCount", ByteStringType.Immutable, out RevisionsCountSlice);
         Slice.From(ctx, nameof(ResolvedFlagByEtagSlice), ByteStringType.Immutable, out ResolvedFlagByEtagSlice);
         Slice.From(ctx, RevisionsTombstones, ByteStringType.Immutable, out RevisionsTombstonesSlice);
         Slice.From(ctx, CollectionName.GetTablePrefix(CollectionTableType.Revisions), ByteStringType.Immutable, out RevisionsPrefix);
         RevisionsSchema.DefineKey(new TableSchema.SchemaIndexDef
         {
             StartIndex = (int)RevisionsTable.ChangeVector,
             Count      = 1,
             Name       = changeVectorSlice,
             IsGlobal   = true
         });
         RevisionsSchema.DefineIndex(new TableSchema.SchemaIndexDef
         {
             StartIndex = (int)RevisionsTable.LowerId,
             Count      = 3,
             Name       = IdAndEtagSlice,
             IsGlobal   = true
         });
         RevisionsSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
         {
             StartIndex = (int)RevisionsTable.Etag,
             Name       = AllRevisionsEtagsSlice,
             IsGlobal   = true
         });
         RevisionsSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
         {
             StartIndex = (int)RevisionsTable.Etag,
             Name       = CollectionRevisionsEtagsSlice
         });
         RevisionsSchema.DefineIndex(new TableSchema.SchemaIndexDef
         {
             StartIndex = (int)RevisionsTable.DeletedEtag,
             Count      = 1,
             Name       = DeleteRevisionEtagSlice,
             IsGlobal   = true
         });
         RevisionsSchema.DefineIndex(new TableSchema.SchemaIndexDef
         {
             StartIndex = (int)RevisionsTable.Resolved,
             Count      = 2,
             Name       = ResolvedFlagByEtagSlice,
             IsGlobal   = true
         });
     }
 }
Example #3
0
        static RevisionsStorage()
        {
            Slice.From(StorageEnvironment.LabelsContext, "RevisionsChangeVector", ByteStringType.Immutable, out var changeVectorSlice);
            Slice.From(StorageEnvironment.LabelsContext, "RevisionsIdAndEtag", ByteStringType.Immutable, out IdAndEtagSlice);
            Slice.From(StorageEnvironment.LabelsContext, "RevisionsFlagsAndEtag", ByteStringType.Immutable, out FlagsAndEtagSlice);
            Slice.From(StorageEnvironment.LabelsContext, "AllRevisionsEtags", ByteStringType.Immutable, out AllRevisionsEtagsSlice);
            Slice.From(StorageEnvironment.LabelsContext, "CollectionRevisionsEtags", ByteStringType.Immutable, out CollectionRevisionsEtagsSlice);
            Slice.From(StorageEnvironment.LabelsContext, "RevisionsCount", ByteStringType.Immutable, out RevisionsCountSlice);
            Slice.From(StorageEnvironment.LabelsContext, RevisionsTombstones, ByteStringType.Immutable, out RevisionsTombstonesSlice);
            var deleteRevision = DocumentFlags.DeleteRevision;

            Slice.From(StorageEnvironment.LabelsContext, (byte *)&deleteRevision, sizeof(DocumentFlags), ByteStringType.Immutable, out DeleteRevisionSlice);

            DocsSchema = new TableSchema()
            {
                TableType = (byte)TableType.Revisions
            };

            DocsSchema.DefineKey(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)Columns.ChangeVector,
                Count      = 1,
                Name       = changeVectorSlice,
                IsGlobal   = true
            });
            DocsSchema.DefineIndex(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)Columns.LowerId,
                Count      = 3,
                Name       = IdAndEtagSlice,
                IsGlobal   = true
            });
            DocsSchema.DefineIndex(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)Columns.Flags,
                Count      = 2,
                Name       = FlagsAndEtagSlice,
                IsGlobal   = true
            });
            DocsSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                StartIndex = (int)Columns.Etag,
                Name       = AllRevisionsEtagsSlice,
                IsGlobal   = true
            });
            DocsSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                StartIndex = (int)Columns.Etag,
                Name       = CollectionRevisionsEtagsSlice
            });
        }
Example #4
0
        static ConflictsStorage()
        {
            using (StorageEnvironment.GetStaticContext(out var ctx))
            {
                Slice.From(ctx, "ChangeVector", ByteStringType.Immutable, out ChangeVectorSlice);
                Slice.From(ctx, "ConflictsId", ByteStringType.Immutable, out ConflictsIdSlice);
                Slice.From(ctx, "IdAndChangeVector", ByteStringType.Immutable, out IdAndChangeVectorSlice);
                Slice.From(ctx, "AllConflictedDocsEtags", ByteStringType.Immutable, out AllConflictedDocsEtagsSlice);
                Slice.From(ctx, "ConflictedCollection", ByteStringType.Immutable, out ConflictedCollectionSlice);
                Slice.From(ctx, "Conflicts", ByteStringType.Immutable, out ConflictsSlice);
            }

            /*
             * The structure of conflicts table starts with the following fields:
             * [ Conflicted Doc Id | Separator | Change Vector | ... the rest of fields ... ]
             * PK of the conflicts table will be 'Change Vector' field, because when dealing with conflicts,
             * the change vectors will always be different, hence the uniqueness of the ID. (inserts/updates will not overwrite)
             *
             * Additional index is set to have composite ID of 'Conflicted Doc Id' and 'Change Vector' so we will be able to iterate
             * on conflicts by conflicted doc id (using 'starts with')
             *
             * We need a separator in order to delete all conflicts all "users/1" without deleting "users/11" conflicts.
             */

            ConflictsSchema.DefineKey(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)ConflictsTable.ChangeVector,
                Count      = 1,
                IsGlobal   = false,
                Name       = ChangeVectorSlice
            });
            // required to get conflicts by ID
            ConflictsSchema.DefineIndex(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)ConflictsTable.LowerId,
                Count      = 3,
                IsGlobal   = false,
                Name       = IdAndChangeVectorSlice
            });
            ConflictsSchema.DefineIndex(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)ConflictsTable.LowerId,
                Count      = 1,
                IsGlobal   = true,
                Name       = ConflictsIdSlice
            });
            ConflictsSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                StartIndex = (int)ConflictsTable.Etag,
                IsGlobal   = true,
                Name       = AllConflictedDocsEtagsSlice
            });
            ConflictsSchema.DefineIndex(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)ConflictsTable.Collection,
                Count      = 1,
                IsGlobal   = true,
                Name       = ConflictedCollectionSlice
            });
        }
Example #5
0
        static RachisLogHistory()
        {
            using (StorageEnvironment.GetStaticContext(out var ctx))
            {
                Slice.From(ctx, "LogHistory", out LogHistorySlice);
                Slice.From(ctx, "LogHistoryIndex", out LogHistoryIndexSlice);
                Slice.From(ctx, "LogHistoryDateTime", out LogHistoryDateTimeSlice);
            }

            LogHistoryTable = new TableSchema();
            LogHistoryTable.DefineKey(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)LogHistoryColumn.Guid,
            });

            LogHistoryTable.DefineIndex(new TableSchema.SchemaIndexDef
            {
                Name       = LogHistoryIndexSlice,
                StartIndex = (int)LogHistoryColumn.Index,
                Count      = 1
            });

            LogHistoryTable.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                Name       = LogHistoryDateTimeSlice,
                StartIndex = (int)LogHistoryColumn.Ticks
            });
        }
Example #6
0
        public void ErrorsOnInvalidSchemaWithSingleFixedIndex()
        {
            using (var tx = Env.WriteTransaction())
            {
                var expectedSchema = new TableSchema();

                var def = new TableSchema.FixedSizeSchemaIndexDef
                {
                    StartIndex = 2,
                };
                Slice.From(tx.Allocator, "Test Name", ByteStringType.Immutable, out def.Name);

                expectedSchema.DefineFixedSizeIndex(def);

                var actualSchema = new TableSchema();

                def = new TableSchema.FixedSizeSchemaIndexDef
                {
                    StartIndex = 4,
                };
                Slice.From(tx.Allocator, "Bad Test Name", ByteStringType.Immutable, out def.Name);
                actualSchema.DefineFixedSizeIndex(def);


                Assert.Throws <ArgumentNullException>(delegate { expectedSchema.Validate(null); });
                Assert.Throws <ArgumentException>(delegate { expectedSchema.Validate(actualSchema); });
            }
        }
        static IndexesEtagsStorage()
        {
            Slice.From(StorageEnvironment.LabelsContext, "EtagIndexName", out EtagIndexName);
            Slice.From(StorageEnvironment.LabelsContext, "NameAndEtagIndexName", out NameAndEtagIndexName);

            // Table schema is:
            //  - index id - int (-1 if tombstone)
            //  - etag - long
            //  - name - string, lowercase
            //  - type - enum (index / transformer)
            //  - change vector
            //  - is conflicted - boolean
            //(is conflicted --> a flag, so we will not have to read another table in voron just to check if the index/transformer is conlficted)
            IndexesTableSchema = new TableSchema();

            IndexesTableSchema.DefineKey(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)MetadataFields.Name,
                Count      = 1
            });

            IndexesTableSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                StartIndex = (int)MetadataFields.Etag,
                Name       = EtagIndexName
            });

            //Table schema is:
            //  - name -> string, lowercase
            //  - etag -> long
            //  - type -> enum (index / transformer)
            //  - change vector
            //  - definition of conflicted index/transformer (blittable json)
            ConflictsTableSchema = new TableSchema();
            ConflictsTableSchema.DefineKey(new TableSchema.SchemaIndexDef
            {
                StartIndex = 1
            });

            ConflictsTableSchema.DefineIndex(new TableSchema.SchemaIndexDef
            {
                StartIndex = (int)ConflictFields.Name,
                Count      = 2,
                Name       = NameAndEtagIndexName
            });
        }
Example #8
0
        static ServerStore()
        {
            Slice.From(StorageEnvironment.LabelsContext, "EtagIndexName", out EtagIndexName);

            _itemsSchema = new TableSchema();

            // We use the follow format for the items data
            // { lowered key, key, data, etag }
            _itemsSchema.DefineKey(new TableSchema.SchemaIndexDef
            {
                StartIndex = 0,
                Count      = 0
            });

            _itemsSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
            {
                Name       = EtagIndexName,
                IsGlobal   = true,
                StartIndex = 3
            });
        }
Example #9
0
 static VersioningStorage()
 {
     Slice.From(StorageEnvironment.LabelsContext, "KeyAndEtag", ByteStringType.Immutable, out KeyAndEtagSlice);
     Slice.From(StorageEnvironment.LabelsContext, "Etag", ByteStringType.Immutable, out EtagSlice);
     // The documents schema is as follows
     // 5 fields (lowered key, recored separator, etag, lazy string key, document)
     // We are you using the record separator in order to avoid loading another documents that has the same key prefix,
     //      e.g. fitz(record-separator)01234567 and fitz0(record-separator)01234567, without the record separator we would have to load also fitz0 and filter it.
     // format of lazy string key is detailed in GetLowerKeySliceAndStorageKey
     DocsSchema = new TableSchema();
     DocsSchema.DefineIndex(new TableSchema.SchemaIndexDef
     {
         StartIndex = 0,
         Count      = 3,
         Name       = KeyAndEtagSlice
     });
     DocsSchema.DefineFixedSizeIndex(new TableSchema.FixedSizeSchemaIndexDef
     {
         StartIndex = 2,
         Name       = EtagSlice
     });
 }