Files
tidb/util/printer/printer.go
2015-09-06 12:08:47 +08:00

130 lines
3.1 KiB
Go

// Copyright 2015 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
package printer
import (
"bytes"
"fmt"
)
// Version information.
var (
TiDBBuildTS = "None"
TiDBGitHash = "None"
)
// PrintTiDBInfo prints the TiDB version information.
func PrintTiDBInfo() {
fmt.Printf("Welcome to the TiDB.\n")
fmt.Printf("Version:\n")
fmt.Printf("Git Commit Hash: %s\n", TiDBGitHash)
fmt.Printf("UTC Build Time: %s\n", TiDBBuildTS)
fmt.Printf("\n")
}
// checkValidity checks whether cols and every data have the same length.
func checkValidity(cols []string, datas [][]string) bool {
colLen := len(cols)
if len(datas) == 0 || colLen == 0 {
return false
}
for _, data := range datas {
if colLen != len(data) {
return false
}
}
return true
}
func getMaxColLen(cols []string, datas [][]string) []int {
maxColLen := make([]int, len(cols))
for i, col := range cols {
maxColLen[i] = len(col)
}
for _, data := range datas {
for i, v := range data {
if len(v) > maxColLen[i] {
maxColLen[i] = len(v)
}
}
}
return maxColLen
}
func getPrintDivLine(maxColLen []int) []byte {
var value []byte
for _, v := range maxColLen {
value = append(value, '+')
value = append(value, bytes.Repeat([]byte{'-'}, v+2)...)
}
value = append(value, '+')
value = append(value, '\n')
return value
}
func getPrintCol(cols []string, maxColLen []int) []byte {
var value []byte
for i, v := range cols {
value = append(value, '|')
value = append(value, ' ')
value = append(value, []byte(v)...)
value = append(value, bytes.Repeat([]byte{' '}, maxColLen[i]+1-len(v))...)
}
value = append(value, '|')
value = append(value, '\n')
return value
}
func getPrintRow(data []string, maxColLen []int) []byte {
var value []byte
for i, v := range data {
value = append(value, '|')
value = append(value, ' ')
value = append(value, []byte(v)...)
value = append(value, bytes.Repeat([]byte{' '}, maxColLen[i]+1-len(v))...)
}
value = append(value, '|')
value = append(value, '\n')
return value
}
func getPrintRows(datas [][]string, maxColLen []int) []byte {
var value []byte
for _, data := range datas {
value = append(value, getPrintRow(data, maxColLen)...)
}
return value
}
// GetPrintResult gets a result with a formatted string.
func GetPrintResult(cols []string, datas [][]string) (string, bool) {
if !checkValidity(cols, datas) {
return "", false
}
var value []byte
maxColLen := getMaxColLen(cols, datas)
value = append(value, getPrintDivLine(maxColLen)...)
value = append(value, getPrintCol(cols, maxColLen)...)
value = append(value, getPrintDivLine(maxColLen)...)
value = append(value, getPrintRows(datas, maxColLen)...)
value = append(value, getPrintDivLine(maxColLen)...)
return string(value), true
}