/// <summary>
        /// Reads a single value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>Single value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static float ReadSingle(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.Boolean: return(Reader.ReadBoolean() ? (float)1 : (float)0);

            case BsonType.Decimal128: return((float)Reader.ReadDecimal128());

            case BsonType.Double: return((float)Reader.ReadDouble());

            case BsonType.Int32: return((float)Reader.ReadInt32());

            case BsonType.Int64: return((float)Reader.ReadInt64());

            case BsonType.String: return(float.Parse(Reader.ReadString()));

            case BsonType.MinKey: Reader.ReadMinKey(); return(float.MinValue);

            case BsonType.MaxKey: Reader.ReadMaxKey(); return(float.MaxValue);

            default:
                throw new ArgumentException("Expected a single value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
        /// <summary>
        /// Reads a string value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>String value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static string ReadString(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.Boolean: return(Reader.ReadBoolean().ToString());

            case BsonType.DateTime: return(ObjectSerializer.UnixEpoch.AddMilliseconds(Reader.ReadDateTime()).ToString());

            case BsonType.Decimal128: return(Reader.ReadDecimal128().ToString());

            case BsonType.Double: return(Reader.ReadDouble().ToString());

            case BsonType.Int32: return(Reader.ReadInt32().ToString());

            case BsonType.Int64: return(Reader.ReadInt64().ToString());

            case BsonType.JavaScript: return(Reader.ReadJavaScript());

            case BsonType.JavaScriptWithScope: return(Reader.ReadJavaScriptWithScope());

            case BsonType.Null: Reader.ReadNull(); return(null);

            case BsonType.ObjectId: return(Reader.ReadObjectId().ToString());

            case BsonType.String: return(Reader.ReadString());

            case BsonType.Symbol: return(Reader.ReadSymbol());

            default:
                throw new ArgumentException("Expected a char value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
        /// <summary>
        /// Reads a char value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>Char value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static char ReadChar(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.Decimal128: return((char)Reader.ReadDecimal128());

            case BsonType.Double: return((char)Reader.ReadDouble());

            case BsonType.Int32: return((char)Reader.ReadInt32());

            case BsonType.Int64: return((char)Reader.ReadInt64());

            case BsonType.MinKey: Reader.ReadMinKey(); return(char.MinValue);

            case BsonType.MaxKey: Reader.ReadMaxKey(); return(char.MaxValue);

            case BsonType.String:
                string s = Reader.ReadString();
                return(string.IsNullOrEmpty(s) ? (char)0 : s[0]);

            default:
                throw new ArgumentException("Expected a char value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
        /// <summary>
        /// Reads a 64-bit unsigned integer value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>64-bit unsigned integer value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static ulong ReadUInt64(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.Boolean: return(Reader.ReadBoolean() ? (ulong)1 : (ulong)0);

            case BsonType.Decimal128: return((ulong)Reader.ReadDecimal128());

            case BsonType.Double: return((ulong)Reader.ReadDouble());

            case BsonType.Int32: return((ulong)Reader.ReadInt32());

            case BsonType.Int64: return((ulong)Reader.ReadInt64());

            case BsonType.String: return(ulong.Parse(Reader.ReadString()));

            case BsonType.MinKey: Reader.ReadMinKey(); return(ulong.MinValue);

            case BsonType.MaxKey: Reader.ReadMaxKey(); return(ulong.MaxValue);

            default:
                throw new ArgumentException("Expected a 64-bit unsigned integer value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
        /// <summary>
        /// Reads a GUID value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>Guid value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static Guid ReadGuid(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.String: return(Guid.Parse(Reader.ReadString()));

            default:
                throw new ArgumentException("Expected a GUID value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
예제 #6
0
        /// <summary>
        /// TypeOf ($type)
        /// </summary>
        /// <param name="type">Bson Type</param>
        public static IQuery TypeOf(BsonType type)
        {
            var bsonTypeName = type.ToString();

            bsonTypeName = char.ToLower(bsonTypeName[0]) + bsonTypeName.Substring(1);

            return(new Query
            {
                Operator = MongoOperator.TypeOf,
                Value = new QueryValue <string>(bsonTypeName)
            });
        }
        /// <summary>
        /// Reads a string value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>String value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static byte[] ReadByteArray(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.Binary: return(Reader.ReadBinaryData().Bytes);

            case BsonType.Null: Reader.ReadNull(); return(null);

            default:
                throw new ArgumentException("Expected a byte array value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
        /// <summary>
        /// Reads a time span value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>TimeSpan value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static TimeSpan ReadTimeSpan(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.String: return(TimeSpan.Parse(Reader.ReadString()));

            case BsonType.MinKey: Reader.ReadMinKey(); return(TimeSpan.MinValue);

            case BsonType.MaxKey: Reader.ReadMaxKey(); return(TimeSpan.MaxValue);

            default:
                throw new ArgumentException("Expected a time span value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
        /// <summary>
        /// Reads a date &amp; time value with offset.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>DateTimeOffset value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static DateTimeOffset ReadDateTimeOffset(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.DateTime: return((DateTimeOffset)ObjectSerializer.UnixEpoch.AddMilliseconds(Reader.ReadDateTime()));

            case BsonType.String: return(DateTimeOffset.Parse(Reader.ReadString()));

            case BsonType.Document:
                DateTime TP = DateTime.MinValue;
                TimeSpan TZ = TimeSpan.Zero;

                Reader.ReadStartDocument();

                while (Reader.State == BsonReaderState.Type)
                {
                    BsonType BsonType = Reader.ReadBsonType();
                    if (BsonType == BsonType.EndOfDocument)
                    {
                        break;
                    }

                    string FieldName = Reader.ReadName();
                    switch (FieldName)
                    {
                    case "tp":
                        TP = ObjectSerializer.UnixEpoch.AddMilliseconds(Reader.ReadDateTime());
                        break;

                    case "tz":
                        TZ = TimeSpan.Parse(Reader.ReadString());
                        break;
                    }
                }

                Reader.ReadEndDocument();

                return(new DateTimeOffset(TP, TZ));

            case BsonType.MinKey: Reader.ReadMinKey(); return(DateTimeOffset.MinValue);

            case BsonType.MaxKey: Reader.ReadMaxKey(); return(DateTimeOffset.MaxValue);

            default:
                throw new ArgumentException("Expected a date & time value with offset, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
예제 #10
0
        private static BsonValue CastTo(BsonType bsonType, int value)
        {
            switch (bsonType)
            {
            case BsonType.Int32: return((int)0);

            case BsonType.Int64: return((long)0);

            case BsonType.Double: return((double)0);

            case BsonType.Decimal128: return((decimal)0);

            default:
                throw new InMemoryDatabaseException($"Unable to cast {bsonType.ToString()} to a number");
            }
        }
        /// <summary>
        /// Reads a date &amp; time value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>DateTime value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static DateTime ReadDateTime(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.DateTime: return(ObjectSerializer.UnixEpoch.AddMilliseconds(Reader.ReadDateTime()));

            case BsonType.String: return(DateTime.Parse(Reader.ReadString()));

            case BsonType.MinKey: Reader.ReadMinKey(); return(DateTime.MinValue);

            case BsonType.MaxKey: Reader.ReadMaxKey(); return(DateTime.MaxValue);

            default:
                throw new ArgumentException("Expected a date & time value, but was a " +
                                            FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
        /// <summary>
        /// Reads a boolean value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <returns>Boolean value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static bool ReadBoolean(IBsonReader Reader, BsonType FieldDataType)
        {
            switch (FieldDataType)
            {
            case BsonType.Boolean: return(Reader.ReadBoolean());

            case BsonType.Decimal128: return(Reader.ReadDecimal128() != 0);

            case BsonType.Double: return(Reader.ReadDouble() != 0);

            case BsonType.Int32: return(Reader.ReadInt32() != 0);

            case BsonType.Int64: return(Reader.ReadInt64() != 0);

            case BsonType.MinKey: Reader.ReadMinKey(); return(false);

            case BsonType.MaxKey: Reader.ReadMaxKey(); return(true);

            default:
                throw new ArgumentException("Expected a boolean value, but was a " + FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
예제 #13
0
        public static bool TryConvertStringToBsonType(BsonType type, string value, out BsonValue bsonValue)
        {
            switch (type)
            {
                case BsonType.Binary:
                    try
                    {
                        bsonValue = BsonBinaryData.Create(Convert.FromBase64String(value));
                        return true;
                    }
                    catch
                    {
                        bsonValue = null;
                        return false;
                    }
                case BsonType.Boolean:
                    {
                        bool parsed;
                        if (bool.TryParse(value, out parsed))
                        {
                            bsonValue = BsonBoolean.Create(parsed);
                            return true;
                        }
                        bsonValue = null;
                        return false;
                    }
                case BsonType.DateTime:
                    {
                        DateTime parsed;
                        if (DateTime.TryParse(value, out parsed))
                        {
                            bsonValue = BsonDateTime.Create(parsed);
                            return true;
                        }
                        bsonValue = null;
                        return false;
                    }
                case BsonType.Double:
                    {
                        double parsed;
                        if (double.TryParse(value, out parsed))
                        {
                            bsonValue = BsonDouble.Create(parsed);
                            return true;
                        }
                        bsonValue = null;
                        return false;
                    }
                case BsonType.Int32:
                    {
                        Int32 parsed;
                        if (Int32.TryParse(value, out parsed))
                        {
                            bsonValue = BsonInt32.Create(parsed);
                            return true;
                        }
                        bsonValue = null;
                        return false;
                    }
                case BsonType.Int64:
                    {
                        Int64 parsed;
                        if (Int64.TryParse(value, out parsed))
                        {
                            bsonValue = BsonInt64.Create(parsed);
                            return true;
                        }
                        bsonValue = null;
                        return false;
                    }
                case BsonType.Null:
                    {
                        bsonValue = BsonNull.Value;
                        return true;
                    }
                case BsonType.ObjectId:
                    try
                    {
                        bsonValue = BsonObjectId.Create(value);
                        return true;
                    }
                    catch
                    {
                        bsonValue = null;
                        return false;
                    }
                case BsonType.String:
                    bsonValue = BsonString.Create(value);
                    return true;
                // TimeStamp?
            }

            throw new ArgumentOutOfRangeException(string.Format("Conversion to BsonType.{0} not supported", type.ToString()), "type");
        }
        /// <summary>
        /// Reads a nullable enum stored as a nullable 32-bit integer value.
        /// </summary>
        /// <param name="Reader">Binary reader.</param>
        /// <param name="FieldDataType">Field data type.</param>
        /// <param name="EnumType">Enumeration type.</param>
        /// <returns>Nullable enumeration value.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="FieldDataType"/> was invalid.</exception>
        public static object ReadNullableEnum(IBsonReader Reader, BsonType FieldDataType, Type EnumType)
        {
            switch (FieldDataType)
            {
            case BsonType.Int32: return(Enum.ToObject(EnumType, ReadInt32(Reader, FieldDataType)));

            case BsonType.Int64: return(Enum.ToObject(EnumType, ReadInt64(Reader, FieldDataType)));

            case BsonType.String: return(Enum.Parse(EnumType, Reader.ReadString()));

            case BsonType.Null: Reader.ReadNull(); return(null);

            default:
                throw new ArgumentException("Expected an enumerated value, but was a " + FieldDataType.ToString() + ".", nameof(FieldDataType));
            }
        }
예제 #15
0
        // Token: 0x060015D3 RID: 5587 RVA: 0x00072C00 File Offset: 0x00070E00
        private void ReadType(BsonType type)
        {
            switch (type)
            {
            case BsonType.Number:
            {
                double num = this.ReadDouble();
                if (this._floatParseHandling == FloatParseHandling.Decimal)
                {
                    base.SetToken(JsonToken.Float, Convert.ToDecimal(num, CultureInfo.InvariantCulture));
                    return;
                }
                base.SetToken(JsonToken.Float, num);
                return;
            }

            case BsonType.String:
            case BsonType.Symbol:
                base.SetToken(JsonToken.String, this.ReadLengthString());
                return;

            case BsonType.Object:
            {
                base.SetToken(JsonToken.StartObject);
                BsonReader.ContainerContext containerContext = new BsonReader.ContainerContext(BsonType.Object);
                this.PushContext(containerContext);
                containerContext.Length = this.ReadInt32();
                return;
            }

            case BsonType.Array:
            {
                base.SetToken(JsonToken.StartArray);
                BsonReader.ContainerContext containerContext2 = new BsonReader.ContainerContext(BsonType.Array);
                this.PushContext(containerContext2);
                containerContext2.Length = this.ReadInt32();
                return;
            }

            case BsonType.Binary:
            {
                BsonBinaryType bsonBinaryType;
                byte[]         array = this.ReadBinary(out bsonBinaryType);
                object         value = (bsonBinaryType != BsonBinaryType.Uuid) ? array : new Guid(array);
                base.SetToken(JsonToken.Bytes, value);
                return;
            }

            case BsonType.Undefined:
                base.SetToken(JsonToken.Undefined);
                return;

            case BsonType.Oid:
            {
                byte[] value2 = this.ReadBytes(12);
                base.SetToken(JsonToken.Bytes, value2);
                return;
            }

            case BsonType.Boolean:
            {
                bool flag = Convert.ToBoolean(this.ReadByte());
                base.SetToken(JsonToken.Boolean, flag);
                return;
            }

            case BsonType.Date:
            {
                DateTime     dateTime             = DateTimeUtils.ConvertJavaScriptTicksToDateTime(this.ReadInt64());
                DateTimeKind dateTimeKindHandling = this.DateTimeKindHandling;
                DateTime     dateTime2;
                if (dateTimeKindHandling != DateTimeKind.Unspecified)
                {
                    if (dateTimeKindHandling != DateTimeKind.Local)
                    {
                        dateTime2 = dateTime;
                    }
                    else
                    {
                        dateTime2 = dateTime.ToLocalTime();
                    }
                }
                else
                {
                    dateTime2 = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified);
                }
                base.SetToken(JsonToken.Date, dateTime2);
                return;
            }

            case BsonType.Null:
                base.SetToken(JsonToken.Null);
                return;

            case BsonType.Regex:
            {
                string str    = this.ReadString();
                string str2   = this.ReadString();
                string value3 = "/" + str + "/" + str2;
                base.SetToken(JsonToken.String, value3);
                return;
            }

            case BsonType.Reference:
                base.SetToken(JsonToken.StartObject);
                this._bsonReaderState = BsonReader.BsonReaderState.ReferenceStart;
                return;

            case BsonType.Code:
                base.SetToken(JsonToken.String, this.ReadLengthString());
                return;

            case BsonType.CodeWScope:
                base.SetToken(JsonToken.StartObject);
                this._bsonReaderState = BsonReader.BsonReaderState.CodeWScopeStart;
                return;

            case BsonType.Integer:
                base.SetToken(JsonToken.Integer, (long)this.ReadInt32());
                return;

            case BsonType.TimeStamp:
            case BsonType.Long:
                base.SetToken(JsonToken.Integer, this.ReadInt64());
                return;

            default:
                throw new ArgumentOutOfRangeException("type", "Unexpected BsonType value: " + type.ToString());
            }
        }