diff --git a/xorm/install.sh b/xorm/install.sh deleted file mode 100755 index e8455d2a..00000000 --- a/xorm/install.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -if [ ! -f install.sh ]; then -echo 'install must be run within its container folder' 1>&2 -exit 1 -fi - -CURDIR=`pwd` -NEWPATH="$GOPATH/src/github.com/lunny/xorm/${PWD##*/}" -if [ ! -d "$NEWPATH" ]; then -ln -s $CURDIR $NEWPATH -fi - -gofmt -w $CURDIR - -cd $NEWPATH -go install ${PWD##*/} -cd $CURDIR - -echo 'finished' diff --git a/xorm/shell.go b/xorm/shell.go new file mode 100644 index 00000000..7f4cb200 --- /dev/null +++ b/xorm/shell.go @@ -0,0 +1,121 @@ +package main + +import ( + "fmt" + "github.com/lunny/xorm" + "strings" +) + +var CmdShell = &Command{ + UsageLine: "shell driverName datasourceName", + Short: "a general shell to operate all kinds of database", + Long: ` +general database's shell for sqlite3, mysql, postgres. + + driverName Database driver name, now supported four: mysql mymysql sqlite3 postgres + datasourceName Database connection uri, for detail infomation please visit driver's project page +`, +} + +func init() { + CmdShell.Run = runShell + CmdShell.Flags = map[string]bool{} +} + +var engine *xorm.Engine + +func runShell(cmd *Command, args []string) { + if len(args) != 2 { + fmt.Println("params error, please see xorm help shell") + return + } + + var err error + engine, err = xorm.NewEngine(args[0], args[1]) + if err != nil { + fmt.Println(err) + return + } + + var scmd string + fmt.Print("xorm$ ") + for { + var input string + _, err := fmt.Scan(&input) + if err != nil { + fmt.Println(err) + continue + } + if strings.ToLower(input) == "exit" { + fmt.Println("bye") + return + } + if !strings.HasSuffix(input, ";") { + scmd = scmd + " " + input + continue + } + scmd = scmd + " " + input + lcmd := strings.TrimSpace(strings.ToLower(scmd)) + if strings.HasPrefix(lcmd, "select") { + res, err := engine.Query(scmd + "\n") + if err != nil { + fmt.Println(err) + } else { + if len(res) <= 0 { + fmt.Println("no records") + } else { + columns := make(map[string]int) + for k, _ := range res[0] { + columns[k] = len(k) + } + + for _, m := range res { + for k, s := range m { + l := len(string(s)) + if l > columns[k] { + columns[k] = l + } + } + } + + var maxlen = 0 + for _, l := range columns { + maxlen = maxlen + l + 3 + } + maxlen = maxlen + 1 + + fmt.Println(strings.Repeat("-", maxlen)) + fmt.Print("|") + slice := make([]string, 0) + for k, l := range columns { + fmt.Print(" " + k + " ") + fmt.Print(strings.Repeat(" ", l-len(k))) + fmt.Print("|") + slice = append(slice, k) + } + fmt.Print("\n") + for _, r := range res { + fmt.Print("|") + for _, k := range slice { + fmt.Print(" " + string(r[k]) + " ") + fmt.Print(strings.Repeat(" ", columns[k]-len(string(r[k])))) + fmt.Print("|") + } + fmt.Print("\n") + } + fmt.Println(strings.Repeat("-", maxlen)) + //fmt.Println(res) + } + } + } else { + cnt, err := engine.Exec(scmd) + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("%d records changed.\n", cnt) + } + } + scmd = "" + fmt.Print("xorm$ ") + } +} diff --git a/xorm/xorm.go b/xorm/xorm.go index 78583a6a..e19933d5 100644 --- a/xorm/xorm.go +++ b/xorm/xorm.go @@ -22,6 +22,7 @@ const go11tag = true // The order here is the order in which they are printed by 'gopm help'. var commands = []*Command{ CmdReverse, + CmdShell, } func init() {