github.com/mithrandie/csvq@v1.18.1/lib/action/fields.go (about)

     1  package action
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  
     7  	"github.com/mithrandie/csvq/lib/parser"
     8  	"github.com/mithrandie/csvq/lib/query"
     9  )
    10  
    11  func ShowFields(ctx context.Context, proc *query.Processor, filename string) error {
    12  	if len(filename) < 1 {
    13  		e := parser.NewSyntaxError("file name is empty", parser.Token{})
    14  		return query.NewSyntaxError(e.(*parser.SyntaxError))
    15  	}
    16  
    17  	var filePath parser.QueryExpression = parser.Identifier{Literal: filename}
    18  	path, err := query.CreateFilePath(filePath.(parser.Identifier), proc.Tx.Flags.Repository)
    19  	if err != nil {
    20  		return query.NewIOError(filePath, err.Error())
    21  	}
    22  
    23  	if _, err = os.Stat(path); err != nil {
    24  		statements, _, err := parser.Parse("SELECT 1 FROM "+filename, "", false, proc.Tx.Flags.AnsiQuotes)
    25  		if err != nil {
    26  			return query.NewFileNotExistError(filePath)
    27  		}
    28  
    29  		q := statements[0].(parser.SelectQuery)
    30  		filePath = q.SelectEntity.(parser.SelectEntity).FromClause.(parser.FromClause).Tables[0].(parser.Table).Object
    31  		filePath.ClearBaseExpr()
    32  	}
    33  
    34  	statements := []parser.Statement{
    35  		parser.ShowFields{
    36  			Type:  parser.Identifier{Literal: "FIELDS"},
    37  			Table: filePath,
    38  		},
    39  	}
    40  
    41  	execCtx := context.WithValue(ctx, "CallFromSubcommand", true)
    42  	_, err = proc.Execute(execCtx, statements)
    43  	return err
    44  }