func handleInteractiveMode() { currentUser, err := user.Current() if err != nil { log.Printf("Unable to determine home directory, history file disabled") } var liner = liner.NewLiner() defer liner.Close() LoadHistory(liner, currentUser) go signalCatcher(liner) for { line, err := liner.Prompt("tuq> ") if err != nil { break } if line == "" { continue } UpdateHistory(liner, currentUser, line) err = execute_internal(line, os.Stdout) if err != nil { log.Printf("%v", err) } } }
func HandleInteractiveMode(tiServer, prompt string) { // try to find a HOME environment variable homeDir := os.Getenv("HOME") if homeDir == "" { // then try USERPROFILE for Windows homeDir = os.Getenv("USERPROFILE") if homeDir == "" { fmt.Printf("Unable to determine home directory, history file disabled\n") } } var liner = liner.NewLiner() defer liner.Close() LoadHistory(liner, homeDir) go signalCatcher(liner) // state for reading a multi-line query queryLines := []string{} fullPrompt := prompt + QRY_PROMPT1 for { line, err := liner.Prompt(fullPrompt) if err != nil { break } line = strings.TrimSpace(line) if line == "" { continue } // Building query string mode: set prompt, gather current line fullPrompt = QRY_PROMPT2 queryLines = append(queryLines, line) // If the current line ends with a QRY_EOL, join all query lines, // trim off trailing QRY_EOL characters, and submit the query string: if strings.HasSuffix(line, QRY_EOL) { queryString := strings.Join(queryLines, " ") for strings.HasSuffix(queryString, QRY_EOL) { queryString = strings.TrimSuffix(queryString, QRY_EOL) } if queryString != "" { UpdateHistory(liner, homeDir, queryString+QRY_EOL) err = execute_internal(tiServer, queryString, os.Stdout) if err != nil { s_err := handleError(err, tiServer) fmt.Println(fgRed, "ERROR", s_err.Code(), ":", s_err, reset) } } // reset state for multi-line query queryLines = []string{} fullPrompt = prompt + QRY_PROMPT1 } } }
func HandleInteractiveMode(tiServer, prompt string) { // try to find a HOME environment variable homeDir := os.Getenv("HOME") if homeDir == "" { // then try USERPROFILE for Windows homeDir = os.Getenv("USERPROFILE") if homeDir == "" { fmt.Printf("Unable to determine home directory, history file disabled\n") } } var liner = liner.NewLiner() defer liner.Close() LoadHistory(liner, homeDir) go signalCatcher(liner) for { line, err := liner.Prompt(prompt + "> ") if err != nil { break } if line == "" { continue } UpdateHistory(liner, homeDir, line) err = execute_internal(tiServer, line, os.Stdout) if err != nil { clog.Error(err) } } }
func main() { flag.Parse() esURL, err := url.Parse(*esURLString) if err != nil { log.Fatalf("Unable to parse esURL: %s error: %v", esURL, err) } else { api.Protocol = esURL.Scheme colonIndex := strings.Index(esURL.Host, ":") if colonIndex < 0 { api.Domain = esURL.Host api.Port = "9200" } else { api.Domain = esURL.Host[0:colonIndex] api.Port = esURL.Host[colonIndex+1:] } } currentUser, err := user.Current() if err != nil { log.Printf("Unable to determine home directory, history file disabled") } var liner = liner.NewLiner() defer liner.Close() LoadHistory(liner, currentUser) go signalCatcher(liner) for { line, err := liner.Prompt("unql-couchbase> ") if err != nil { break } if line == "" { continue } UpdateHistory(liner, currentUser, line) query, err := processNextLine(line) if err != nil { log.Printf("%v", err) } else { if *debugGrammar { log.Printf("Query is: %#v", query) } if query.parsedSuccessfully { result, err := query.Execute() if err != nil { log.Printf("Error: %v", err) } else { FormatOutput(result) } } } } }
/* This method is used to handle user interaction with the cli. After combining the multi line input, it is sent to the execute_inpu method which parses and executes the input command. In the event an error is returned from the query execution, it is printed in red. The input prompt is the name of the executable. */ func HandleInteractiveMode(prompt string) { // Variables used for output to file var err error outputFile := os.Stdout prevFile := "" prevreset := command.Getreset() prevfgRed := command.GetfgRed() // If an output flag is defined if outputFlag != "" { prevFile = command.FILE_OUTPUT outputFile, err = os.OpenFile(command.FILE_OUTPUT, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) command.SetDispVal("", "") if err != nil { s_err := command.HandleError(errors.FILE_OPEN, err.Error()) command.PrintError(s_err) } defer outputFile.Close() command.SetWriter(io.Writer(outputFile)) } /* Find the HOME environment variable. If it isnt set then try USERPROFILE for windows. If neither is found then the cli cant find the history file to read from. */ homeDir = os.Getenv("HOME") if homeDir == "" { homeDir = os.Getenv("USERPROFILE") if homeDir == "" { _, werr := io.WriteString(command.W, "Unable to determine home directory, history file disabled\n") if werr != nil { s_err := command.HandleError(errors.WRITER_OUTPUT, werr.Error()) command.PrintError(s_err) } } } /* Create a new liner */ var liner = liner.NewLiner() defer liner.Close() /* Load history from Home directory */ err_code, err_string := LoadHistory(liner, homeDir) if err_code != 0 { s_err := command.HandleError(err_code, err_string) command.PrintError(s_err) } go signalCatcher(liner) // state for reading a multi-line query inputLine := []string{} fullPrompt := prompt + QRY_PROMPT1 // Handle the file input and script options here so as to add // the commands to the history. if scriptFlag != "" { //Execute the input command go_n1ql.SetPassthroughMode(true) // If outputting to a file, then add the statement to the file as well. if command.FILE_RW_MODE == true { _, werr := io.WriteString(command.W, scriptFlag+"\n") if werr != nil { s_err := command.HandleError(errors.WRITER_OUTPUT, werr.Error()) command.PrintError(s_err) } } err_code, err_str := execute_input(scriptFlag, command.W, false, liner) if err_code != 0 { s_err := command.HandleError(err_code, err_str) command.PrintError(s_err) liner.Close() os.Clearenv() os.Exit(1) } liner.Close() os.Clearenv() os.Exit(0) } if inputFlag != "" { //Read each line from the file and call execute query go_n1ql.SetPassthroughMode(true) input_command := "\\source " + inputFlag // If outputting to a file, then add the statement to the file as well. if command.FILE_RW_MODE == true { _, werr := io.WriteString(command.W, input_command+"\n") if werr != nil { s_err := command.HandleError(errors.WRITER_OUTPUT, werr.Error()) command.PrintError(s_err) } } errCode, errStr := execute_input(input_command, command.W, false, liner) if errCode != 0 { s_err := command.HandleError(errCode, errStr) command.PrintError(s_err) liner.Close() os.Clearenv() os.Exit(1) } liner.Close() os.Clearenv() os.Exit(0) } // End handling the options for { line, err := liner.Prompt(fullPrompt) if err != nil { break } line = strings.TrimSpace(line) if line == "" { continue } // Redirect command prevFile, outputFile = redirectTo(prevFile, prevreset, prevfgRed) if outputFile == os.Stdout { command.SetDispVal(prevreset, prevfgRed) command.SetWriter(os.Stdout) } else { if outputFile != nil { defer outputFile.Close() command.SetWriter(io.Writer(outputFile)) } } /* Check for shell comments : -- and #. Add them to the history but do not send them to be parsed. */ if strings.HasPrefix(line, "--") || strings.HasPrefix(line, "#") { err_code, err_string := UpdateHistory(liner, homeDir, line) if err_code != 0 { s_err := command.HandleError(err_code, err_string) command.PrintError(s_err) } continue } // Building query string mode: set prompt, gather current line fullPrompt = QRY_PROMPT2 inputLine = append(inputLine, line) /* If the current line ends with a QRY_EOL, join all query lines, trim off trailing QRY_EOL characters, and submit the query string. */ if strings.HasSuffix(line, QRY_EOL) { inputString := strings.Join(inputLine, " ") for strings.HasSuffix(inputString, QRY_EOL) { inputString = strings.TrimSuffix(inputString, QRY_EOL) } if inputString != "" { err_code, err_string := UpdateHistory(liner, homeDir, inputString+QRY_EOL) if err_code != 0 { s_err := command.HandleError(err_code, err_string) command.PrintError(s_err) } // If outputting to a file, then add the statement to the file as well. if command.FILE_RW_MODE == true { _, werr := io.WriteString(command.W, "\n"+inputString+"\n") if werr != nil { s_err := command.HandleError(errors.WRITER_OUTPUT, werr.Error()) command.PrintError(s_err) } } err_code, err_string = execute_input(inputString, command.W, true, liner) /* Error handling for Shell errors and errors recieved from go_n1ql. */ if err_code != 0 { s_err := command.HandleError(err_code, err_string) if err_code == errors.GON1QL_QUERY { //Dont print the error code for query errors. tmpstr := fmt.Sprintln(command.GetfgRed(), s_err, command.Getreset()) io.WriteString(command.W, tmpstr+"\n") } else { command.PrintError(s_err) } if *errorExitFlag == true { if first == false { first = true _, werr := io.WriteString(command.W, "Exiting on first error encountered\n") if werr != nil { s_err = command.HandleError(errors.WRITER_OUTPUT, werr.Error()) command.PrintError(s_err) } liner.Close() os.Clearenv() os.Exit(1) } } } /* For the \EXIT and \QUIT shell commands we need to make sure that we close the liner and then exit. In the event an error is returned from execute_input after the \EXIT command, then handle the error and exit with exit code 1 (which is for general errors). */ if EXIT == true { command.EXIT = false liner.Close() if err == nil { os.Exit(0) } else { os.Exit(1) } } } // reset state for multi-line query inputLine = []string{} fullPrompt = prompt + QRY_PROMPT1 } } }
/* This method is used to handle user interaction with the cli. After combining the multi line input, it is sent to the execute_inpu method which parses and executes the input command. In the event an error is returned from the query execution, it is printed in red. The input prompt is the name of the executable. */ func HandleInteractiveMode(prompt string) { /* Find the HOME environment variable. If it isnt set then try USERPROFILE for windows. If neither is found then the cli cant find the history file to read from. */ homeDir := os.Getenv("HOME") if homeDir == "" { homeDir = os.Getenv("USERPROFILE") if homeDir == "" { _, werr := io.WriteString(command.W, "Unable to determine home directory, history file disabled\n") if werr != nil { s_err := command.HandleError(errors.WRITER_OUTPUT, werr.Error()) command.PrintError(s_err) } } } /* Create a new liner */ var liner = liner.NewLiner() defer liner.Close() /* Load history from Home directory TODO : Once Histfile and Histsize are introduced then change this code */ err_code, err_string := LoadHistory(liner, homeDir) if err_code != 0 { s_err := command.HandleError(err_code, err_string) command.PrintError(s_err) } go signalCatcher(liner) // state for reading a multi-line query inputLine := []string{} fullPrompt := prompt + QRY_PROMPT1 for { line, err := liner.Prompt(fullPrompt) if err != nil { break } line = strings.TrimSpace(line) if line == "" { continue } /* Check for shell comments : -- and #. Add them to the history but do not send them to be parsed. */ if strings.HasPrefix(line, "--") || strings.HasPrefix(line, "#") { err_code, err_string := UpdateHistory(liner, homeDir, line) if err_code != 0 { s_err := command.HandleError(err_code, err_string) command.PrintError(s_err) } continue } // Building query string mode: set prompt, gather current line fullPrompt = QRY_PROMPT2 inputLine = append(inputLine, line) /* If the current line ends with a QRY_EOL, join all query lines, trim off trailing QRY_EOL characters, and submit the query string. */ if strings.HasSuffix(line, QRY_EOL) { inputString := strings.Join(inputLine, " ") for strings.HasSuffix(inputString, QRY_EOL) { inputString = strings.TrimSuffix(inputString, QRY_EOL) } if inputString != "" { err_code, err_string := UpdateHistory(liner, homeDir, inputString+QRY_EOL) if err_code != 0 { s_err := command.HandleError(err_code, err_string) command.PrintError(s_err) } err_code, err_string = execute_input(inputString, os.Stdout) /* Error handling for Shell errors and errors recieved from go_n1ql. */ if err_code != 0 { s_err := command.HandleError(err_code, err_string) if err_code == errors.GON1QL_QUERY { //Dont print the error code for query errors. tmpstr := fmt.Sprintln(fgRed, s_err, reset) io.WriteString(command.W, tmpstr+"\n") } else { command.PrintError(s_err) } if *errorExitFlag == true { if first == false { first = true _, werr := io.WriteString(command.W, "Exiting on first error encountered\n") if werr != nil { s_err = command.HandleError(errors.WRITER_OUTPUT, werr.Error()) command.PrintError(s_err) } liner.Close() os.Clearenv() os.Exit(1) } } } /* For the \EXIT and \QUIT shell commands we need to make sure that we close the liner and then exit. In the event an error is returned from execute_input after the \EXIT command, then handle the error and exit with exit code 1 (which is for general errors). */ if EXIT == true { command.EXIT = false liner.Close() if err == nil { os.Exit(0) } else { os.Exit(1) } } } // reset state for multi-line query inputLine = []string{} fullPrompt = prompt + QRY_PROMPT1 } } }
func handleInteractiveMode() { unqlParser := tuql.NewTuqlParser(*debugTokens, *debugGrammar, *crashHard) naivePlanner := naiveplanner.NewNaivePlanner() naiveOptimizer := naiveoptimizer.NewNaiveOptimizer() nullOptimizer := nulloptimizer.NewNullOptimizer() currentUser, err := user.Current() if err != nil { log.Printf("Unable to determine home directory, history file disabled") } var liner = liner.NewLiner() defer liner.Close() LoadHistory(liner, currentUser) go signalCatcher(liner) for { line, err := liner.Prompt("tuq> ") if err != nil { break } if line == "" { continue } UpdateHistory(liner, currentUser, line) query, err := unqlParser.Parse(line) if err != nil { log.Printf("%v", err) } else { if *debugGrammar { log.Printf("Query is: %#v", query) } if query.WasParsedSuccessfully() { // check to make sure the query is semantically valid err := query.Validate() if err != nil { log.Printf("%v", err) } else { plans := naivePlanner.Plan(*query) if plans != nil { var plan planner.Plan if *disableOptimizer { plan = nullOptimizer.Optimize(plans) } else { plan = naiveOptimizer.Optimize(plans) } if query.IsExplainOnly { result := plan.Explain() if err != nil { log.Printf("Error: %v", err) } else { FormatChannelOutput(result, os.Stdout) } } else { result := plan.Run() if err != nil { log.Printf("Error: %v", err) } else { FormatChannelOutput(result, os.Stdout) } } } } } } } }