package main import ( "bufio" "flag" "fmt" "os" "strings" "github.com/gocql/gocql" ) func main() { configPath := flag.String("config", os.Getenv("HOME")+"/.config/cqlminus/config.json", "path to json config file") flag.Parse() cfg, err := LoadConfig(*configPath) if err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } session, err := Connect(cfg) if err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } defer session.Close() fmt.Printf("connected to %s:%d keyspace=%s\n", cfg.Server, cfg.Port, cfg.Keyspace) fmt.Println("enter CQL queries, terminate with ; then enter. type exit or quit to leave.") runLoop(session) } func runLoop(session *gocql.Session) { reader := bufio.NewReader(os.Stdin) var buffer strings.Builder for { if buffer.Len() == 0 { fmt.Print("cql> ") } else { fmt.Print("...> ") } line, err := reader.ReadString('\n') if err != nil { fmt.Println() return } trimmed := strings.TrimSpace(line) if buffer.Len() == 0 { lower := strings.ToLower(trimmed) if lower == "exit" || lower == "quit" { return } if trimmed == "" { continue } } buffer.WriteString(line) if !strings.HasSuffix(trimmed, ";") { continue } query := strings.TrimSpace(buffer.String()) query = strings.TrimSuffix(query, ";") buffer.Reset() if query == "" { continue } result, err := RunQuery(session, query) if err != nil { PrintError(err) continue } PrintTable(result) } }