示例#1
0
        public static DateTime ReadDateTime(this BufferSlice buffer, int offset)
        {
            var ticks = buffer.ReadInt64(offset);

            if (ticks == 0)
            {
                return(DateTime.MinValue);
            }
            if (ticks == 3155378975999999999)
            {
                return(DateTime.MaxValue);
            }

            return(new DateTime(buffer.ReadInt64(offset), DateTimeKind.Utc).ToLocalTime());
        }
示例#2
0
        /// <summary>
        /// Read any BsonValue. Use 1 byte for data type, 1 byte for length (optional), 0-255 bytes to value.
        /// For document or array, use BufferReader
        /// </summary>
        public static BsonValue ReadIndexKey(this BufferSlice buffer, int offset)
        {
            ExtendedLengthHelper.ReadLength(buffer[offset++], buffer[offset], out var type, out var len);

            switch (type)
            {
            case BsonType.Null: return(BsonValue.Null);

            case BsonType.Int32: return(buffer.ReadInt32(offset));

            case BsonType.Int64: return(buffer.ReadInt64(offset));

            case BsonType.Double: return(buffer.ReadDouble(offset));

            case BsonType.Decimal: return(buffer.ReadDecimal(offset));

            case BsonType.String:
                offset++;     // for byte length
                return(buffer.ReadString(offset, len));

            case BsonType.Document:
                using (var r = new BufferReader(buffer))
                {
                    r.Skip(offset);     // skip first byte for value.Type
                    return(r.ReadDocument());
                }

            case BsonType.Array:
                using (var r = new BufferReader(buffer))
                {
                    r.Skip(offset);     // skip first byte for value.Type
                    return(r.ReadArray());
                }

            case BsonType.Binary:
                offset++;     // for byte length
                return(buffer.ReadBytes(offset, len));

            case BsonType.ObjectId: return(buffer.ReadObjectId(offset));

            case BsonType.Guid: return(buffer.ReadGuid(offset));

            case BsonType.Boolean: return(buffer[offset] != 0);

            case BsonType.DateTime: return(buffer.ReadDateTime(offset));

            case BsonType.MinValue: return(BsonValue.MinValue);

            case BsonType.MaxValue: return(BsonValue.MaxValue);

            default: throw new NotImplementedException();
            }
        }