mirror of
https://github.com/go-gitea/gitea.git
synced 2024-08-22 04:23:25 +02:00
* update github.com/blevesearch/bleve v2.0.2 -> v2.0.3 * github.com/denisenkom/go-mssqldb v0.9.0 -> v0.10.0 * github.com/editorconfig/editorconfig-core-go v2.4.1 -> v2.4.2 * github.com/go-chi/cors v1.1.1 -> v1.2.0 * github.com/go-git/go-billy v5.0.0 -> v5.1.0 * github.com/go-git/go-git v5.2.0 -> v5.3.0 * github.com/go-ldap/ldap v3.2.4 -> v3.3.0 * github.com/go-redis/redis v8.6.0 -> v8.8.2 * github.com/go-sql-driver/mysql v1.5.0 -> v1.6.0 * github.com/go-swagger/go-swagger v0.26.1 -> v0.27.0 * github.com/lib/pq v1.9.0 -> v1.10.1 * github.com/mattn/go-sqlite3 v1.14.6 -> v1.14.7 * github.com/go-testfixtures/testfixtures v3.5.0 -> v3.6.0 * github.com/issue9/identicon v1.0.1 -> v1.2.0 * github.com/klauspost/compress v1.11.8 -> v1.12.1 * github.com/mgechev/revive v1.0.3 -> v1.0.6 * github.com/microcosm-cc/bluemonday v1.0.7 -> v1.0.8 * github.com/niklasfasching/go-org v1.4.0 -> v1.5.0 * github.com/olivere/elastic v7.0.22 -> v7.0.24 * github.com/pelletier/go-toml v1.8.1 -> v1.9.0 * github.com/prometheus/client_golang v1.9.0 -> v1.10.0 * github.com/xanzy/go-gitlab v0.44.0 -> v0.48.0 * github.com/yuin/goldmark v1.3.3 -> v1.3.5 * github.com/6543/go-version v1.2.4 -> v1.3.1 * do github.com/lib/pq v1.10.0 -> v1.10.1 again ...
202 lines
6.1 KiB
Go
Vendored
202 lines
6.1 KiB
Go
Vendored
// 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 bsoncore
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/bsontype"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
// ArrayBuilder builds a bson array
|
|
type ArrayBuilder struct {
|
|
arr []byte
|
|
indexes []int32
|
|
keys []int
|
|
}
|
|
|
|
// NewArrayBuilder creates a new ArrayBuilder
|
|
func NewArrayBuilder() *ArrayBuilder {
|
|
return (&ArrayBuilder{}).startArray()
|
|
}
|
|
|
|
// startArray reserves the array's length and sets the index to where the length begins
|
|
func (a *ArrayBuilder) startArray() *ArrayBuilder {
|
|
var index int32
|
|
index, a.arr = AppendArrayStart(a.arr)
|
|
a.indexes = append(a.indexes, index)
|
|
a.keys = append(a.keys, 0)
|
|
return a
|
|
}
|
|
|
|
// Build updates the length of the array and index to the beginning of the documents length
|
|
// bytes, then returns the array (bson bytes)
|
|
func (a *ArrayBuilder) Build() Array {
|
|
lastIndex := len(a.indexes) - 1
|
|
lastKey := len(a.keys) - 1
|
|
a.arr, _ = AppendArrayEnd(a.arr, a.indexes[lastIndex])
|
|
a.indexes = a.indexes[:lastIndex]
|
|
a.keys = a.keys[:lastKey]
|
|
return a.arr
|
|
}
|
|
|
|
// incrementKey() increments the value keys and returns the key to be used to a.appendArray* functions
|
|
func (a *ArrayBuilder) incrementKey() string {
|
|
idx := len(a.keys) - 1
|
|
key := strconv.Itoa(a.keys[idx])
|
|
a.keys[idx]++
|
|
return key
|
|
}
|
|
|
|
// AppendInt32 will append i32 to ArrayBuilder.arr
|
|
func (a *ArrayBuilder) AppendInt32(i32 int32) *ArrayBuilder {
|
|
a.arr = AppendInt32Element(a.arr, a.incrementKey(), i32)
|
|
return a
|
|
}
|
|
|
|
// AppendDocument will append doc to ArrayBuilder.arr
|
|
func (a *ArrayBuilder) AppendDocument(doc []byte) *ArrayBuilder {
|
|
a.arr = AppendDocumentElement(a.arr, a.incrementKey(), doc)
|
|
return a
|
|
}
|
|
|
|
// AppendArray will append arr to ArrayBuilder.arr
|
|
func (a *ArrayBuilder) AppendArray(arr []byte) *ArrayBuilder {
|
|
a.arr = AppendArrayElement(a.arr, a.incrementKey(), arr)
|
|
return a
|
|
}
|
|
|
|
// AppendDouble will append f to ArrayBuilder.doc
|
|
func (a *ArrayBuilder) AppendDouble(f float64) *ArrayBuilder {
|
|
a.arr = AppendDoubleElement(a.arr, a.incrementKey(), f)
|
|
return a
|
|
}
|
|
|
|
// AppendString will append str to ArrayBuilder.doc
|
|
func (a *ArrayBuilder) AppendString(str string) *ArrayBuilder {
|
|
a.arr = AppendStringElement(a.arr, a.incrementKey(), str)
|
|
return a
|
|
}
|
|
|
|
// AppendObjectID will append oid to ArrayBuilder.doc
|
|
func (a *ArrayBuilder) AppendObjectID(oid primitive.ObjectID) *ArrayBuilder {
|
|
a.arr = AppendObjectIDElement(a.arr, a.incrementKey(), oid)
|
|
return a
|
|
}
|
|
|
|
// AppendBinary will append a BSON binary element using subtype, and
|
|
// b to a.arr
|
|
func (a *ArrayBuilder) AppendBinary(subtype byte, b []byte) *ArrayBuilder {
|
|
a.arr = AppendBinaryElement(a.arr, a.incrementKey(), subtype, b)
|
|
return a
|
|
}
|
|
|
|
// AppendUndefined will append a BSON undefined element using key to a.arr
|
|
func (a *ArrayBuilder) AppendUndefined() *ArrayBuilder {
|
|
a.arr = AppendUndefinedElement(a.arr, a.incrementKey())
|
|
return a
|
|
}
|
|
|
|
// AppendBoolean will append a boolean element using b to a.arr
|
|
func (a *ArrayBuilder) AppendBoolean(b bool) *ArrayBuilder {
|
|
a.arr = AppendBooleanElement(a.arr, a.incrementKey(), b)
|
|
return a
|
|
}
|
|
|
|
// AppendDateTime will append datetime element dt to a.arr
|
|
func (a *ArrayBuilder) AppendDateTime(dt int64) *ArrayBuilder {
|
|
a.arr = AppendDateTimeElement(a.arr, a.incrementKey(), dt)
|
|
return a
|
|
}
|
|
|
|
// AppendNull will append a null element to a.arr
|
|
func (a *ArrayBuilder) AppendNull() *ArrayBuilder {
|
|
a.arr = AppendNullElement(a.arr, a.incrementKey())
|
|
return a
|
|
}
|
|
|
|
// AppendRegex will append pattern and options to a.arr
|
|
func (a *ArrayBuilder) AppendRegex(pattern, options string) *ArrayBuilder {
|
|
a.arr = AppendRegexElement(a.arr, a.incrementKey(), pattern, options)
|
|
return a
|
|
}
|
|
|
|
// AppendDBPointer will append ns and oid to a.arr
|
|
func (a *ArrayBuilder) AppendDBPointer(ns string, oid primitive.ObjectID) *ArrayBuilder {
|
|
a.arr = AppendDBPointerElement(a.arr, a.incrementKey(), ns, oid)
|
|
return a
|
|
}
|
|
|
|
// AppendJavaScript will append js to a.arr
|
|
func (a *ArrayBuilder) AppendJavaScript(js string) *ArrayBuilder {
|
|
a.arr = AppendJavaScriptElement(a.arr, a.incrementKey(), js)
|
|
return a
|
|
}
|
|
|
|
// AppendSymbol will append symbol to a.arr
|
|
func (a *ArrayBuilder) AppendSymbol(symbol string) *ArrayBuilder {
|
|
a.arr = AppendSymbolElement(a.arr, a.incrementKey(), symbol)
|
|
return a
|
|
}
|
|
|
|
// AppendCodeWithScope will append code and scope to a.arr
|
|
func (a *ArrayBuilder) AppendCodeWithScope(code string, scope Document) *ArrayBuilder {
|
|
a.arr = AppendCodeWithScopeElement(a.arr, a.incrementKey(), code, scope)
|
|
return a
|
|
}
|
|
|
|
// AppendTimestamp will append t and i to a.arr
|
|
func (a *ArrayBuilder) AppendTimestamp(t, i uint32) *ArrayBuilder {
|
|
a.arr = AppendTimestampElement(a.arr, a.incrementKey(), t, i)
|
|
return a
|
|
}
|
|
|
|
// AppendInt64 will append i64 to a.arr
|
|
func (a *ArrayBuilder) AppendInt64(i64 int64) *ArrayBuilder {
|
|
a.arr = AppendInt64Element(a.arr, a.incrementKey(), i64)
|
|
return a
|
|
}
|
|
|
|
// AppendDecimal128 will append d128 to a.arr
|
|
func (a *ArrayBuilder) AppendDecimal128(d128 primitive.Decimal128) *ArrayBuilder {
|
|
a.arr = AppendDecimal128Element(a.arr, a.incrementKey(), d128)
|
|
return a
|
|
}
|
|
|
|
// AppendMaxKey will append a max key element to a.arr
|
|
func (a *ArrayBuilder) AppendMaxKey() *ArrayBuilder {
|
|
a.arr = AppendMaxKeyElement(a.arr, a.incrementKey())
|
|
return a
|
|
}
|
|
|
|
// AppendMinKey will append a min key element to a.arr
|
|
func (a *ArrayBuilder) AppendMinKey() *ArrayBuilder {
|
|
a.arr = AppendMinKeyElement(a.arr, a.incrementKey())
|
|
return a
|
|
}
|
|
|
|
// AppendValue appends a BSON value to the array.
|
|
func (a *ArrayBuilder) AppendValue(val Value) *ArrayBuilder {
|
|
a.arr = AppendValueElement(a.arr, a.incrementKey(), val)
|
|
return a
|
|
}
|
|
|
|
// StartArray starts building an inline Array. After this document is completed,
|
|
// the user must call a.FinishArray
|
|
func (a *ArrayBuilder) StartArray() *ArrayBuilder {
|
|
a.arr = AppendHeader(a.arr, bsontype.Array, a.incrementKey())
|
|
a.startArray()
|
|
return a
|
|
}
|
|
|
|
// FinishArray builds the most recent array created
|
|
func (a *ArrayBuilder) FinishArray() *ArrayBuilder {
|
|
a.arr = a.Build()
|
|
return a
|
|
}
|