aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoop Kiefte <ikojba@gmail.com>2023-09-28 01:02:19 +0100
committerJoop Kiefte <ikojba@gmail.com>2023-09-28 01:02:19 +0100
commit012ebe6bf6567fe14af8fbf9030805e529dd0ef7 (patch)
treed387e6f95857509714846cc06d832a0f80cf3221
parent7424e6c27b41a75e23560d4ec38fcacd1fd71157 (diff)
Rough version of debby
-rw-r--r--main.go148
1 files changed, 146 insertions, 2 deletions
diff --git a/main.go b/main.go
index e9c733f..5acae02 100644
--- a/main.go
+++ b/main.go
@@ -1,7 +1,151 @@
+// Debby is a command line tool that links your dolt database to visidata
package main
-import "fmt"
+import (
+ "fmt"
+ "os"
+ "os/exec"
+ "strings"
+ "sync"
+)
func main() {
- fmt.Println("Hello, I'm Debby. Come back later!")
+ // Menu loop. 1. Read tale names 2. Run query 3. Run and save query 4. Execute Dolt command 5. Exit
+ for {
+ // Print menu
+ fmt.Println("1. Read table names")
+ fmt.Println("2. Run query")
+ fmt.Println("3. Run and save query")
+ fmt.Println("4. Execute Dolt command")
+ fmt.Println("5. Exit")
+ fmt.Print("Enter your choice: ")
+
+ // Read user input
+ var choice int
+ fmt.Scanln(&choice)
+
+ // Execute choice
+ switch choice {
+ case 1:
+ // Read table names
+ ReadTableNames()
+ case 2:
+ // Request query
+ fmt.Print("Enter your query: ")
+ var query string
+ fmt.Scanln(&query)
+
+ // Table name will be empty. Run query
+ RunSQL(query, "")
+ case 3:
+ // Request query
+ fmt.Print("Enter your query: ")
+ var query string
+ fmt.Scanln(&query)
+
+ // Request table name
+ fmt.Print("Enter your table name: ")
+ var table string
+ fmt.Scanln(&table)
+
+ // Run query
+ RunSQL(query, table)
+ case 4:
+ // Request command
+ fmt.Print("dolt ")
+ var args string
+ fmt.Scanln(&args)
+
+ // Execute command
+ ExecuteDoltCommand(args)
+ case 5:
+ // Exit
+ return
+ default:
+ // Invalid choice
+ fmt.Println("Invalid choice")
+ }
+ }
+}
+
+func ExecuteDoltCommand(args string...) {
+ cmd := exec.Command("dolt", args...)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.Stdin = os.Stdin
+ cmd.Run()
+}
+
+func SaveToTable(table, file string) error {
+ // Run dolt table import -r table file
+ cmd := exec.Command("dolt", "table", "import", "-r", table, file)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.Stdin = os.Stdin
+ return cmd.Run()
+}
+
+func ReadTableNames() {
+ // Run dolt ls
+ cmd := exec.Command("dolt", "ls")
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.Stdin = os.Stdin
+ return cmd.Run()
}
+
+func RunSQL(query, table string) err error {
+ // Create a temporary file to open in visidata
+ f, err := os.CreateTemp("", "debby-*.sql")
+ if err != nil {
+ return err
+ }
+ defer os.Remove(f.Name())
+
+ // Run the query and write the output to the file
+ cmd := exec.Command("dolt", "sql", "-q", query, "-r", "csv")
+ cmd.Stdout = f
+ err = cmd.Run()
+ if err != nil {
+ return err
+ }
+
+ // Open the file in visidata
+ OpenVisidata(f.Name(), "-f", "csv")
+
+ // If table is not empty, save the file to the table
+ if table != "" {
+ err = SaveToTable(table, f.Name())
+ if err != nil {
+ return err
+ }
+ }
+
+ // Read the file back into memory
+ return nil
+}
+
+
+func OpenVisidata(args string...) {
+ vdcmd := os.Getenv("EDITOR")
+ sync.Once.Do(func() {
+ // run with --version and check if it returns saul.pw/Visidata, if not try the same with visidata instead
+ for _, cmd := range []string{"vd", "visidata"} {
+ out, err := exec.Command(cmd, "--version").Output()
+ if err != nil {
+ continue
+ }
+ if strings.Contains(string(out), "saul.pw/Visidata") {
+ vdcmd = cmd
+ break
+ }
+ }
+ }
+
+ cmd := exec.Command(vdcmd, args...)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.Stdin = os.Stdin
+ cmd.Run()
+}
+