Платформа ЦРНП "Мирокод" для разработки проектов
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.
100 lines
2.5 KiB
100 lines
2.5 KiB
package hbase |
|
|
|
import ( |
|
"strings" |
|
|
|
pb "github.com/golang/protobuf/proto" |
|
"github.com/pingcap/go-hbase/proto" |
|
) |
|
|
|
type call struct { |
|
id uint32 |
|
methodName string |
|
request pb.Message |
|
responseBuffer pb.Message |
|
responseCh chan pb.Message |
|
} |
|
|
|
type exception struct { |
|
msg string |
|
} |
|
|
|
func isNotInRegionError(err error) bool { |
|
return strings.Contains(err.Error(), "org.apache.hadoop.hbase.NotServingRegionException") |
|
} |
|
func isUnknownScannerError(err error) bool { |
|
return strings.Contains(err.Error(), "org.apache.hadoop.hbase.UnknownScannerException") |
|
} |
|
|
|
func (m *exception) Reset() { *m = exception{} } |
|
func (m *exception) String() string { return m.msg } |
|
func (m *exception) ProtoMessage() {} |
|
|
|
func newCall(request pb.Message) *call { |
|
var responseBuffer pb.Message |
|
var methodName string |
|
|
|
switch request.(type) { |
|
case *proto.GetRequest: |
|
responseBuffer = &proto.GetResponse{} |
|
methodName = "Get" |
|
case *proto.MutateRequest: |
|
responseBuffer = &proto.MutateResponse{} |
|
methodName = "Mutate" |
|
case *proto.ScanRequest: |
|
responseBuffer = &proto.ScanResponse{} |
|
methodName = "Scan" |
|
case *proto.GetTableDescriptorsRequest: |
|
responseBuffer = &proto.GetTableDescriptorsResponse{} |
|
methodName = "GetTableDescriptors" |
|
case *proto.CoprocessorServiceRequest: |
|
responseBuffer = &proto.CoprocessorServiceResponse{} |
|
methodName = "ExecService" |
|
case *proto.CreateTableRequest: |
|
responseBuffer = &proto.CreateTableResponse{} |
|
methodName = "CreateTable" |
|
case *proto.DisableTableRequest: |
|
responseBuffer = &proto.DisableTableResponse{} |
|
methodName = "DisableTable" |
|
case *proto.EnableTableRequest: |
|
responseBuffer = &proto.EnableTableResponse{} |
|
methodName = "EnableTable" |
|
case *proto.DeleteTableRequest: |
|
responseBuffer = &proto.DeleteTableResponse{} |
|
methodName = "DeleteTable" |
|
case *proto.MultiRequest: |
|
responseBuffer = &proto.MultiResponse{} |
|
methodName = "Multi" |
|
case *proto.SplitRegionRequest: |
|
responseBuffer = &proto.SplitRegionResponse{} |
|
methodName = "SplitRegion" |
|
} |
|
|
|
return &call{ |
|
methodName: methodName, |
|
request: request, |
|
responseBuffer: responseBuffer, |
|
responseCh: make(chan pb.Message, 1), |
|
} |
|
} |
|
|
|
func (c *call) complete(err error, response []byte) { |
|
defer close(c.responseCh) |
|
|
|
if err != nil { |
|
c.responseCh <- &exception{ |
|
msg: err.Error(), |
|
} |
|
return |
|
} |
|
|
|
err = pb.Unmarshal(response, c.responseBuffer) |
|
if err != nil { |
|
c.responseCh <- &exception{ |
|
msg: err.Error(), |
|
} |
|
return |
|
} |
|
|
|
c.responseCh <- c.responseBuffer |
|
}
|
|
|