Files
steampipe/display/column.go

85 lines
2.2 KiB
Go

package display
import (
"database/sql"
"encoding/json"
"fmt"
"time"
"github.com/ahmetb/go-linq"
typeHelpers "github.com/turbot/go-kit/types"
"github.com/turbot/steampipe/constants"
)
// ColumnNames :: extract names from columns
func ColumnNames(columns []*sql.ColumnType) []string {
var colNames []string
linq.From(columns).SelectT(func(c *sql.ColumnType) string { return c.Name() }).ToSlice(&colNames)
return colNames
}
// ColumnValuesAsString :: converts a slice of columns into strings
func ColumnValuesAsString(values []interface{}, columns []*sql.ColumnType) ([]string, error) {
rowAsString := make([]string, len(columns))
for idx, val := range values {
val, err := ColumnValueAsString(val, columns[idx])
if err != nil {
return nil, err
}
rowAsString[idx] = val
}
return rowAsString, nil
}
// ColumnValueAsString :: convert column value to string
func ColumnValueAsString(val interface{}, colType *sql.ColumnType) (result string, err error) {
defer func() {
if r := recover(); r != nil {
result = fmt.Sprintf("%v", val)
}
}()
if val == nil {
return constants.NullString, nil
}
//log.Printf("[TRACE] ColumnValueAsString type %s", colType.DatabaseTypeName())
// possible types for colType are defined in pq/oid/types.go
switch colType.DatabaseTypeName() {
case "JSON", "JSONB":
bytes, err := json.Marshal(val)
if err != nil {
return "", err
}
return string(bytes), nil
case "TIMESTAMP", "DATE", "TIME", "INTERVAL":
t, ok := val.(time.Time)
if ok {
return t.Format("2006-01-02 15:04:05"), nil
}
fallthrough
case "NAME":
result := string(val.([]uint8))
return result, nil
default:
return typeHelpers.ToString(val), nil
}
}
// segregate data types, ignore string conversion for certain data types :
// JSON, JSONB, BOOL and so on..
func ParseJSONOutputColumnValue(val interface{}, colType *sql.ColumnType) (interface{}, error) {
if val == nil {
return constants.NullString, nil
}
switch colType.DatabaseTypeName() {
// we can revise/increment the list of DT's in future
case "JSON", "JSONB", "BOOL", "INT2", "INT4", "INT8", "FLOAT8", "FLOAT4":
return val, nil
default:
return ColumnValueAsString(val, colType)
}
}