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  }