123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- // 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{}
- }
|