dotfiles/cdbm/cdbm.go

108 lines
1.8 KiB
Go

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)
}
}