1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-04-02 22:25:48 +02:00

86 lines
1.3 KiB
Go
Raw Normal View History

2018-09-25 21:49:42 -04:00
package cli
2018-09-18 16:42:38 -04:00
import (
"context"
"fmt"
"io/ioutil"
"os"
2018-09-28 00:28:33 -04:00
"os/signal"
"github.com/MontFerret/ferret/pkg/compiler"
"github.com/MontFerret/ferret/pkg/runtime"
"github.com/MontFerret/ferret/pkg/runtime/logging"
2018-09-18 16:42:38 -04:00
)
func ExecFile(pathToFile string, opts Options) {
2018-09-18 16:42:38 -04:00
query, err := ioutil.ReadFile(pathToFile)
if err != nil {
2020-08-25 01:33:10 -04:00
fmt.Fprintln(os.Stderr, err)
2018-09-18 16:42:38 -04:00
os.Exit(1)
return
}
Exec(string(query), opts)
}
func Exec(query string, opts Options) {
2018-09-18 16:42:38 -04:00
ferret := compiler.New()
prog, err := ferret.Compile(query)
2018-09-18 16:42:38 -04:00
if err != nil {
fmt.Fprintln(os.Stderr, "Failed to compile the query")
fmt.Fprintln(os.Stderr, err)
2018-09-18 16:42:38 -04:00
os.Exit(1)
return
}
2018-09-28 00:28:33 -04:00
l := NewLogger()
ctx, cancel := opts.WithContext(context.Background())
2018-09-28 00:28:33 -04:00
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
signal.Notify(c, os.Kill)
2018-09-28 00:28:33 -04:00
go func() {
for {
<-c
cancel()
l.Close()
}
}()
var timer *Timer
if opts.ShowTime {
timer = NewTimer()
timer.Start()
}
out, err := prog.Run(
2018-09-28 00:28:33 -04:00
ctx,
runtime.WithLog(l),
runtime.WithLogLevel(logging.DebugLevel),
2018-09-28 21:04:16 -04:00
runtime.WithParams(opts.Params),
)
2018-09-18 16:42:38 -04:00
if opts.ShowTime {
timer.Stop()
}
2018-09-18 16:42:38 -04:00
if err != nil {
fmt.Fprintln(os.Stderr, "Failed to execute the query")
fmt.Fprintln(os.Stderr, err)
2018-09-18 16:42:38 -04:00
os.Exit(1)
return
}
fmt.Println(string(out))
if opts.ShowTime {
fmt.Println(timer.Print())
}
2018-09-18 16:42:38 -04:00
}