github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/go-hbase/call.go (about)

     1  package hbase
     2  
     3  import (
     4  	"strings"
     5  
     6  	pb "github.com/insionng/yougam/libraries/golang/protobuf/proto"
     7  	"github.com/insionng/yougam/libraries/pingcap/go-hbase/proto"
     8  )
     9  
    10  type call struct {
    11  	id             uint32
    12  	methodName     string
    13  	request        pb.Message
    14  	responseBuffer pb.Message
    15  	responseCh     chan pb.Message
    16  }
    17  
    18  type exception struct {
    19  	msg string
    20  }
    21  
    22  func isNotInRegionError(err error) bool {
    23  	return strings.Contains(err.Error(), "org.apache.hadoop.hbase.NotServingRegionException")
    24  }
    25  func isUnknownScannerError(err error) bool {
    26  	return strings.Contains(err.Error(), "org.apache.hadoop.hbase.UnknownScannerException")
    27  }
    28  
    29  func (m *exception) Reset()         { *m = exception{} }
    30  func (m *exception) String() string { return m.msg }
    31  func (m *exception) ProtoMessage()  {}
    32  
    33  func newCall(request pb.Message) *call {
    34  	var responseBuffer pb.Message
    35  	var methodName string
    36  
    37  	switch request.(type) {
    38  	case *proto.GetRequest:
    39  		responseBuffer = &proto.GetResponse{}
    40  		methodName = "Get"
    41  	case *proto.MutateRequest:
    42  		responseBuffer = &proto.MutateResponse{}
    43  		methodName = "Mutate"
    44  	case *proto.ScanRequest:
    45  		responseBuffer = &proto.ScanResponse{}
    46  		methodName = "Scan"
    47  	case *proto.GetTableDescriptorsRequest:
    48  		responseBuffer = &proto.GetTableDescriptorsResponse{}
    49  		methodName = "GetTableDescriptors"
    50  	case *proto.CoprocessorServiceRequest:
    51  		responseBuffer = &proto.CoprocessorServiceResponse{}
    52  		methodName = "ExecService"
    53  	case *proto.CreateTableRequest:
    54  		responseBuffer = &proto.CreateTableResponse{}
    55  		methodName = "CreateTable"
    56  	case *proto.DisableTableRequest:
    57  		responseBuffer = &proto.DisableTableResponse{}
    58  		methodName = "DisableTable"
    59  	case *proto.EnableTableRequest:
    60  		responseBuffer = &proto.EnableTableResponse{}
    61  		methodName = "EnableTable"
    62  	case *proto.DeleteTableRequest:
    63  		responseBuffer = &proto.DeleteTableResponse{}
    64  		methodName = "DeleteTable"
    65  	case *proto.MultiRequest:
    66  		responseBuffer = &proto.MultiResponse{}
    67  		methodName = "Multi"
    68  	case *proto.SplitRegionRequest:
    69  		responseBuffer = &proto.SplitRegionResponse{}
    70  		methodName = "SplitRegion"
    71  	}
    72  
    73  	return &call{
    74  		methodName:     methodName,
    75  		request:        request,
    76  		responseBuffer: responseBuffer,
    77  		responseCh:     make(chan pb.Message, 1),
    78  	}
    79  }
    80  
    81  func (c *call) complete(err error, response []byte) {
    82  	defer close(c.responseCh)
    83  
    84  	if err != nil {
    85  		c.responseCh <- &exception{
    86  			msg: err.Error(),
    87  		}
    88  		return
    89  	}
    90  
    91  	err = pb.Unmarshal(response, c.responseBuffer)
    92  	if err != nil {
    93  		c.responseCh <- &exception{
    94  			msg: err.Error(),
    95  		}
    96  		return
    97  	}
    98  
    99  	c.responseCh <- c.responseBuffer
   100  }