package hbase import ( "bytes" "fmt" "io" "github.com/juju/errors" "github.com/pingcap/go-hbase/iohelper" ) type Column struct { Family []byte Qual []byte } func NewColumn(family, qual []byte) *Column { return &Column{ Family: family, Qual: qual, } } func encode(parts ...[]byte) ([]byte, error) { buf := &bytes.Buffer{} for _, p := range parts { err := iohelper.WriteVarBytes(buf, p) if err != nil { return nil, errors.Trace(err) } } return buf.Bytes(), nil } func decode(encoded []byte) ([][]byte, error) { var ret [][]byte buf := bytes.NewBuffer(encoded) for { b, err := iohelper.ReadVarBytes(buf) if len(b) == 0 || (err != nil && ErrorEqual(err, io.EOF)) { break } ret = append(ret, b) } return ret, nil } func (c *Column) Write(w io.Writer) error { err := iohelper.WriteVarBytes(w, c.Family) if err != nil { return errors.Trace(err) } err = iohelper.WriteVarBytes(w, c.Qual) if err != nil { return errors.Trace(err) } return nil } func (c *Column) String() string { b, err := encode(c.Family, c.Qual) if err != nil { return fmt.Sprintf("invalid column - %v", err) } return string(b) } func (c *Column) ParseFromString(s string) error { pairs, err := decode([]byte(s)) if err != nil { return errors.Trace(err) } c.Family = pairs[0] c.Qual = pairs[1] return nil } type ColumnCoordinate struct { Table []byte Row []byte Column } func NewColumnCoordinate(table, row, family, qual []byte) *ColumnCoordinate { return &ColumnCoordinate{ Table: table, Row: row, Column: Column{ Family: family, Qual: qual, }, } } func (c *ColumnCoordinate) Write(w io.Writer) error { err := iohelper.WriteVarBytes(w, c.Table) if err != nil { return errors.Trace(err) } err = iohelper.WriteVarBytes(w, c.Row) if err != nil { return errors.Trace(err) } err = c.Column.Write(w) if err != nil { return errors.Trace(err) } return nil } func (c *ColumnCoordinate) Equal(a *ColumnCoordinate) bool { return bytes.Compare(c.Table, a.Table) == 0 && bytes.Compare(c.Row, a.Row) == 0 && bytes.Compare(c.Family, a.Family) == 0 && bytes.Compare(c.Qual, a.Qual) == 0 } func (c *ColumnCoordinate) String() string { b, err := encode(c.Table, c.Row, c.Family, c.Qual) if err != nil { return fmt.Sprintf("invalid column coordinate - %v", err) } return string(b) } func (c *ColumnCoordinate) ParseFromString(s string) error { pairs, err := decode([]byte(s)) if err != nil { return errors.Trace(err) } c.Table = pairs[0] c.Row = pairs[1] c.Family = pairs[2] c.Qual = pairs[3] return nil } func (c *ColumnCoordinate) ParseField(b iohelper.ByteMultiReader) error { table, err := iohelper.ReadVarBytes(b) if err != nil { return errors.Trace(err) } c.Table = table row, err := iohelper.ReadVarBytes(b) if err != nil { return errors.Trace(err) } c.Row = row family, err := iohelper.ReadVarBytes(b) if err != nil { return errors.Trace(err) } c.Family = family qual, err := iohelper.ReadVarBytes(b) if err != nil { return errors.Trace(err) } c.Qual = qual return nil } func (c *ColumnCoordinate) GetColumn() *Column { return &Column{ Family: c.Family, Qual: c.Qual, } }