wire

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 15, 2024 License: Apache-2.0 Imports: 17 Imported by: 0

README

wire

MongoDB wire protocol implementation in Go.

This module is in the process of extraction from FerretDB. Please do not use it yet.

Documentation

Overview

Package wire provides wire protocol implementation.

Index

Constants

View Source
const (
	// OpCodeReply is used for the initial handshake with old clients.
	// It is not used otherwise and is deprecated.
	OpCodeReply = OpCode(1) // OP_REPLY

	// OpCodeUpdate is deprecated.
	OpCodeUpdate = OpCode(2001) // OP_UPDATE

	// OpCodeInsert is deprecated and unused.
	OpCodeInsert = OpCode(2002) // OP_INSERT

	// OpCodeGetByOID is deprecated and unused.
	OpCodeGetByOID = OpCode(2003) // OP_GET_BY_OID

	// OpCodeQuery is used for the initial handshake with old clients.
	// It is not used otherwise and is deprecated.
	OpCodeQuery = OpCode(2004) // OP_QUERY

	// OpCodeGetMore is deprecated and unused.
	OpCodeGetMore = OpCode(2005) // OP_GET_MORE

	// OpCodeDelete is deprecated and unused.
	OpCodeDelete = OpCode(2006) // OP_DELETE

	// OpCodeKillCursors is deprecated and unused.
	OpCodeKillCursors = OpCode(2007) // OP_KILL_CURSORS

	// OpCodeCompressed is not implemented yet.
	OpCodeCompressed = OpCode(2012) // OP_COMPRESSED

	// OpCodeMsg is the main operation for client-server communication.
	OpCodeMsg = OpCode(2013) // OP_MSG
)
View Source
const (
	// MsgHeaderLen is an expected len of the header.
	MsgHeaderLen = 16

	// MaxMsgLen is the maximum message length.
	MaxMsgLen = 48000000
)
View Source
const (
	// OpMsgChecksumPresent indicates that there is a CRC-32C checksum in a message.
	OpMsgChecksumPresent = OpMsgFlagBit(1 << 0) // checksumPresent

	// OpMsgMoreToCome indicates that there is another message coming, no need to do anything for it.
	OpMsgMoreToCome = OpMsgFlagBit(1 << 1) // moreToCome

	// OpMsgExhaustAllowed indicates that client can handle multiple replies.
	OpMsgExhaustAllowed = OpMsgFlagBit(1 << 16) // exhaustAllowed
)
View Source
const (
	// OpQueryTailableCursor indicates that the cursor will not be closed.
	OpQueryTailableCursor = OpQueryFlagBit(1 << 1) // TailableCursor

	// OpQuerySlaveOk indicates that query can run on a replica slave.
	OpQuerySlaveOk = OpQueryFlagBit(1 << 2) // SlaveOk

	// OpQueryOplogReplay is deprecated.
	OpQueryOplogReplay = OpQueryFlagBit(1 << 3) // OplogReplay

	// OpQueryNoCursorTimeout disables cursor timeouts.
	OpQueryNoCursorTimeout = OpQueryFlagBit(1 << 4) // NoCursorTimeout

	// OpQueryAwaitData together with OpQueryTailableCursor, waits for data instead of returning it.
	OpQueryAwaitData = OpQueryFlagBit(1 << 5) // AwaitData

	// OpQueryExhaust indicates that server can divide data into multiple streams and expect that client can handle it.
	OpQueryExhaust = OpQueryFlagBit(1 << 6) // Exhaust

	// OpQueryPartial ignore error and give partial results.
	OpQueryPartial = OpQueryFlagBit(1 << 7) // Partial
)
View Source
const (
	// OpReplyCursorNotFound indicates that the cursor is no longer exist at the server.
	OpReplyCursorNotFound = OpReplyFlagBit(1 << 0) // CursorNotFound

	// OpReplyQueryFailure reports query has failed.
	OpReplyQueryFailure = OpReplyFlagBit(1 << 1) // QueryFailure

	// OpReplyShardConfigStale indicates that shard config is outdated.
	OpReplyShardConfigStale = OpReplyFlagBit(1 << 2) // ShardConfigStale

	// OpReplyAwaitCapable indicates server supports AwaitData Query option.
	OpReplyAwaitCapable = OpReplyFlagBit(1 << 3) // AwaitCapable
)

Variables

View Source
var ErrZeroRead = errors.New("zero bytes read")

ErrZeroRead is returned when zero bytes was read from connection, indicating that connection was closed by the client.

