...

Source file src/github.com/lib/pq/buf.go

Documentation: github.com/lib/pq

     1  package pq
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  
     7  	"github.com/lib/pq/oid"
     8  )
     9  
    10  type readBuf []byte
    11  
    12  func (b *readBuf) int32() (n int) {
    13  	n = int(int32(binary.BigEndian.Uint32(*b)))
    14  	*b = (*b)[4:]
    15  	return
    16  }
    17  
    18  func (b *readBuf) oid() (n oid.Oid) {
    19  	n = oid.Oid(binary.BigEndian.Uint32(*b))
    20  	*b = (*b)[4:]
    21  	return
    22  }
    23  
    24  // N.B: this is actually an unsigned 16-bit integer, unlike int32
    25  func (b *readBuf) int16() (n int) {
    26  	n = int(binary.BigEndian.Uint16(*b))
    27  	*b = (*b)[2:]
    28  	return
    29  }
    30  
    31  func (b *readBuf) string() string {
    32  	i := bytes.IndexByte(*b, 0)
    33  	if i < 0 {
    34  		errorf("invalid message format; expected string terminator")
    35  	}
    36  	s := (*b)[:i]
    37  	*b = (*b)[i+1:]
    38  	return string(s)
    39  }
    40  
    41  func (b *readBuf) next(n int) (v []byte) {
    42  	v = (*b)[:n]
    43  	*b = (*b)[n:]
    44  	return
    45  }
    46  
    47  func (b *readBuf) byte() byte {
    48  	return b.next(1)[0]
    49  }
    50  
    51  type writeBuf struct {
    52  	buf []byte
    53  	pos int
    54  }
    55  
    56  func (b *writeBuf) int32(n int) {
    57  	x := make([]byte, 4)
    58  	binary.BigEndian.PutUint32(x, uint32(n))
    59  	b.buf = append(b.buf, x...)
    60  }
    61  
    62  func (b *writeBuf) int16(n int) {
    63  	x := make([]byte, 2)
    64  	binary.BigEndian.PutUint16(x, uint16(n))
    65  	b.buf = append(b.buf, x...)
    66  }
    67  
    68  func (b *writeBuf) string(s string) {
    69  	b.buf = append(append(b.buf, s...), '\000')
    70  }
    71  
    72  func (b *writeBuf) byte(c byte) {
    73  	b.buf = append(b.buf, c)
    74  }
    75  
    76  func (b *writeBuf) bytes(v []byte) {
    77  	b.buf = append(b.buf, v...)
    78  }
    79  
    80  func (b *writeBuf) wrap() []byte {
    81  	p := b.buf[b.pos:]
    82  	binary.BigEndian.PutUint32(p, uint32(len(p)))
    83  	return b.buf
    84  }
    85  
    86  func (b *writeBuf) next(c byte) {
    87  	p := b.buf[b.pos:]
    88  	binary.BigEndian.PutUint32(p, uint32(len(p)))
    89  	b.pos = len(b.buf) + 1
    90  	b.buf = append(b.buf, c, 0, 0, 0, 0)
    91  }
    92  

View as plain text