Merge branch 'master' into fix-schema-idx
This commit is contained in:
commit
204a2f6f28
216
.drone.yml
216
.drone.yml
|
@ -1,204 +1,14 @@
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
name: go1.10-test
|
name: testing
|
||||||
workspace:
|
|
||||||
base: /go
|
|
||||||
path: src/gitea.com/xorm/xorm
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: build
|
- name: test-vet
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.10
|
image: golang:1.12
|
||||||
commands:
|
|
||||||
- go get -t -d -v
|
|
||||||
- go build -v
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-sqlite
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- build
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"sqlite3\" -conn_str=\"./test.db\" -coverprofile=coverage1-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"sqlite3\" -conn_str=\"./test.db\" -cache=true -coverprofile=coverage1-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-mysql
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- build
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test\" -coverprofile=coverage2-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test\" -cache=true -coverprofile=coverage2-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-mysql-utf8mb4
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- test-mysql
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test?charset=utf8mb4\" -coverprofile=coverage2.1-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test?charset=utf8mb4\" -cache=true -coverprofile=coverage2.1-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-mymysql
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- test-mysql-utf8mb4
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"mymysql\" -conn_str=\"tcp:mysql:3306*xorm_test/root/\" -coverprofile=coverage3-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"mymysql\" -conn_str=\"tcp:mysql:3306*xorm_test/root/\" -cache=true -coverprofile=coverage3-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-postgres
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- build
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -coverprofile=coverage4-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -cache=true -coverprofile=coverage4-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-postgres-schema
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- build
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -schema=xorm -coverprofile=coverage5-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -schema=xorm -cache=true -coverprofile=coverage5-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-mssql
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- build
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"mssql\" -conn_str=\"server=mssql;user id=sa;password=yourStrong(!)Password;database=xorm_test\" -coverprofile=coverage6-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"mssql\" -conn_str=\"server=mssql;user id=sa;password=yourStrong(!)Password;database=xorm_test\" -cache=true -coverprofile=coverage6-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-tidb
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- build
|
|
||||||
commands:
|
|
||||||
- "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(tidb:4000)/xorm_test\" -ignore_select_update=true -coverprofile=coverage7-1.txt -covermode=atomic"
|
|
||||||
- "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(tidb:4000)/xorm_test\" -ignore_select_update=true -cache=true -coverprofile=coverage7-2.txt -covermode=atomic"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: test-end
|
|
||||||
pull: default
|
|
||||||
image: golang:1.10
|
|
||||||
depends_on:
|
|
||||||
- test-sqlite
|
|
||||||
- test-mysql
|
|
||||||
- test-mysql-utf8mb4
|
|
||||||
- test-mymysql
|
|
||||||
- test-postgres
|
|
||||||
- test-postgres-schema
|
|
||||||
- test-mssql
|
|
||||||
- test-tidb
|
|
||||||
commands:
|
|
||||||
- echo "go1.10 build end"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
services:
|
|
||||||
- name: mysql
|
|
||||||
pull: default
|
|
||||||
image: mysql:5.7
|
|
||||||
environment:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
|
||||||
MYSQL_DATABASE: xorm_test
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- tag
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: pgsql
|
|
||||||
pull: default
|
|
||||||
image: postgres:9.5
|
|
||||||
environment:
|
|
||||||
POSTGRES_DB: xorm_test
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- tag
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: mssql
|
|
||||||
pull: default
|
|
||||||
image: microsoft/mssql-server-linux:latest
|
|
||||||
environment:
|
|
||||||
ACCEPT_EULA: Y
|
|
||||||
SA_PASSWORD: yourStrong(!)Password
|
|
||||||
MSSQL_PID: Developer
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- tag
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: tidb
|
|
||||||
pull: default
|
|
||||||
image: pingcap/tidb:v3.0.3
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- tag
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: go1.13-test
|
|
||||||
steps:
|
|
||||||
- name: build
|
|
||||||
pull: default
|
|
||||||
image: golang:1.13
|
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
commands:
|
commands:
|
||||||
- go build -v
|
|
||||||
- go vet
|
- go vet
|
||||||
when:
|
when:
|
||||||
event:
|
event:
|
||||||
|
@ -207,7 +17,7 @@ steps:
|
||||||
|
|
||||||
- name: test-sqlite
|
- name: test-sqlite
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
|
@ -221,7 +31,7 @@ steps:
|
||||||
|
|
||||||
- name: test-mysql
|
- name: test-mysql
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
|
@ -235,7 +45,7 @@ steps:
|
||||||
|
|
||||||
- name: test-mysql-utf8mb4
|
- name: test-mysql-utf8mb4
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
depends_on:
|
depends_on:
|
||||||
- test-mysql
|
- test-mysql
|
||||||
environment:
|
environment:
|
||||||
|
@ -251,7 +61,7 @@ steps:
|
||||||
|
|
||||||
- name: test-mymysql
|
- name: test-mymysql
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
depends_on:
|
depends_on:
|
||||||
- test-mysql-utf8mb4
|
- test-mysql-utf8mb4
|
||||||
environment:
|
environment:
|
||||||
|
@ -267,7 +77,7 @@ steps:
|
||||||
|
|
||||||
- name: test-postgres
|
- name: test-postgres
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
|
@ -281,7 +91,7 @@ steps:
|
||||||
|
|
||||||
- name: test-postgres-schema
|
- name: test-postgres-schema
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
|
@ -295,7 +105,7 @@ steps:
|
||||||
|
|
||||||
- name: test-mssql
|
- name: test-mssql
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
|
@ -309,7 +119,7 @@ steps:
|
||||||
|
|
||||||
- name: test-tidb
|
- name: test-tidb
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
|
@ -323,12 +133,12 @@ steps:
|
||||||
|
|
||||||
- name: merge_coverage
|
- name: merge_coverage
|
||||||
pull: default
|
pull: default
|
||||||
image: golang:1.13
|
image: golang:1.12
|
||||||
environment:
|
environment:
|
||||||
GO111MODULE: "on"
|
GO111MODULE: "on"
|
||||||
GOPROXY: "https://goproxy.cn"
|
GOPROXY: "https://goproxy.cn"
|
||||||
depends_on:
|
depends_on:
|
||||||
- build
|
- test-vet
|
||||||
- test-sqlite
|
- test-sqlite
|
||||||
- test-mysql
|
- test-mysql
|
||||||
- test-mysql-utf8mb4
|
- test-mysql-utf8mb4
|
||||||
|
|
|
@ -729,66 +729,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
|
||||||
args = append(args, m[colName])
|
args = append(args, m[colName])
|
||||||
}
|
}
|
||||||
|
|
||||||
w := builder.NewWriter()
|
return session.insertMap(columns, args)
|
||||||
if session.statement.cond.IsValid() {
|
|
||||||
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := w.WriteString(") SELECT "); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := session.statement.writeArgs(w, args); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(exprs.args) > 0 {
|
|
||||||
if _, err := w.WriteString(","); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if err := exprs.writeArgs(w); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := w.WriteString(fmt.Sprintf(" FROM %s WHERE ", session.engine.Quote(tableName))); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := session.statement.cond.WriteTo(w); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
qm := strings.Repeat("?,", len(columns))
|
|
||||||
qm = qm[:len(qm)-1]
|
|
||||||
|
|
||||||
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
w.Append(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
sql := w.String()
|
|
||||||
args = w.Args()
|
|
||||||
|
|
||||||
if err := session.cacheInsert(tableName); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := session.exec(sql, args...)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
affected, err := res.RowsAffected()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return affected, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
|
@ -808,6 +749,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
columns = append(columns, k)
|
columns = append(columns, k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Strings(columns)
|
sort.Strings(columns)
|
||||||
|
|
||||||
var args = make([]interface{}, 0, len(m))
|
var args = make([]interface{}, 0, len(m))
|
||||||
|
@ -815,7 +757,18 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
args = append(args, m[colName])
|
args = append(args, m[colName])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return session.insertMap(columns, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (session *Session) insertMap(columns []string, args []interface{}) (int64, error) {
|
||||||
|
tableName := session.statement.TableName()
|
||||||
|
if len(tableName) <= 0 {
|
||||||
|
return 0, ErrTableNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
exprs := session.statement.exprColumns
|
||||||
w := builder.NewWriter()
|
w := builder.NewWriter()
|
||||||
|
// if insert where
|
||||||
if session.statement.cond.IsValid() {
|
if session.statement.cond.IsValid() {
|
||||||
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil {
|
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
@ -853,10 +806,29 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
qm := strings.Repeat("?,", len(columns))
|
qm := strings.Repeat("?,", len(columns))
|
||||||
qm = qm[:len(qm)-1]
|
qm = qm[:len(qm)-1]
|
||||||
|
|
||||||
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil {
|
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if _, err := w.WriteString(fmt.Sprintf(") VALUES (%s", qm)); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
w.Append(args...)
|
w.Append(args...)
|
||||||
|
if len(exprs.args) > 0 {
|
||||||
|
if _, err := w.WriteString(","); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if err := exprs.writeArgs(w); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, err := w.WriteString(")"); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sql := w.String()
|
sql := w.String()
|
||||||
|
|
|
@ -928,6 +928,64 @@ func TestInsertWhere(t *testing.T) {
|
||||||
assert.EqualValues(t, 5, j5.Index)
|
assert.EqualValues(t, 5, j5.Index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInsertExpr2(t *testing.T) {
|
||||||
|
assert.NoError(t, prepareEngine())
|
||||||
|
|
||||||
|
type InsertExprsRelease struct {
|
||||||
|
Id int64
|
||||||
|
RepoId int
|
||||||
|
IsTag bool
|
||||||
|
IsDraft bool
|
||||||
|
NumCommits int
|
||||||
|
Sha1 string
|
||||||
|
}
|
||||||
|
|
||||||
|
assertSync(t, new(InsertExprsRelease))
|
||||||
|
|
||||||
|
var ie = InsertExprsRelease{
|
||||||
|
RepoId: 1,
|
||||||
|
IsTag: true,
|
||||||
|
}
|
||||||
|
inserted, err := testEngine.
|
||||||
|
SetExpr("is_draft", true).
|
||||||
|
SetExpr("num_commits", 0).
|
||||||
|
SetExpr("sha1", "").
|
||||||
|
Insert(&ie)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, inserted)
|
||||||
|
|
||||||
|
var ie2 InsertExprsRelease
|
||||||
|
has, err := testEngine.ID(ie.Id).Get(&ie2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, has)
|
||||||
|
assert.EqualValues(t, true, ie2.IsDraft)
|
||||||
|
assert.EqualValues(t, "", ie2.Sha1)
|
||||||
|
assert.EqualValues(t, 0, ie2.NumCommits)
|
||||||
|
assert.EqualValues(t, 1, ie2.RepoId)
|
||||||
|
assert.EqualValues(t, true, ie2.IsTag)
|
||||||
|
|
||||||
|
inserted, err = testEngine.Table(new(InsertExprsRelease)).
|
||||||
|
SetExpr("is_draft", true).
|
||||||
|
SetExpr("num_commits", 0).
|
||||||
|
SetExpr("sha1", "").
|
||||||
|
Insert(map[string]interface{}{
|
||||||
|
"repo_id": 1,
|
||||||
|
"is_tag": true,
|
||||||
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, inserted)
|
||||||
|
|
||||||
|
var ie3 InsertExprsRelease
|
||||||
|
has, err = testEngine.ID(ie.Id + 1).Get(&ie3)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, has)
|
||||||
|
assert.EqualValues(t, true, ie3.IsDraft)
|
||||||
|
assert.EqualValues(t, "", ie3.Sha1)
|
||||||
|
assert.EqualValues(t, 0, ie3.NumCommits)
|
||||||
|
assert.EqualValues(t, 1, ie3.RepoId)
|
||||||
|
assert.EqualValues(t, true, ie3.IsTag)
|
||||||
|
}
|
||||||
|
|
||||||
type NightlyRate struct {
|
type NightlyRate struct {
|
||||||
ID int64 `xorm:"'id' not null pk BIGINT(20)" json:"id"`
|
ID int64 `xorm:"'id' not null pk BIGINT(20)" json:"id"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,6 +239,9 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
for i, colName := range exprColumns.colNames {
|
for i, colName := range exprColumns.colNames {
|
||||||
switch tp := exprColumns.args[i].(type) {
|
switch tp := exprColumns.args[i].(type) {
|
||||||
case string:
|
case string:
|
||||||
|
if len(tp) == 0 {
|
||||||
|
tp = "''"
|
||||||
|
}
|
||||||
colNames = append(colNames, session.engine.Quote(colName)+"="+tp)
|
colNames = append(colNames, session.engine.Quote(colName)+"="+tp)
|
||||||
case *builder.Builder:
|
case *builder.Builder:
|
||||||
subQuery, subArgs, err := builder.ToSQL(tp)
|
subQuery, subArgs, err := builder.ToSQL(tp)
|
||||||
|
@ -247,6 +250,9 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
}
|
}
|
||||||
colNames = append(colNames, session.engine.Quote(colName)+"=("+subQuery+")")
|
colNames = append(colNames, session.engine.Quote(colName)+"=("+subQuery+")")
|
||||||
args = append(args, subArgs...)
|
args = append(args, subArgs...)
|
||||||
|
default:
|
||||||
|
colNames = append(colNames, session.engine.Quote(colName)+"=?")
|
||||||
|
args = append(args, exprColumns.args[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1359,3 +1359,48 @@ func TestUpdateAlias(t *testing.T) {
|
||||||
assert.EqualValues(t, 2, ue.NumIssues)
|
assert.EqualValues(t, 2, ue.NumIssues)
|
||||||
assert.EqualValues(t, "lunny xiao", ue.Name)
|
assert.EqualValues(t, "lunny xiao", ue.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdateExprs2(t *testing.T) {
|
||||||
|
assert.NoError(t, prepareEngine())
|
||||||
|
|
||||||
|
type UpdateExprsRelease struct {
|
||||||
|
Id int64
|
||||||
|
RepoId int
|
||||||
|
IsTag bool
|
||||||
|
IsDraft bool
|
||||||
|
NumCommits int
|
||||||
|
Sha1 string
|
||||||
|
}
|
||||||
|
|
||||||
|
assertSync(t, new(UpdateExprsRelease))
|
||||||
|
|
||||||
|
var uer = UpdateExprsRelease{
|
||||||
|
RepoId: 1,
|
||||||
|
IsTag: false,
|
||||||
|
IsDraft: false,
|
||||||
|
NumCommits: 1,
|
||||||
|
Sha1: "sha1",
|
||||||
|
}
|
||||||
|
inserted, err := testEngine.Insert(&uer)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, inserted)
|
||||||
|
|
||||||
|
updated, err := testEngine.
|
||||||
|
Where("repo_id = ? AND is_tag = ?", 1, false).
|
||||||
|
SetExpr("is_draft", true).
|
||||||
|
SetExpr("num_commits", 0).
|
||||||
|
SetExpr("sha1", "").
|
||||||
|
Update(new(UpdateExprsRelease))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, updated)
|
||||||
|
|
||||||
|
var uer2 UpdateExprsRelease
|
||||||
|
has, err := testEngine.ID(uer.Id).Get(&uer2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, has)
|
||||||
|
assert.EqualValues(t, 1, uer2.RepoId)
|
||||||
|
assert.EqualValues(t, false, uer2.IsTag)
|
||||||
|
assert.EqualValues(t, true, uer2.IsDraft)
|
||||||
|
assert.EqualValues(t, 0, uer2.NumCommits)
|
||||||
|
assert.EqualValues(t, "", uer2.Sha1)
|
||||||
|
}
|
||||||
|
|
|
@ -69,10 +69,18 @@ func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error {
|
||||||
if _, err := w.WriteString(")"); err != nil {
|
if _, err := w.WriteString(")"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
default:
|
case string:
|
||||||
|
if arg == "" {
|
||||||
|
arg = "''"
|
||||||
|
}
|
||||||
if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil {
|
if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
if _, err := w.WriteString("?"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
w.Append(arg)
|
||||||
}
|
}
|
||||||
if i != len(exprs.args)-1 {
|
if i != len(exprs.args)-1 {
|
||||||
if _, err := w.WriteString(","); err != nil {
|
if _, err := w.WriteString(","); err != nil {
|
||||||
|
|
Loading…
Reference in New Issue