Functions

func ReadMessage

func ReadMessage(r *bufio.Reader) (*MsgHeader, MsgBody, error)

ReadMessage reads from reader and returns wire header and body.

Error is (possibly wrapped) ErrZeroRead if zero bytes was read.

func WriteMessage

func WriteMessage(w *bufio.Writer, header *MsgHeader, msg MsgBody) error

WriteMessage validates msg and headers and writes them to the writer.

Types

type MsgBody

type MsgBody interface {

	// UnmarshalBinaryNocopy is a variant of [encoding.BinaryUnmarshaler] that does not have to copy the data.
	UnmarshalBinaryNocopy([]byte) error

	encoding.BinaryMarshaler
	fmt.Stringer

	// StringBlock returns an indented string representation for logging.
	StringBlock() string

	// StringFlow returns an unindented string representation for logging.
	StringFlow() string
	// contains filtered or unexported methods
}

MsgBody is a wire protocol message body.

type MsgHeader

type MsgHeader struct {
	MessageLength int32
	RequestID     int32
	ResponseTo    int32
	OpCode        OpCode
}

MsgHeader in general, each message consists of a standard message header followed by request-specific data.

func (*MsgHeader) MarshalBinary

func (msg *MsgHeader) MarshalBinary() ([]byte, error)

MarshalBinary writes a MsgHeader to a byte array.

func (*MsgHeader) String

func (msg *MsgHeader) String() string

String returns a string representation for logging.

type OpCode

type OpCode int32

OpCode represents wire operation code.

func (OpCode) String

func (i OpCode) String() string

type OpMsg

type OpMsg struct {
	Flags OpMsgFlags
	// contains filtered or unexported fields
}

OpMsg is the main wire protocol message type.

func NewOpMsg

func NewOpMsg(doc wirebson.AnyDocument) (*OpMsg, error)

NewOpMsg creates a message with a single section of kind 0 with a single raw document.

func (*OpMsg) MarshalBinary

func (msg *OpMsg) MarshalBinary() ([]byte, error)

MarshalBinary writes an OpMsg to a byte array.

func (*OpMsg) RawDocument

func (msg *OpMsg) RawDocument() (wirebson.RawDocument, error)

RawDocument returns the value of msg as a wirebson.RawDocument.

The error is returned if msg contains anything other than a single section of kind 0 with a single document.

func (*OpMsg) RawSection0

func (msg *OpMsg) RawSection0() wirebson.RawDocument

RawSection0 returns the value of first section with kind 0.

func (*OpMsg) RawSections

func (msg *OpMsg) RawSections() (wirebson.RawDocument, []byte)

RawSections returns the value of section with kind 0 and the value of all sections with kind 1.

func (*OpMsg) Sections

func (msg *OpMsg) Sections() []opMsgSection

Sections returns the sections of the OpMsg.

func (*OpMsg) SetSections

func (msg *OpMsg) SetSections(sections ...opMsgSection) error

SetSections sets sections of the OpMsg.

func (*OpMsg) String

func (msg *OpMsg) String() string

String returns a string representation for logging.

func (*OpMsg) StringBlock

func (msg *OpMsg) StringBlock() string

StringBlock returns an indented string representation for logging.

func (*OpMsg) StringFlow

func (msg *OpMsg) StringFlow() string

StringFlow returns an unindented string representation for logging.

func (*OpMsg) UnmarshalBinaryNocopy

func (msg *OpMsg) UnmarshalBinaryNocopy(b []byte) error

UnmarshalBinaryNocopy implements MsgBody.

type OpMsgFlagBit

type OpMsgFlagBit flagBit

OpMsgFlagBit integer is a bitmask encoding flags that modify the format and behavior of OpMsg.

func (OpMsgFlagBit) String

func (i OpMsgFlagBit) String() string

type OpMsgFlags

type OpMsgFlags flags

OpMsgFlags type unint32.

func (OpMsgFlags) FlagSet

func (f OpMsgFlags) FlagSet(bit OpMsgFlagBit) bool

FlagSet check if flag is set.

func (OpMsgFlags) String

func (f OpMsgFlags) String() string

String returns OpMsgFlags as a string.

type OpQuery

type OpQuery struct {
	FullCollectionName string

	Flags          OpQueryFlags
	NumberToSkip   int32
	NumberToReturn int32
	// contains filtered or unexported fields
}

OpQuery is a deprecated request message type.

func NewOpQuery

func NewOpQuery(doc wirebson.AnyDocument) (*OpQuery, error)

