You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.5 KiB
166 lines
4.5 KiB
// Copyright (C) MongoDB, Inc. 2017-present. |
|
// |
|
// Licensed under the Apache License, Version 2.0 (the "License"); you may |
|
// not use this file except in compliance with the License. You may obtain |
|
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
package bsonx |
|
|
|
import ( |
|
"encoding/binary" |
|
"math" |
|
"time" |
|
|
|
"go.mongodb.org/mongo-driver/bson/bsontype" |
|
"go.mongodb.org/mongo-driver/bson/primitive" |
|
) |
|
|
|
// IDoc is the interface implemented by Doc and MDoc. It allows either of these types to be provided |
|
// to the Document function to create a Value. |
|
type IDoc interface { |
|
idoc() |
|
} |
|
|
|
// Double constructs a BSON double Value. |
|
func Double(f64 float64) Val { |
|
v := Val{t: bsontype.Double} |
|
binary.LittleEndian.PutUint64(v.bootstrap[0:8], math.Float64bits(f64)) |
|
return v |
|
} |
|
|
|
// String constructs a BSON string Value. |
|
func String(str string) Val { return Val{t: bsontype.String}.writestring(str) } |
|
|
|
// Document constructs a Value from the given IDoc. If nil is provided, a BSON Null value will be |
|
// returned. |
|
func Document(doc IDoc) Val { |
|
var v Val |
|
switch tt := doc.(type) { |
|
case Doc: |
|
if tt == nil { |
|
v.t = bsontype.Null |
|
break |
|
} |
|
v.t = bsontype.EmbeddedDocument |
|
v.primitive = tt |
|
case MDoc: |
|
if tt == nil { |
|
v.t = bsontype.Null |
|
break |
|
} |
|
v.t = bsontype.EmbeddedDocument |
|
v.primitive = tt |
|
default: |
|
v.t = bsontype.Null |
|
} |
|
return v |
|
} |
|
|
|
// Array constructs a Value from arr. If arr is nil, a BSON Null value is returned. |
|
func Array(arr Arr) Val { |
|
if arr == nil { |
|
return Val{t: bsontype.Null} |
|
} |
|
return Val{t: bsontype.Array, primitive: arr} |
|
} |
|
|
|
// Binary constructs a BSON binary Value. |
|
func Binary(subtype byte, data []byte) Val { |
|
return Val{t: bsontype.Binary, primitive: primitive.Binary{Subtype: subtype, Data: data}} |
|
} |
|
|
|
// Undefined constructs a BSON binary Value. |
|
func Undefined() Val { return Val{t: bsontype.Undefined} } |
|
|
|
// ObjectID constructs a BSON objectid Value. |
|
func ObjectID(oid primitive.ObjectID) Val { |
|
v := Val{t: bsontype.ObjectID} |
|
copy(v.bootstrap[0:12], oid[:]) |
|
return v |
|
} |
|
|
|
// Boolean constructs a BSON boolean Value. |
|
func Boolean(b bool) Val { |
|
v := Val{t: bsontype.Boolean} |
|
if b { |
|
v.bootstrap[0] = 0x01 |
|
} |
|
return v |
|
} |
|
|
|
// DateTime constructs a BSON datetime Value. |
|
func DateTime(dt int64) Val { return Val{t: bsontype.DateTime}.writei64(dt) } |
|
|
|
// Time constructs a BSON datetime Value. |
|
func Time(t time.Time) Val { |
|
return Val{t: bsontype.DateTime}.writei64(t.Unix()*1e3 + int64(t.Nanosecond()/1e6)) |
|
} |
|
|
|
// Null constructs a BSON binary Value. |
|
func Null() Val { return Val{t: bsontype.Null} } |
|
|
|
// Regex constructs a BSON regex Value. |
|
func Regex(pattern, options string) Val { |
|
regex := primitive.Regex{Pattern: pattern, Options: options} |
|
return Val{t: bsontype.Regex, primitive: regex} |
|
} |
|
|
|
// DBPointer constructs a BSON dbpointer Value. |
|
func DBPointer(ns string, ptr primitive.ObjectID) Val { |
|
dbptr := primitive.DBPointer{DB: ns, Pointer: ptr} |
|
return Val{t: bsontype.DBPointer, primitive: dbptr} |
|
} |
|
|
|
// JavaScript constructs a BSON javascript Value. |
|
func JavaScript(js string) Val { |
|
return Val{t: bsontype.JavaScript}.writestring(js) |
|
} |
|
|
|
// Symbol constructs a BSON symbol Value. |
|
func Symbol(symbol string) Val { |
|
return Val{t: bsontype.Symbol}.writestring(symbol) |
|
} |
|
|
|
// CodeWithScope constructs a BSON code with scope Value. |
|
func CodeWithScope(code string, scope IDoc) Val { |
|
cws := primitive.CodeWithScope{Code: primitive.JavaScript(code), Scope: scope} |
|
return Val{t: bsontype.CodeWithScope, primitive: cws} |
|
} |
|
|
|
// Int32 constructs a BSON int32 Value. |
|
func Int32(i32 int32) Val { |
|
v := Val{t: bsontype.Int32} |
|
v.bootstrap[0] = byte(i32) |
|
v.bootstrap[1] = byte(i32 >> 8) |
|
v.bootstrap[2] = byte(i32 >> 16) |
|
v.bootstrap[3] = byte(i32 >> 24) |
|
return v |
|
} |
|
|
|
// Timestamp constructs a BSON timestamp Value. |
|
func Timestamp(t, i uint32) Val { |
|
v := Val{t: bsontype.Timestamp} |
|
v.bootstrap[0] = byte(i) |
|
v.bootstrap[1] = byte(i >> 8) |
|
v.bootstrap[2] = byte(i >> 16) |
|
v.bootstrap[3] = byte(i >> 24) |
|
v.bootstrap[4] = byte(t) |
|
v.bootstrap[5] = byte(t >> 8) |
|
v.bootstrap[6] = byte(t >> 16) |
|
v.bootstrap[7] = byte(t >> 24) |
|
return v |
|
} |
|
|
|
// Int64 constructs a BSON int64 Value. |
|
func Int64(i64 int64) Val { return Val{t: bsontype.Int64}.writei64(i64) } |
|
|
|
// Decimal128 constructs a BSON decimal128 Value. |
|
func Decimal128(d128 primitive.Decimal128) Val { |
|
return Val{t: bsontype.Decimal128, primitive: d128} |
|
} |
|
|
|
// MinKey constructs a BSON minkey Value. |
|
func MinKey() Val { return Val{t: bsontype.MinKey} } |
|
|
|
// MaxKey constructs a BSON maxkey Value. |
|
func MaxKey() Val { return Val{t: bsontype.MaxKey} }
|
|
|