session_insert_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright 2017 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "fmt"
  7. "reflect"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func TestInsertOne(t *testing.T) {
  13. assert.NoError(t, prepareEngine())
  14. type Test struct {
  15. Id int64 `xorm:"autoincr pk"`
  16. Msg string `xorm:"varchar(255)"`
  17. Created time.Time `xorm:"created"`
  18. }
  19. assert.NoError(t, testEngine.Sync2(new(Test)))
  20. data := Test{Msg: "hi"}
  21. _, err := testEngine.InsertOne(data)
  22. assert.NoError(t, err)
  23. }
  24. func TestInsertOne2(t *testing.T) {
  25. assert.NoError(t, prepareEngine())
  26. type Test2 struct {
  27. Id int64 `xorm:"autoincr pk"`
  28. Msg string `xorm:"varchar(255)"`
  29. Created time.Time `xorm:"datetime created"`
  30. }
  31. assert.NoError(t, testEngine.Sync2(new(Test2)))
  32. data := Test2{Msg: "hi"}
  33. _, err := testEngine.InsertOne(data)
  34. assert.NoError(t, err)
  35. }
  36. func TestInsertMulti(t *testing.T) {
  37. assert.NoError(t, prepareEngine())
  38. type TestMulti struct {
  39. Id int64 `xorm:"int(11) pk"`
  40. Name string `xorm:"varchar(255)"`
  41. }
  42. assert.NoError(t, testEngine.Sync2(new(TestMulti)))
  43. num, err := insertMultiDatas(1,
  44. append([]TestMulti{}, TestMulti{1, "test1"}, TestMulti{2, "test2"}, TestMulti{3, "test3"}))
  45. assert.NoError(t, err)
  46. assert.EqualValues(t, 3, num)
  47. }
  48. func insertMultiDatas(step int, datas interface{}) (num int64, err error) {
  49. sliceValue := reflect.Indirect(reflect.ValueOf(datas))
  50. var iLen int64
  51. if sliceValue.Kind() != reflect.Slice {
  52. return 0, fmt.Errorf("not silce")
  53. }
  54. iLen = int64(sliceValue.Len())
  55. if iLen == 0 {
  56. return
  57. }
  58. session := testEngine.NewSession()
  59. defer session.Close()
  60. if err = callbackLooper(datas, step,
  61. func(innerDatas interface{}) error {
  62. n, e := session.InsertMulti(innerDatas)
  63. if e != nil {
  64. return e
  65. }
  66. num += n
  67. return nil
  68. }); err != nil {
  69. return 0, err
  70. } else if num != iLen {
  71. return 0, fmt.Errorf("num error: %d - %d", num, iLen)
  72. }
  73. return
  74. }
  75. func callbackLooper(datas interface{}, step int, actionFunc func(interface{}) error) (err error) {
  76. sliceValue := reflect.Indirect(reflect.ValueOf(datas))
  77. if sliceValue.Kind() != reflect.Slice {
  78. return fmt.Errorf("not slice")
  79. }
  80. if sliceValue.Len() <= 0 {
  81. return
  82. }
  83. tempLen := 0
  84. processedLen := sliceValue.Len()
  85. for i := 0; i < sliceValue.Len(); i += step {
  86. if processedLen > step {
  87. tempLen = i + step
  88. } else {
  89. tempLen = sliceValue.Len()
  90. }
  91. var tempInterface []interface{}
  92. for j := i; j < tempLen; j++ {
  93. tempInterface = append(tempInterface, sliceValue.Index(j).Interface())
  94. }
  95. if err = actionFunc(tempInterface); err != nil {
  96. return
  97. }
  98. processedLen = processedLen - step
  99. }
  100. return
  101. }
  102. func TestInsertOneIfPkIsPoint(t *testing.T) {
  103. assert.NoError(t, prepareEngine())
  104. type TestPoint struct {
  105. Id *int64 `xorm:"autoincr pk notnull 'id'"`
  106. Msg *string `xorm:"varchar(255)"`
  107. Created *time.Time `xorm:"created"`
  108. }
  109. assert.NoError(t, testEngine.Sync2(new(TestPoint)))
  110. msg := "hi"
  111. data := TestPoint{Msg: &msg}
  112. _, err := testEngine.InsertOne(&data)
  113. assert.NoError(t, err)
  114. }
  115. func TestInsertOneIfPkIsPointRename(t *testing.T) {
  116. assert.NoError(t, prepareEngine())
  117. type ID *int64
  118. type TestPoint struct {
  119. Id ID `xorm:"autoincr pk notnull 'id'"`
  120. Msg *string `xorm:"varchar(255)"`
  121. Created *time.Time `xorm:"created"`
  122. }
  123. assert.NoError(t, testEngine.Sync2(new(TestPoint)))
  124. msg := "hi"
  125. data := TestPoint{Msg: &msg}
  126. _, err := testEngine.InsertOne(&data)
  127. assert.NoError(t, err)
  128. }