Beispiel #1
0
 private void SetData(Keyword keyword, object value)
 {
     // The Uncompressed bit is also the sign bit (bit 63)
     if (Flags < 0) // Same as (Flags & MPSchemaFlags.UncompressedBit)!=0
     {
         // Uncompressed data
         Flags |= (SchemaFlags)(1L << (int)keyword);
         (data as object[])[(int)keyword] = value;
     }
     else
     {
         // Compressed data
         int index = GetIndex(keyword);
         if (index >= 0)
         {
             (data as object[])[index] = value;
         }
         else if (index == -1)
         {
             data = value;
         }
         else
         {
             throw new InvalidOperationException("No space allocated");
         }
     }
 }
Beispiel #2
0
        public ISchemaGraphBuilder Delete(ITableConfig table, SchemaFlags flags)
        {
            var tables    = default(HashSet <ITableConfig>);
            var indexes   = default(HashSet <IIndexConfig>);
            var relations = default(HashSet <IRelationConfig>);

            this.GetSchema(table, out tables, out indexes, out relations, flags);
            return(this.OnDelete(tables, indexes, relations, flags));
        }
        private bool ValidateGeneric(Subschema schema, object instance)
        {
            bool finalResult = true;

            for (SchemaFlags mask = schema.Flags & (SchemaFlags.GenericProperties & SchemaFlags.AllProperties);
                 mask != 0;
                 mask = (SchemaFlags)RemoveLowestBit((long)mask))
            {
                Keyword keyword = (Keyword)IndexOfLowestBit((long)mask);

                bool?       result = null;
                Subschema[] schemaArray;
                int         index;
                switch (keyword)
                {
                case Keyword.If:
                    int level = TurnOffErrors();
                    result = Validate(schema.If, instance, Keyword.If);
                    RestoreSuppressionLevel(level);

                    result = result == true
                            ? Validate(schema.Then, instance, Keyword.Then)
                            : Validate(schema.Else, instance, Keyword.Else);

                    break;

                case Keyword.Not:
                    level  = TurnOffErrors();
                    result = !Validate(schema.Not, instance, Keyword.Not);
                    RestoreSuppressionLevel(level);
                    break;

                case Keyword.AllOf:
                    result      = true;
                    schemaArray = schema.AllOf;
                    SchemaPointer.Push(keyword);
                    for (index = 0; index < schemaArray.Length; index++)
                    {
                        if (!Validate(schemaArray[index], instance, index))
                        {
                            finalResult = false;
                            if (!IsRecordingErrors)
                            {
                                break;
                            }
                        }
                    }
                    SchemaPointer.Pop();
                    break;

                case Keyword.AnyOf:
                    result      = false;
                    level       = TurnOffErrors();
                    schemaArray = schema.AnyOf;
                    SchemaPointer.Push(keyword);
                    for (index = 0; index < schemaArray.Length; index++)
                    {
                        if (Validate(schemaArray[index], instance, index))
                        {
                            result = true;
                            break;
                        }
                    }
                    SchemaPointer.Pop();
                    RestoreSuppressionLevel(level);
                    break;

                case Keyword.OneOf:
                    result      = false;
                    level       = TurnOffErrors();
                    schemaArray = schema.OneOf;
                    SchemaPointer.Push(keyword);
                    for (index = 0; index < schemaArray.Length; index++)
                    {
                        if (Validate(schemaArray[index], instance, index))
                        {
                            result = !result;
                            if (result == false)
                            {
                                break;
                            }
                        }
                    }
                    SchemaPointer.Pop();
                    RestoreSuppressionLevel(level);
                    break;

                case Keyword.Enum:
                    result = false;
                    // TODO: Provide support for type coercion
                    foreach (object v in (object[])schema.Enum.Value)
                    {
                        if (MPJson.Matches(v, instance))
                        {
                            result = true;
                            break;
                        }
                    }
                    break;

                case Keyword.Const:
                    // TODO: Provide support for string to value coercion
                    result = MPJson.Matches(schema.Const.Value, instance);
                    break;

                case Keyword._Ref:
                    var r = schema.Ref;
                    if (r.Version != 0)
                    {
                        var draft = new MPSchema(MPJson.From(instance), r.Version);
                        result = draft.IsValid;
                        break;     // This was checked on creation
                    }

                    var rSchema = r.Schema;
                    result = rSchema != null && ReferenceUsageIsControlled();
                    if (result == true && !Validate(rSchema, instance, Keyword._Ref))
                    {
                        finalResult = false;
                    }
                    break;

                case Keyword.Metadata:
                    break;
                }

                if (result == false)
                {
                    finalResult = false;
                    if (ReportError(keyword, schema, instance))
                    {
                        return(false);
                    }
                }
            }

            return(finalResult);
        }
 internal static TypeFlags SchemaFlagsToTypeFlags(SchemaFlags flags)
 {
     return((TypeFlags)((long)(flags & SchemaFlags.TypeAll) >> 56));
 }
Beispiel #5
0
        public ISchemaGraphBuilder Update(ITableConfig leftTable, ITableConfig rightTable, SchemaFlags flags)
        {
            var builder = this.Build();

            builder.Alter.SetLeftTable(leftTable);
            builder.Alter.SetRightTable(rightTable);
            return(builder);
        }
Beispiel #6
0
        protected virtual ISchemaGraphBuilder OnAdd(IEnumerable <ITableConfig> tables, IEnumerable <IIndexConfig> indexes, IEnumerable <IRelationConfig> relations, SchemaFlags flags)
        {
            var queries = new List <ISchemaGraphBuilder>();

            if (flags.HasFlag(SchemaFlags.Table))
            {
                queries.Add(this.OnAddTables(tables));
            }
            if (flags.HasFlag(SchemaFlags.Index))
            {
                queries.Add(this.OnAddIndexes(indexes));
            }
            if (flags.HasFlag(SchemaFlags.Relation))
            {
                queries.Add(this.OnAddRelations(relations));
            }
            return(new AggregateSchemaGraphBuilder(
                       this.Database,
                       queries
                       ));
        }
Beispiel #7
0
 protected virtual void GetSchema(ITableConfig table, out HashSet <ITableConfig> tables, out HashSet <IIndexConfig> indexes, out HashSet <IRelationConfig> relations, SchemaFlags flags)
 {
     tables    = new HashSet <ITableConfig>();
     indexes   = new HashSet <IIndexConfig>();
     relations = new HashSet <IRelationConfig>();
     if (flags.HasFlag(SchemaFlags.Recursive))
     {
         var queue = new Queue <ITableConfig>();
         queue.Enqueue(table);
         while (queue.Count > 0)
         {
             table = queue.Dequeue();
             if (!tables.Add(table))
             {
                 continue;
             }
             foreach (var index in table.Indexes)
             {
                 indexes.Add(index);
             }
             foreach (var relation in table.Relations)
             {
                 relations.Add(relation);
                 if (relation.MappingTable != null && !relation.MappingTable.Flags.HasFlag(TableFlags.Shared))
                 {
                     queue.Enqueue(relation.MappingTable);
                 }
                 if (relation.RightTable != null && !relation.RightTable.Flags.HasFlag(TableFlags.Shared))
                 {
                     queue.Enqueue(relation.RightTable);
                 }
             }
         }
     }
     else
     {
         tables.Add(table);
         indexes.AddRange(table.Indexes);
         relations.AddRange(table.Relations);
     }
 }