mirror of
https://github.com/iLoveElysia/openbilibili.git
synced 2026-03-14 13:56:26 -05:00
113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
// Copyright (C) 2015 The GoHBase Authors. All rights reserved.
|
|
// This file is part of GoHBase.
|
|
// Use of this source code is governed by the Apache License 2.0
|
|
// that can be found in the COPYING file.
|
|
|
|
package hrpc
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/tsuna/gohbase/pb"
|
|
)
|
|
|
|
// CreateTable represents a CreateTable HBase call
|
|
type CreateTable struct {
|
|
base
|
|
|
|
families map[string]map[string]string
|
|
splitKeys [][]byte
|
|
}
|
|
|
|
var defaultAttributes = map[string]string{
|
|
"BLOOMFILTER": "ROW",
|
|
"VERSIONS": "3",
|
|
"IN_MEMORY": "false",
|
|
"KEEP_DELETED_CELLS": "false",
|
|
"DATA_BLOCK_ENCODING": "FAST_DIFF",
|
|
"TTL": "2147483647",
|
|
"COMPRESSION": "NONE",
|
|
"MIN_VERSIONS": "0",
|
|
"BLOCKCACHE": "true",
|
|
"BLOCKSIZE": "65536",
|
|
"REPLICATION_SCOPE": "0",
|
|
}
|
|
|
|
// NewCreateTable creates a new CreateTable request that will create the given
|
|
// table in HBase. 'families' is a map of column family name to its attributes.
|
|
// For use by the admin client.
|
|
func NewCreateTable(ctx context.Context, table []byte,
|
|
families map[string]map[string]string,
|
|
options ...func(*CreateTable)) *CreateTable {
|
|
ct := &CreateTable{
|
|
base: base{
|
|
table: table,
|
|
ctx: ctx,
|
|
resultch: make(chan RPCResult, 1),
|
|
},
|
|
families: make(map[string]map[string]string, len(families)),
|
|
}
|
|
for _, option := range options {
|
|
option(ct)
|
|
}
|
|
for family, attrs := range families {
|
|
ct.families[family] = make(map[string]string, len(defaultAttributes))
|
|
for k, dv := range defaultAttributes {
|
|
if v, ok := attrs[k]; ok {
|
|
ct.families[family][k] = v
|
|
} else {
|
|
ct.families[family][k] = dv
|
|
}
|
|
}
|
|
}
|
|
return ct
|
|
}
|
|
|
|
// SplitKeys will return an option that will set the split keys for the created table
|
|
func SplitKeys(sk [][]byte) func(*CreateTable) {
|
|
return func(ct *CreateTable) {
|
|
ct.splitKeys = sk
|
|
}
|
|
}
|
|
|
|
// Name returns the name of this RPC call.
|
|
func (ct *CreateTable) Name() string {
|
|
return "CreateTable"
|
|
}
|
|
|
|
// ToProto converts the RPC into a protobuf message
|
|
func (ct *CreateTable) ToProto() proto.Message {
|
|
pbFamilies := make([]*pb.ColumnFamilySchema, 0, len(ct.families))
|
|
for family, attrs := range ct.families {
|
|
f := &pb.ColumnFamilySchema{
|
|
Name: []byte(family),
|
|
Attributes: make([]*pb.BytesBytesPair, 0, len(attrs)),
|
|
}
|
|
for k, v := range attrs {
|
|
f.Attributes = append(f.Attributes, &pb.BytesBytesPair{
|
|
First: []byte(k),
|
|
Second: []byte(v),
|
|
})
|
|
}
|
|
pbFamilies = append(pbFamilies, f)
|
|
}
|
|
return &pb.CreateTableRequest{
|
|
TableSchema: &pb.TableSchema{
|
|
TableName: &pb.TableName{
|
|
// TODO: handle namespaces
|
|
Namespace: []byte("default"),
|
|
Qualifier: ct.table,
|
|
},
|
|
ColumnFamilies: pbFamilies,
|
|
},
|
|
SplitKeys: ct.splitKeys,
|
|
}
|
|
}
|
|
|
|
// NewResponse creates an empty protobuf message to read the response of this
|
|
// RPC.
|
|
func (ct *CreateTable) NewResponse() proto.Message {
|
|
return &pb.CreateTableResponse{}
|
|
}
|