NewOpQuery creates a new OpQuery message.

func (*OpQuery) MarshalBinary

func (query *OpQuery) MarshalBinary() ([]byte, error)

MarshalBinary implements MsgBody.

func (*OpQuery) Query

func (query *OpQuery) Query() *wirebson.Document

Query returns decoded query document. Only top-level fields are decoded.

func (*OpQuery) String

func (query *OpQuery) String() string

String returns a string representation for logging.

func (*OpQuery) StringBlock

func (query *OpQuery) StringBlock() string

StringBlock returns an indented string representation for logging.

func (*OpQuery) StringFlow

func (query *OpQuery) StringFlow() string

StringFlow returns an unindented string representation for logging.

func (*OpQuery) UnmarshalBinaryNocopy

func (query *OpQuery) UnmarshalBinaryNocopy(b []byte) error

UnmarshalBinaryNocopy implements MsgBody.

type OpQueryFlagBit

type OpQueryFlagBit flagBit

OpQueryFlagBit an integer bitmask for the operation.

func (OpQueryFlagBit) String

func (i OpQueryFlagBit) String() string

type OpQueryFlags

type OpQueryFlags flags

OpQueryFlags enables String() and FlagSet methods for flags.

func (OpQueryFlags) FlagSet

func (f OpQueryFlags) FlagSet(bit OpQueryFlagBit) bool

FlagSet return true if flag set.

func (OpQueryFlags) String

func (f OpQueryFlags) String() string

String interface implementation for query flags.

type OpReply

type OpReply struct {
	CursorID     int64
	Flags        OpReplyFlags
	StartingFrom int32
	// contains filtered or unexported fields
}

OpReply is a deprecated response message type.

Only up to one returned document is supported.

func NewOpReply

func NewOpReply(doc wirebson.AnyDocument) (*OpReply, error)

NewOpReply creates a new OpReply message.

func (*OpReply) Document

func (reply *OpReply) Document() (*wirebson.Document, error)

Document returns reply document.

func (*OpReply) MarshalBinary

func (reply *OpReply) MarshalBinary() ([]byte, error)

MarshalBinary implements MsgBody.

func (*OpReply) RawDocument

func (reply *OpReply) RawDocument() wirebson.RawDocument

RawDocument returns raw document.

func (*OpReply) SetDocument

func (reply *OpReply) SetDocument(doc *wirebson.Document)

SetDocument sets reply document.

func (*OpReply) String

func (reply *OpReply) String() string

String returns a string representation for logging.

func (*OpReply) StringBlock

func (reply *OpReply) StringBlock() string

StringBlock returns an indented string representation for logging.

func (*OpReply) StringFlow

func (reply *OpReply) StringFlow() string

StringFlow returns an unindented string representation for logging.

func (*OpReply) UnmarshalBinaryNocopy

func (reply *OpReply) UnmarshalBinaryNocopy(b []byte) error

UnmarshalBinaryNocopy implements MsgBody.

type OpReplyFlagBit

type OpReplyFlagBit flagBit

OpReplyFlagBit is a bit vector to specify OP_REPLY flags.

func (OpReplyFlagBit) String

func (i OpReplyFlagBit) String() string

type OpReplyFlags

type OpReplyFlags flags

OpReplyFlags are OP_REPLY flags.

func (OpReplyFlags) FlagSet

func (f OpReplyFlags) FlagSet(bit OpReplyFlagBit) bool

FlagSet returns true if the flag is set.

func (OpReplyFlags) String

func (f OpReplyFlags) String() string

String returns string value for OP_REPLY.

type Record

type Record struct {
	// those may be unset if message is invalid
	Header *MsgHeader
	Body   MsgBody

	// those are always set
	HeaderB []byte
	BodyB   []byte
}

Record represents a single recorded wire protocol message, loaded from a .bin file.

func LoadRecords

func LoadRecords(dir string, limit int) ([]Record, error)

LoadRecords finds all .bin files recursively, selects up to the limit at random (or all if limit <= 0), and parses them.

Directories

Path Synopsis
internal
util/lazyerrors
Package lazyerrors provides error wrapping with file location.
Package lazyerrors provides error wrapping with file location.
util/must
Package must provides helper functions that panic on error.
Package must provides helper functions that panic on error.
Package wirebson implements encoding and decoding of BSON as defined by https://bsonspec.org/spec.html.
Package wirebson implements encoding and decoding of BSON as defined by https://bsonspec.org/spec.html.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL