Skip to content

Commit a18e35f

Browse files
committed
SetExpr support more go types (#1499)
Improve tests SetExpr support more go types fix vet fix drone lint remove go1.10 test on drone Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499
1 parent 20f3d68 commit a18e35f

File tree

5 files changed

+153
-64
lines changed

5 files changed

+153
-64
lines changed

session_insert.go

Lines changed: 33 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -729,66 +729,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
729729
args = append(args, m[colName])
730730
}
731731

732-
w := builder.NewWriter()
733-
if session.statement.cond.IsValid() {
734-
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil {
735-
return 0, err
736-
}
737-
738-
if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil {
739-
return 0, err
740-
}
741-
742-
if _, err := w.WriteString(") SELECT "); err != nil {
743-
return 0, err
744-
}
745-
746-
if err := session.statement.writeArgs(w, args); err != nil {
747-
return 0, err
748-
}
749-
750-
if len(exprs.args) > 0 {
751-
if _, err := w.WriteString(","); err != nil {
752-
return 0, err
753-
}
754-
if err := exprs.writeArgs(w); err != nil {
755-
return 0, err
756-
}
757-
}
758-
759-
if _, err := w.WriteString(fmt.Sprintf(" FROM %s WHERE ", session.engine.Quote(tableName))); err != nil {
760-
return 0, err
761-
}
762-
763-
if err := session.statement.cond.WriteTo(w); err != nil {
764-
return 0, err
765-
}
766-
} else {
767-
qm := strings.Repeat("?,", len(columns))
768-
qm = qm[:len(qm)-1]
769-
770-
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil {
771-
return 0, err
772-
}
773-
w.Append(args...)
774-
}
775-
776-
sql := w.String()
777-
args = w.Args()
778-
779-
if err := session.cacheInsert(tableName); err != nil {
780-
return 0, err
781-
}
782-
783-
res, err := session.exec(sql, args...)
784-
if err != nil {
785-
return 0, err
786-
}
787-
affected, err := res.RowsAffected()
788-
if err != nil {
789-
return 0, err
790-
}
791-
return affected, nil
732+
return session.insertMap(columns, args)
792733
}
793734

794735
func (session *Session) insertMapString(m map[string]string) (int64, error) {
@@ -808,14 +749,26 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
808749
columns = append(columns, k)
809750
}
810751
}
752+
811753
sort.Strings(columns)
812754

813755
var args = make([]interface{}, 0, len(m))
814756
for _, colName := range columns {
815757
args = append(args, m[colName])
816758
}
817759

760+
return session.insertMap(columns, args)
761+
}
762+
763+
func (session *Session) insertMap(columns []string, args []interface{}) (int64, error) {
764+
tableName := session.statement.TableName()
765+
if len(tableName) <= 0 {
766+
return 0, ErrTableNotFound
767+
}
768+
769+
exprs := session.statement.exprColumns
818770
w := builder.NewWriter()
771+
// if insert where
819772
if session.statement.cond.IsValid() {
820773
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil {
821774
return 0, err
@@ -853,10 +806,29 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
853806
qm := strings.Repeat("?,", len(columns))
854807
qm = qm[:len(qm)-1]
855808

856-
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil {
809+
if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil {
857810
return 0, err
858811
}
812+
813+
if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil {
814+
return 0, err
815+
}
816+
if _, err := w.WriteString(fmt.Sprintf(") VALUES (%s", qm)); err != nil {
817+
return 0, err
818+
}
819+
859820
w.Append(args...)
821+
if len(exprs.args) > 0 {
822+
if _, err := w.WriteString(","); err != nil {
823+
return 0, err
824+
}
825+
if err := exprs.writeArgs(w); err != nil {
826+
return 0, err
827+
}
828+
}
829+
if _, err := w.WriteString(")"); err != nil {
830+
return 0, err
831+
}
860832
}
861833

862834
sql := w.String()

session_insert_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,64 @@ func TestInsertWhere(t *testing.T) {
928928
assert.EqualValues(t, 5, j5.Index)
929929
}
930930

931+
func TestInsertExpr2(t *testing.T) {
932+
assert.NoError(t, prepareEngine())
933+
934+
type InsertExprsRelease struct {
935+
Id int64
936+
RepoId int
937+
IsTag bool
938+
IsDraft bool
939+
NumCommits int
940+
Sha1 string
941+
}
942+
943+
assertSync(t, new(InsertExprsRelease))
944+
945+
var ie = InsertExprsRelease{
946+
RepoId: 1,
947+
IsTag: true,
948+
}
949+
inserted, err := testEngine.
950+
SetExpr("is_draft", true).
951+
SetExpr("num_commits", 0).
952+
SetExpr("sha1", "").
953+
Insert(&ie)
954+
assert.NoError(t, err)
955+
assert.EqualValues(t, 1, inserted)
956+
957+
var ie2 InsertExprsRelease
958+
has, err := testEngine.ID(ie.Id).Get(&ie2)
959+
assert.NoError(t, err)
960+
assert.True(t, has)
961+
assert.EqualValues(t, true, ie2.IsDraft)
962+
assert.EqualValues(t, "", ie2.Sha1)
963+
assert.EqualValues(t, 0, ie2.NumCommits)
964+
assert.EqualValues(t, 1, ie2.RepoId)
965+
assert.EqualValues(t, true, ie2.IsTag)
966+
967+
inserted, err = testEngine.Table(new(InsertExprsRelease)).
968+
SetExpr("is_draft", true).
969+
SetExpr("num_commits", 0).
970+
SetExpr("sha1", "").
971+
Insert(map[string]interface{}{
972+
"repo_id": 1,
973+
"is_tag": true,
974+
})
975+
assert.NoError(t, err)
976+
assert.EqualValues(t, 1, inserted)
977+
978+
var ie3 InsertExprsRelease
979+
has, err = testEngine.ID(ie.Id + 1).Get(&ie3)
980+
assert.NoError(t, err)
981+
assert.True(t, has)
982+
assert.EqualValues(t, true, ie3.IsDraft)
983+
assert.EqualValues(t, "", ie3.Sha1)
984+
assert.EqualValues(t, 0, ie3.NumCommits)
985+
assert.EqualValues(t, 1, ie3.RepoId)
986+
assert.EqualValues(t, true, ie3.IsTag)
987+
}
988+
931989
type NightlyRate struct {
932990
ID int64 `xorm:"'id' not null pk BIGINT(20)" json:"id"`
933991
}

session_update.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,14 +239,20 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
239239
for i, colName := range exprColumns.colNames {
240240
switch tp := exprColumns.args[i].(type) {
241241
case string:
242-
colNames = append(colNames, session.engine.Quote(colName)+" = "+tp)
242+
if len(tp) == 0 {
243+
tp = "''"
244+
}
245+
colNames = append(colNames, session.engine.Quote(colName)+"="+tp)
243246
case *builder.Builder:
244247
subQuery, subArgs, err := builder.ToSQL(tp)
245248
if err != nil {
246249
return 0, err
247250
}
248-
colNames = append(colNames, session.engine.Quote(colName)+" = ("+subQuery+")")
251+
colNames = append(colNames, session.engine.Quote(colName)+"=("+subQuery+")")
249252
args = append(args, subArgs...)
253+
default:
254+
colNames = append(colNames, session.engine.Quote(colName)+"=?")
255+
args = append(args, exprColumns.args[i])
250256
}
251257
}
252258

session_update_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,3 +1359,48 @@ func TestUpdateAlias(t *testing.T) {
13591359
assert.EqualValues(t, 2, ue.NumIssues)
13601360
assert.EqualValues(t, "lunny xiao", ue.Name)
13611361
}
1362+
1363+
func TestUpdateExprs2(t *testing.T) {
1364+
assert.NoError(t, prepareEngine())
1365+
1366+
type UpdateExprsRelease struct {
1367+
Id int64
1368+
RepoId int
1369+
IsTag bool
1370+
IsDraft bool
1371+
NumCommits int
1372+
Sha1 string
1373+
}
1374+
1375+
assertSync(t, new(UpdateExprsRelease))
1376+
1377+
var uer = UpdateExprsRelease{
1378+
RepoId: 1,
1379+
IsTag: false,
1380+
IsDraft: false,
1381+
NumCommits: 1,
1382+
Sha1: "sha1",
1383+
}
1384+
inserted, err := testEngine.Insert(&uer)
1385+
assert.NoError(t, err)
1386+
assert.EqualValues(t, 1, inserted)
1387+
1388+
updated, err := testEngine.
1389+
Where("repo_id = ? AND is_tag = ?", 1, false).
1390+
SetExpr("is_draft", true).
1391+
SetExpr("num_commits", 0).
1392+
SetExpr("sha1", "").
1393+
Update(new(UpdateExprsRelease))
1394+
assert.NoError(t, err)
1395+
assert.EqualValues(t, 1, updated)
1396+
1397+
var uer2 UpdateExprsRelease
1398+
has, err := testEngine.ID(uer.Id).Get(&uer2)
1399+
assert.NoError(t, err)
1400+
assert.True(t, has)
1401+
assert.EqualValues(t, 1, uer2.RepoId)
1402+
assert.EqualValues(t, false, uer2.IsTag)
1403+
assert.EqualValues(t, true, uer2.IsDraft)
1404+
assert.EqualValues(t, 0, uer2.NumCommits)
1405+
assert.EqualValues(t, "", uer2.Sha1)
1406+
}

statement_exprparam.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,18 @@ func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error {
6969
if _, err := w.WriteString(")"); err != nil {
7070
return err
7171
}
72-
default:
72+
case string:
73+
if arg == "" {
74+
arg = "''"
75+
}
7376
if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil {
7477
return err
7578
}
79+
default:
80+
if _, err := w.WriteString("?"); err != nil {
81+
return err
82+
}
83+
w.Append(arg)
7684
}
7785
if i != len(exprs.args)-1 {
7886
if _, err := w.WriteString(","); err != nil {

0 commit comments

Comments
 (0)