From 3be6688cd1f8b178f2e7f80e67f7e50d81b53b61 Mon Sep 17 00:00:00 2001 From: miraclesu Date: Wed, 23 Mar 2016 21:18:54 +0800 Subject: [PATCH 1/3] orm: fix painc when pk is uint on ReadOrCreate --- orm/orm.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/orm/orm.go b/orm/orm.go index 38c89334..26ebb7c1 100644 --- a/orm/orm.go +++ b/orm/orm.go @@ -140,7 +140,14 @@ func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, i return (err == nil), id, err } - return false, ind.FieldByIndex(mi.fields.pk.fieldIndex).Int(), err + id, vid := int64(0), ind.FieldByIndex(mi.fields.pk.fieldIndex) + if mi.fields.pk.fieldType&IsPostiveIntegerField > 0 { + id = int64(vid.Uint()) + } else { + id = vid.Int() + } + + return false, id, err } // insert model data to database From eaf38bb09605106db60365efdfa70a6ac873419d Mon Sep 17 00:00:00 2001 From: miraclesu Date: Wed, 23 Mar 2016 21:32:52 +0800 Subject: [PATCH 2/3] orm: add test case for uint pk read or create --- orm/models_test.go | 5 +++++ orm/orm.go | 2 +- orm/orm_test.go | 25 +++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/orm/models_test.go b/orm/models_test.go index b6ae21cf..f42d725e 100644 --- a/orm/models_test.go +++ b/orm/models_test.go @@ -392,6 +392,11 @@ type IntegerPk struct { Value string } +type UintPk struct { + Id uint32 `orm:"pk"` + Name string +} + var DBARGS = struct { Driver string Source string diff --git a/orm/orm.go b/orm/orm.go index 26ebb7c1..6f4b7731 100644 --- a/orm/orm.go +++ b/orm/orm.go @@ -141,7 +141,7 @@ func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, i } id, vid := int64(0), ind.FieldByIndex(mi.fields.pk.fieldIndex) - if mi.fields.pk.fieldType&IsPostiveIntegerField > 0 { + if mi.fields.pk.fieldType&IsPositiveIntegerField > 0 { id = int64(vid.Uint()) } else { id = vid.Int() diff --git a/orm/orm_test.go b/orm/orm_test.go index 832c7301..0c827c2a 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -191,6 +191,7 @@ func TestSyncDb(t *testing.T) { RegisterModel(new(InLine)) RegisterModel(new(InLineOneToOne)) RegisterModel(new(IntegerPk)) + RegisterModel(new(UintPk)) err := RunSyncdb("default", true, Debug) throwFail(t, err) @@ -213,6 +214,7 @@ func TestRegisterModels(t *testing.T) { RegisterModel(new(InLine)) RegisterModel(new(InLineOneToOne)) RegisterModel(new(IntegerPk)) + RegisterModel(new(UintPk)) BootStrap() @@ -2013,3 +2015,26 @@ func TestIntegerPk(t *testing.T) { throwFail(t, AssertIs(out.Value, intPk.Value)) } } + +func TestUintPk(t *testing.T) { + name := "go" + u := &UintPk{ + Id: 8, + Name: name, + } + + created, pk, err := dORM.ReadOrCreate(u, "Id") + throwFail(t, err) + throwFail(t, AssertIs(created, true)) + throwFail(t, AssertIs(u.Name, name)) + + nu := &UintPk{Id: 8} + created, pk, err = dORM.ReadOrCreate(nu, "Id") + throwFail(t, err) + throwFail(t, AssertIs(created, false)) + throwFail(t, AssertIs(nu.Id, u.Id)) + throwFail(t, AssertIs(pk, u.Id)) + throwFail(t, AssertIs(nu.Name, name)) + + dORM.Delete(u) +} From 3e2ffa545f5717c7b8dc76a5a68126fcd43b8891 Mon Sep 17 00:00:00 2001 From: miraclesu Date: Thu, 24 Mar 2016 20:03:45 +0800 Subject: [PATCH 3/3] orm: fix postgres returning id error --- orm/db_postgres.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/orm/db_postgres.go b/orm/db_postgres.go index 7dbef95a..be4cd0bc 100644 --- a/orm/db_postgres.go +++ b/orm/db_postgres.go @@ -123,14 +123,16 @@ func (d *dbBasePostgres) ReplaceMarks(query *string) { } // make returning sql support for postgresql. -func (d *dbBasePostgres) HasReturningID(mi *modelInfo, query *string) (has bool) { - if mi.fields.pk.auto { - if query != nil { - *query = fmt.Sprintf(`%s RETURNING "%s"`, *query, mi.fields.pk.column) - } - has = true +func (d *dbBasePostgres) HasReturningID(mi *modelInfo, query *string) bool { + fi := mi.fields.pk + if fi.fieldType&IsPositiveIntegerField == 0 && fi.fieldType&IsIntegerField == 0 { + return false } - return + + if query != nil { + *query = fmt.Sprintf(`%s RETURNING "%s"`, *query, fi.column) + } + return true } // show table sql for postgresql.