Skip to content
This repository was archived by the owner on May 7, 2019. It is now read-only.

Add support for MS SQL Server #14

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions actions/addb.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions actions/init.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package actions

import (
"fmt"
"sync"

_ "github.com/denisenkom/go-mssqldb"
Expand Down Expand Up @@ -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
}

Expand Down
64 changes: 45 additions & 19 deletions actions/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package actions
import (
"errors"
"fmt"
"sort"
"strconv"
"strings"

Expand Down Expand Up @@ -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")
Expand All @@ -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"))
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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)
}
}
Expand Down