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.
112 lines
2.9 KiB
112 lines
2.9 KiB
// 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{} |
|
}
|
|
|