diff --git a/actions/addb.go b/actions/addb.go index 9655f65..004dd27 100644 --- a/actions/addb.go +++ b/actions/addb.go @@ -47,6 +47,9 @@ func (c *Addb) Post() { if engine.Driver == "sqlite3" { engine.DataSource = host + } else if engine.Driver == "mssql" { + engine.DataSource = fmt.Sprintf("server=%s;port=%s;user id=%s;password=%s;database=%s", + host, port, username, passwd, dbname) } else { engine.DataSource = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", username, passwd, host, port, dbname) diff --git a/actions/init.go b/actions/init.go index eb6415b..e2d9042 100644 --- a/actions/init.go +++ b/actions/init.go @@ -1,6 +1,7 @@ package actions import ( + "fmt" "sync" _ "github.com/denisenkom/go-mssqldb" @@ -35,6 +36,7 @@ func GetOrm(engine *models.Engine) *xorm.Engine { var err error o, err = xorm.NewEngine(engine.Driver, engine.DataSource) if err != nil { + fmt.Println(err) return nil } diff --git a/actions/view.go b/actions/view.go index 210c32b..f85391b 100644 --- a/actions/view.go +++ b/actions/view.go @@ -3,6 +3,7 @@ package actions import ( "errors" "fmt" + "sort" "strconv" "strings" @@ -36,6 +37,11 @@ func (c *View) Get() error { return err } + // Sort tables by name. + sort.Slice(tables, func(i, j int) bool { + return tables[i].Name < tables[j].Name + }) + var records = make([][]*string, 0) var columns = make([]*core.Column, 0) tb := c.Req().FormValue("tb") @@ -49,9 +55,11 @@ func (c *View) Get() error { var table *core.Table var pkIdx int var isExecute bool + var hasRowNum bool var affected int64 var total int var countSql string + var execSql string var args = make([]interface{}, 0) start, _ := strconv.Atoi(c.Req().FormValue("start")) @@ -60,32 +68,53 @@ func (c *View) Get() error { limit = 20 } if sql != "" || tb != "" { + hasRowNum = false if sql != "" { isExecute = !strings.HasPrefix(strings.ToLower(sql), "select") + execSql = sql } else if tb != "" { - countSql = "select count(*) from `" + tb + "`" - sql = fmt.Sprintf("select * from `"+tb+"` LIMIT %d OFFSET %d", limit, start) - //args = append(args, []interface{}{limit, start}...) + for _, tt := range tables { + if tb == tt.Name { + table = tt + break + } + } + countSql = "select count(*) from " + tb + if engine.Driver == "mssql" { + orderBy := "" + pkCols := table.PKColumns() + for _, pk := range pkCols { + if len(orderBy) > 0 { + orderBy += ", " + pk.Name + } else { + orderBy = pk.Name + } + } + hasRowNum = true + sql = "SELECT * FROM "+tb + execSql = fmt.Sprintf("SELECT TOP %d * FROM (SELECT ROW_NUMBER() OVER(ORDER BY "+orderBy+") AS RowNumber"+ + ", * FROM "+tb+") AS Res WHERE RowNumber > %d", limit, start) + } else { + execSql = fmt.Sprintf("select * from "+tb+" LIMIT %d OFFSET %d", limit, start) + } } else { return errors.New("unknow operation") } if isExecute { - res, err := o.Exec(sql) + res, err := o.Exec(execSql) if err != nil { return err } affected, _ = res.RowsAffected() } else { if len(countSql) > 0 { - err = o.DB().QueryRow(countSql).Scan(&total) - if err != nil { + if err = o.DB().QueryRow(countSql).Scan(&total); err != nil { return err } - fmt.Println("total records:", total) } - rows, err := o.DB().Query(sql, args...) + rows, err := o.DB().Query(execSql, args...) if err != nil { return err } @@ -96,16 +125,10 @@ func (c *View) Get() error { return err } - if len(tb) > 0 { - for _, tt := range tables { - if tb == tt.Name { - table = tt - break - } - } - if table != nil { - for i, col := range cols { - c := table.GetColumn(col) + if table != nil { + for i, col := range cols { + c := table.GetColumn(col) + if c != nil { if len(table.PKColumns()) == 1 && c.IsPrimaryKey { pkIdx = i } @@ -121,11 +144,14 @@ func (c *View) Get() error { } for rows.Next() { - datas := make([]*string, len(columns)) + datas := make([]*string, len(cols)) err = rows.ScanSlice(&datas) if err != nil { return err } + if hasRowNum { + datas = datas[1:] + } records = append(records, datas) } }