Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
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.
177 lines
3.1 KiB
177 lines
3.1 KiB
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, |
|
} |
|
}
|
|
|