package main import ( "os" "fmt" "log" "flag" db "sanine.net/git/phlox/db" ) var p *db.Phlox type Params struct { DbFilename string } var params Params type Command struct { Set bool Value int Flag string Usage string Invoke func() } func RegisterCommand(val int, cmd *Command) { cmd.Value = val flag.BoolVar(&(*cmd).Set, cmd.Flag, false, cmd.Usage) } func OpenDb() { err := p.Open(params.DbFilename) if err != nil { log.Fatal(err) } } func main() { p = &db.Phlox{} cmds := map[int]*Command{ 1: Create(), 2: SchemaVersion(), 3: CreateUser(), 4: DeleteUser(), 5: UpdatePassword(), 6: ListUsers(), } for val, cmd := range cmds { RegisterCommand(val, cmd) } flag.StringVar(¶ms.DbFilename, "db", "phlox.conf", "select the db file to operate on") flag.Parse() for _, cmd := range cmds { if cmd.Set { cmd.Invoke(); os.Exit(0); } } log.Fatal("no command specified!") } func Create() *Command { return &Command{ Flag: "create", Usage: "create a new database", Invoke: func() { err := p.Create(params.DbFilename) if err != nil { log.Fatal(err) } fmt.Printf("created database %v\n", params.DbFilename) }, } } func SchemaVersion() *Command { return &Command{ Flag: "schema-version", Usage: "get the schema version", Invoke: func() { err := p.Open(params.DbFilename) if err != nil { log.Fatal(err) } version, err := p.GetSchemaVersion() if err != nil { log.Fatal(err) } fmt.Printf("schema version: %v\n", version) }, } }