Explorar el Código

add testing for update via condition bean

* Cache limit test

* add test for cache with limit

* change the version

* fix some bug on extends find
xormplus hace 7 años
padre
commit
532e3077ac
Se han modificado 4 ficheros con 184 adiciones y 2 borrados
  1. 19 1
      engine.go
  2. 110 0
      session_find_test.go
  3. 54 0
      session_update_test.go
  4. 1 1
      xorm.go

+ 19 - 1
engine.go

@@ -1100,7 +1100,25 @@ func (engine *Engine) idOfV(rv reflect.Value) (core.PK, error) {
 	pk := make([]interface{}, len(table.PrimaryKeys))
 	for i, col := range table.PKColumns() {
 		var err error
-		pkField := v.FieldByName(col.FieldName)
+
+		fieldName := col.FieldName
+		for {
+			parts := strings.SplitN(fieldName, ".", 2)
+			if len(parts) == 1 {
+				break
+			}
+
+			v = v.FieldByName(parts[0])
+			if v.Kind() == reflect.Ptr {
+				v = v.Elem()
+			}
+			if v.Kind() != reflect.Struct {
+				return nil, ErrUnSupportedType
+			}
+			fieldName = parts[1]
+		}
+		//		fmt.Println(table.Name, fieldName, v)
+		pkField := v.FieldByName(fieldName)
 		switch pkField.Kind() {
 		case reflect.String:
 			pk[i], err = engine.idTypeAssertion(col, pkField.String())

+ 110 - 0
session_find_test.go

@@ -8,6 +8,7 @@ import (
 	"errors"
 	"fmt"
 	"testing"
+	"time"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/xormplus/core"
@@ -655,5 +656,114 @@ func TestFindMapStringId(t *testing.T) {
 	cnt, err = testEngine.ID("1").Delete(new(FindMapDevice))
 	assert.NoError(t, err)
 	assert.EqualValues(t, 1, cnt)
+}
+
+func TestFindExtends(t *testing.T) {
+	type FindExtendsB struct {
+		ID int64
+	}
+
+	type FindExtendsA struct {
+		FindExtendsB `xorm:"extends"`
+	}
+
+	assert.NoError(t, prepareEngine())
+	assertSync(t, new(FindExtendsA))
+
+	cnt, err := testEngine.Insert(&FindExtendsA{
+		FindExtendsB: FindExtendsB{},
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	cnt, err = testEngine.Insert(&FindExtendsA{
+		FindExtendsB: FindExtendsB{},
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
 
+	var results []FindExtendsA
+	err = testEngine.Find(&results)
+	assert.NoError(t, err)
+	assert.EqualValues(t, 2, len(results))
+}
+
+func TestFindExtends3(t *testing.T) {
+	type FindExtendsCC struct {
+		ID   int64
+		Name string
+	}
+
+	type FindExtendsBB struct {
+		FindExtendsCC `xorm:"extends"`
+	}
+
+	type FindExtendsAA struct {
+		FindExtendsBB `xorm:"extends"`
+	}
+
+	assert.NoError(t, prepareEngine())
+	assertSync(t, new(FindExtendsAA))
+
+	cnt, err := testEngine.Insert(&FindExtendsAA{
+		FindExtendsBB: FindExtendsBB{
+			FindExtendsCC: FindExtendsCC{
+				Name: "cc1",
+			},
+		},
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	cnt, err = testEngine.Insert(&FindExtendsAA{
+		FindExtendsBB: FindExtendsBB{
+			FindExtendsCC: FindExtendsCC{
+				Name: "cc2",
+			},
+		},
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	var results []FindExtendsAA
+	err = testEngine.Find(&results)
+	assert.NoError(t, err)
+	assert.EqualValues(t, 2, len(results))
+}
+
+func TestFindCacheLimit(t *testing.T) {
+	type InviteCode struct {
+		ID      int64     `xorm:"pk autoincr 'id'"`
+		Code    string    `xorm:"unique"`
+		Created time.Time `xorm:"created"`
+	}
+
+	assert.NoError(t, prepareEngine())
+	assertSync(t, new(InviteCode))
+
+	cnt, err := testEngine.Insert(&InviteCode{
+		Code: "123456",
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	cnt, err = testEngine.Insert(&InviteCode{
+		Code: "234567",
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	for i := 0; i < 8; i++ {
+		var beans []InviteCode
+		err = testEngine.Limit(1, 0).Find(&beans)
+		assert.NoError(t, err)
+		assert.EqualValues(t, 1, len(beans))
+	}
+
+	for i := 0; i < 8; i++ {
+		var beans2 []*InviteCode
+		err = testEngine.Limit(1, 0).Find(&beans2)
+		assert.NoError(t, err)
+		assert.EqualValues(t, 1, len(beans2))
+	}
 }

+ 54 - 0
session_update_test.go

@@ -1229,3 +1229,57 @@ func TestUpdateMapContent(t *testing.T) {
 	assert.EqualValues(t, true, c3.IsMan)
 	assert.EqualValues(t, 1, c3.Gender)
 }
+
+func TestUpdateCondiBean(t *testing.T) {
+	type NeedUpdateBean struct {
+		Id   int64
+		Name string
+	}
+
+	type NeedUpdateCondiBean struct {
+		Name string
+	}
+
+	assert.NoError(t, prepareEngine())
+	assertSync(t, new(NeedUpdateBean))
+
+	cnt, err := testEngine.Insert(&NeedUpdateBean{
+		Name: "name1",
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	has, err := testEngine.Exist(&NeedUpdateBean{
+		Name: "name1",
+	})
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	cnt, err = testEngine.Update(&NeedUpdateBean{
+		Name: "name2",
+	}, &NeedUpdateCondiBean{
+		Name: "name1",
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	has, err = testEngine.Exist(&NeedUpdateBean{
+		Name: "name2",
+	})
+	assert.NoError(t, err)
+	assert.True(t, has)
+
+	cnt, err = testEngine.Update(&NeedUpdateBean{
+		Name: "name1",
+	}, NeedUpdateCondiBean{
+		Name: "name2",
+	})
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, cnt)
+
+	has, err = testEngine.Exist(&NeedUpdateBean{
+		Name: "name1",
+	})
+	assert.NoError(t, err)
+	assert.True(t, has)
+}

+ 1 - 1
xorm.go

@@ -17,7 +17,7 @@ import (
 
 const (
 	// Version show the xorm's version
-	Version string = "0.6.6.0415"
+	Version string = "0.6.6.0429"
 )
 
 func regDrvsNDialects() bool {