Skip to content

Commit

Permalink
Merge pull request #12 from juaismar/juanito/feat/enableSQLserver
Browse files Browse the repository at this point in the history
Juanito/feat/enable sqlserver
  • Loading branch information
juaismar authored Jan 4, 2023
2 parents 0ae7d6b + 03ab71e commit 5a6d7a2
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 43 deletions.
70 changes: 39 additions & 31 deletions SSP.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ import (

var dialect = ""

const asc = "asc NULLS FIRST"
const desc = "desc NULLS LAST"

// Data is a line in map that link the database field with datatable field
type Data struct {
Db string //name of column
Expand Down Expand Up @@ -390,14 +387,8 @@ func order(c Controller, columns []Data) func(db *gorm.DB) *gorm.DB {
columnIdxTittle = fmt.Sprintf("order[%d][dir]", i)
requestColumnData = c.GetString(columnIdxTittle)

order := "desc"
if requestColumnData == "asc" {
order = "asc"
}

order = checkOrderDialect(order)
query := checkOrderDialect(column.Db, requestColumnData)

query := fmt.Sprintf("%s %s", column.Db, order)
db = db.Order(query)
} else {
if columnIdx < 0 && c.GetString(columnIdxTittle) == "true" {
Expand All @@ -409,18 +400,29 @@ func order(c Controller, columns []Data) func(db *gorm.DB) *gorm.DB {
return db
}
}
func checkOrderDialect(order string) string {
if isSQLite(dialect) {
func checkOrderDialect(column, order string) string {
const asc = "ASC NULLS FIRST"
const desc = "DESC NULLS LAST"

switch {
case isSQLite(dialect):
if order == "asc" {
return desc
return fmt.Sprintf("%s %s", column, desc)
}
return asc
}

if order == "asc" {
return asc
return fmt.Sprintf("%s %s", column, asc)
case dialect == "sqlserver":
if order == "asc" {
//(CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] ASC
return fmt.Sprintf("%s COLLATE SQL_Latin1_General_Cp1_CS_AS ASC", column)
}
//(CASE WHEN [Order] IS NULL THEN 1 ELSE 0 END), [Order] DESC
return fmt.Sprintf("%s COLLATE SQL_Latin1_General_Cp1_CS_AS DESC", column)
default:
if order == "asc" {
return fmt.Sprintf("%s %s", column, asc)
}
return fmt.Sprintf("%s %s", column, desc)
}
return desc
}

func limit(c Controller) func(db *gorm.DB) *gorm.DB {
Expand All @@ -435,6 +437,9 @@ func limit(c Controller) func(db *gorm.DB) *gorm.DB {
if err != nil || length < 0 {
length = 10
}
if length == 0 {
length = 1
}

return db.Offset(start).Limit(length)
}
Expand Down Expand Up @@ -483,7 +488,11 @@ func bindingTypesQuery(searching, columndb, value string, columnInfo *sql.Column
}

if column.Cs {
if dialect == "sqlserver" {
return fmt.Sprintf("%s COLLATE SQL_Latin1_General_Cp1_CS_AS LIKE ?", columndb), "%" + value + "%"
}
return fmt.Sprintf("%s LIKE ?", columndb), "%" + value + "%"

}
return fmt.Sprintf("Lower(%s) LIKE ?", columndb), "%" + strings.ToLower(value) + "%"
case "UUID", "blob":
Expand All @@ -500,14 +509,10 @@ func bindingTypesQuery(searching, columndb, value string, columnInfo *sql.Column
return "", ""
}
return fmt.Sprintf("%s = ?", columndb), intval
case "bool", "BOOL", "numeric":
boolval, err := strconv.ParseBool(value)
queryval := "NOT"
if err == nil && boolval {
queryval = ""
}
return fmt.Sprintf("%s IS %s TRUE", columndb, queryval), ""
case "REAL", "NUMERIC":
case "bool", "BOOL", "numeric", "BIT":
boolval, _ := strconv.ParseBool(value)
return columndb, boolval
case "REAL", "NUMERIC", "FLOAT":
if isRegEx {
return regExp(fmt.Sprintf("CAST(%s AS TEXT)", columndb), value)
}
Expand All @@ -530,6 +535,9 @@ func regExp(columndb, value string) (string, string) {
return fmt.Sprintf("Lower(%s) LIKE ?", columndb), "%" + strings.ToLower(value) + "%"
case "postgres":
return fmt.Sprintf("%s ~* ?", columndb), value
case "sqlserver":
//TODO make regexp
return fmt.Sprintf("%s LIKE ?", columndb), value
default:
return fmt.Sprintf("%s ~* ?", columndb), value
}
Expand Down Expand Up @@ -599,7 +607,7 @@ func getFieldsSearch(searching, key string, val interface{}, vType reflect.Type)
default:
return val.(int64), nil
}
case "NUMERIC", "REAL":
case "NUMERIC", "REAL", "FLOAT":
switch vType.String() {
case "[]uint8":
return strconv.ParseFloat(string(val.([]uint8)), 64)
Expand All @@ -610,7 +618,7 @@ func getFieldsSearch(searching, key string, val interface{}, vType reflect.Type)
default:
return val, nil
}
case "bool", "BOOL", "numeric":
case "bool", "BOOL", "numeric", "BIT":
switch vType.String() {
case "int64":
return val.(int64) == 1, nil
Expand All @@ -620,7 +628,7 @@ func getFieldsSearch(searching, key string, val interface{}, vType reflect.Type)
return val, nil
}

case "TIMESTAMPTZ", "datetime":
case "TIMESTAMPTZ", "datetime", "DATETIMEOFFSET":
return val.(time.Time), nil
case "UUID", "uuid", "blob":
switch vType.String() {
Expand Down Expand Up @@ -653,7 +661,7 @@ func initBinding(db *gorm.DB, selectQuery, table string, whereJoin map[string]st
Scopes(
setJoins(whereJoin),
).
Limit(0).
Limit(1).
Rows()
if err != nil {
return nil, err
Expand Down
13 changes: 12 additions & 1 deletion SSP_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package ssp_test
import (
"github.com/juaismar/go-gormssp/test/dbs/postgres"
"github.com/juaismar/go-gormssp/test/dbs/sqlite"
"github.com/juaismar/go-gormssp/test/dbs/sqlserver"
_ "github.com/lib/pq"
. "github.com/onsi/ginkgo"
)
Expand All @@ -29,6 +30,16 @@ var _ = Describe("Test POSTGRES", func() {
Errors(db)
})

var _ = Describe("Test aux fuctions", func() {
var _ = Describe("Test SQLserver", func() {
db := sqlserver.OpenDB()

ComplexFunctionTest(db)
//RegExpTest(db)
Types(db)
SimpleFunctionTest(db)
Errors(db)
})

var _ = Describe("Test aux functions", func() {
FunctionsTest()
})
6 changes: 3 additions & 3 deletions functions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func ComplexFunctionTest(db *gorm.DB) {
whereJoin := make(map[string]string, 0)

whereAll := make([]string, 0)
whereAll = append(whereAll, "fun IS TRUE")
whereAll = append(whereAll, "fun = '1'")

result, err := ssp.Complex(&c, db, "users", columns, whereResult, whereAll, whereJoin)

Expand Down Expand Up @@ -161,7 +161,7 @@ func ComplexFunctionTest(db *gorm.DB) {
{Db: "name", Dt: 0, Formatter: nil},
}
whereResult := make([]string, 0)
whereResult = append(whereResult, "fun IS TRUE")
whereResult = append(whereResult, "fun = '1'")

whereJoin := make(map[string]string, 0)
whereAll := make([]string, 0)
Expand Down Expand Up @@ -1420,7 +1420,7 @@ func SimpleFunctionTest(db *gorm.DB) {
row["0"] = "JuAn"
row["1"] = "Trompeta"
testData = append(testData, row)

//
Expect(result.Data).To(Equal(testData))
})
It("Ordering by instrument desc", func() {
Expand Down
14 changes: 6 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ require (
dmitri.shuralyov.com/go/generated v0.0.0-20170818220700-b1254a446363 // indirect
github.com/fzipp/gocyclo v0.3.1 // indirect
github.com/gordonklaus/ineffassign v0.0.0-20201107091007-3b93a8888063 // indirect
github.com/jackc/pgx/v4 v4.10.1 // indirect
github.com/lib/pq v1.8.0
//github.com/mattn/go-sqlite3 must be 1.14, explained in lib readme
github.com/mattn/go-sqlite3 v1.14.16
Expand All @@ -14,15 +15,12 @@ require (
github.com/onsi/gomega v1.10.3
github.com/satori/go.uuid v1.2.0
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 // indirect
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1 // indirect
golang.org/x/text v0.3.4 // indirect
golang.org/x/tools v0.0.0-20201124202034-299f270db459 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/appengine v1.4.0 // indirect
gorm.io/driver/mysql v1.0.4
gorm.io/driver/postgres v1.0.8
gorm.io/driver/sqlite v1.1.4
gorm.io/gorm v1.20.12
gorm.io/driver/mysql v1.4.5
gorm.io/driver/postgres v1.4.6
gorm.io/driver/sqlite v1.4.4
gorm.io/driver/sqlserver v1.4.1 // indirect
gorm.io/gorm v1.24.3
gorm.io/plugin/dbresolver v1.1.0
)
Loading

0 comments on commit 5a6d7a2

Please sign in to comment.