github.com/wsand02/massren@v1.5.5-0.20191104203215-f721006d1e4e/profile.go (about) 1 package main 2 3 import ( 4 "database/sql" 5 "errors" 6 "fmt" 7 "os" 8 "os/user" 9 "path/filepath" 10 11 "github.com/laurent22/go-sqlkv" 12 _ "github.com/mattn/go-sqlite3" 13 ) 14 15 const PROFILE_PERM = 0700 16 17 var homeDir_ string 18 var profileFolder_ string 19 var config_ *sqlkv.SqlKv 20 var profileDb_ *sql.DB 21 22 func profileOpen() error { 23 if profileDb_ != nil { 24 return nil 25 } 26 27 var err error 28 profileDb_, err = sql.Open("sqlite3", profileFile()) 29 if err != nil { 30 return errors.New(fmt.Sprintf("Profile file could not be opened: %s: %s", err, profileFile())) 31 } 32 33 _, err = profileDb_.Exec("CREATE TABLE IF NOT EXISTS history (id INTEGER NOT NULL PRIMARY KEY, source TEXT, destination TEXT, timestamp INTEGER)") 34 if err != nil { 35 return errors.New(fmt.Sprintf("History table could not be created: %s", err)) 36 } 37 38 profileDb_.Exec("CREATE INDEX id_index ON history (id)") 39 profileDb_.Exec("CREATE INDEX destination_index ON history (destination)") 40 profileDb_.Exec("CREATE INDEX timestamp_index ON history (timestamp)") 41 42 config_ = sqlkv.New(profileDb_, "config") 43 44 return nil 45 } 46 47 func profileClose() { 48 config_ = nil 49 if profileDb_ != nil { 50 profileDb_.Close() 51 profileDb_ = nil 52 } 53 profileFolder_ = "" 54 } 55 56 // Used only for debugging 57 func profileDelete() { 58 profileFolder := profileFolder_ // profileFolder_ is going to be cleared in profileClose() 59 profileClose() 60 os.RemoveAll(profileFolder) 61 } 62 63 func profileFolder() string { 64 if profileFolder_ != "" { 65 return profileFolder_ 66 } 67 68 if homeDir_ == "" { 69 // By default, use $HOME as it seems to be different from HomeDir in some 70 // systems. In particular it's necessary to pass Homebrew's tests. 71 homeDir_ = os.Getenv("HOME") 72 73 if homeDir_ == "" { 74 u, err := user.Current() 75 if err != nil { 76 panic(err) 77 } 78 homeDir_ = u.HomeDir 79 } 80 } 81 82 output := filepath.Join(homeDir_, ".config", APPNAME) 83 84 err := os.MkdirAll(output, PROFILE_PERM) 85 if err != nil { 86 panic(err) 87 } 88 89 profileFolder_ = output 90 return profileFolder_ 91 } 92 93 func profileFile() string { 94 return filepath.Join(profileFolder(), "profile.sqlite") 95 } 96 97 func handleConfigCommand(opts *CommandLineOptions, args []string) error { 98 if len(args) == 0 { 99 kvs := config_.All() 100 for _, kv := range kvs { 101 fmt.Printf("%s = \"%s\"\n", kv.Name, kv.Value) 102 } 103 return nil 104 } 105 106 name := args[0] 107 108 if len(args) == 1 { 109 config_.Del(name) 110 logInfo("Config has been changed: deleted key \"%s\"", name) 111 return nil 112 } 113 114 value := args[1] 115 116 config_.SetString(name, value) 117 logInfo("Config has been changed: %s = \"%s\"", name, value) 118 return nil 119 }