diff --git a/cdbm.go b/cdbm.go new file mode 100644 index 0000000..ae5cbbf --- /dev/null +++ b/cdbm.go @@ -0,0 +1,107 @@ +package main + +import ( + "database/sql" + "flag" + "fmt" + "github.com/manifoldco/promptui" + _ "github.com/mattn/go-sqlite3" + "os" + "os/user" + "path" +) + +func main() { + addMode := flag.Bool("add", false, + "addition mode") + flag.Parse() + + db, err := + sql.Open("sqlite3", dbPath()) + panicOnErr(err) + defer db.Close() + + _, err = os.Stat(dbPath()) + if os.IsNotExist(err) { + create(db) + } + + dir, err := os.Getwd() + panicOnErr(err) + + if *addMode { + dirInsert(db, dir) + } else { + items := dirList(db) + prompt := promptui.Select{ + Label: "Pick a directory", + Items: items, + } + + _, result, err := prompt.Run() + panicOnErr(err) + + fmt.Fprintf(os.Stderr, + "%s\n", result) + } +} + +func dirList(db *sql.DB) []string { + items := []string{} + + rows, err := db.Query(`SELECT dir FROM + dirs ORDER BY date DESC LIMIT 10`) + panicOnErr(err) + + usr, err := user.Current() + panicOnErr(err) + + for rows.Next() { + var dir string + err = rows.Scan(&dir) + panicOnErr(err) + items = append(items, dir) + } + + if len(items) == 0 { + items = append(items, usr.HomeDir) + } else if len(items) > 1 { + items = items[1:] // skip first + } + + return items +} + +func create(db *sql.DB) { + _, err := db.Exec(`CREATE TABLE dirs + (dir text, date text)`) + panicOnErr(err) + + _, err = db.Exec(`CREATE UNIQUE INDEX + idx ON dirs (dir)`) + panicOnErr(err) +} + +func dirInsert(db *sql.DB, dir string) { + stmt, err := db.Prepare(`REPLACE INTO + dirs(dir, date) + VALUES(?, datetime('now'))`) + panicOnErr(err) + + _, err = stmt.Exec(dir) + panicOnErr(err) +} + +func dbPath() string { + var dbFile = ".cdbm.db" + + usr, err := user.Current() + panicOnErr(err) + return path.Join(usr.HomeDir, dbFile) +} + +func panicOnErr(err error) { + if err != nil { + panic(err) + } +}