private TableMetadata ReadTableMetadata(ref SequenceReader <byte> reader)
        {
            var numericColumnCount = ColumnTypes.Count(c => IsNumberColumn((ColumnType)c));

            var metadata = new TableMetadata();

            while (reader.Remaining > 0)
            {
                reader.TryRead(out byte filedTypeCode);

                var fieldType = (MetadataFieldType)filedTypeCode;
                var length    = reader.ReadLengthEncodedInteger();

                var subReader = new SequenceReader <byte>(reader.Sequence.Slice(reader.Consumed, length));

                try
                {
                    ReadMetadataField(ref subReader, fieldType, metadata, numericColumnCount);
                }
                finally
                {
                    reader.Advance(length);
                }
            }

            return(metadata);
        }
        private TableMetadata ReadTableMetadata(ref SequenceReader <byte> reader)
        {
            var numericColumnCount = ColumnTypes.Count(c => IsNumberColumn((ColumnType)c));

            var metadata = new TableMetadata();

            while (reader.Remaining > 0)
            {
                reader.TryRead(out byte filedTypeCode);

                var fieldType = (MetadataFieldType)filedTypeCode;

                switch (fieldType)
                {
                case MetadataFieldType.SIGNEDNESS:
                    metadata.Signedness = reader.ReadBitArray(numericColumnCount);
                    break;

                case MetadataFieldType.DEFAULT_CHARSET:
                    metadata.DefaultCharset = ReadDefaultCharset(ref reader);
                    break;

                case MetadataFieldType.COLUMN_CHARSET:
                    metadata.ColumnCharsets = ReadIntegers(ref reader);
                    break;

                case MetadataFieldType.COLUMN_NAME:
                    metadata.ColumnNames = ReadStringList(ref reader);
                    break;

                case MetadataFieldType.SET_STR_VALUE:
                    metadata.SetStrValues = ReadTypeValues(ref reader);
                    break;

                case MetadataFieldType.ENUM_STR_VALUE:
                    metadata.EnumStrValues = ReadTypeValues(ref reader);
                    break;

                case MetadataFieldType.GEOMETRY_TYPE:
                    metadata.GeometryTypes = ReadIntegers(ref reader);
                    break;

                case MetadataFieldType.SIMPLE_PRIMARY_KEY:
                    metadata.SimplePrimaryKeys = ReadIntegers(ref reader);
                    break;

                case MetadataFieldType.PRIMARY_KEY_WITH_PREFIX:
                    metadata.PrimaryKeysWithPrefix = ReadIntegerDictionary(ref reader);
                    break;

                case MetadataFieldType.ENUM_AND_SET_DEFAULT_CHARSET:
                    metadata.EnumAndSetDefaultCharset = ReadDefaultCharset(ref reader);
                    break;

                case MetadataFieldType.ENUM_AND_SET_COLUMN_CHARSET:
                    metadata.EnumAndSetColumnCharsets = ReadIntegers(ref reader);
                    break;

                default:
                    throw new Exception("Unsupported table metadata field type: " + fieldType);
                }
            }

            return(metadata);
        }