From 2b6e6ce28ebdfd96a1624fe51fcf468d64886fb0 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 29 Nov 2020 22:26:16 +0800 Subject: [PATCH] improve update counter feature for package gdb --- database/gdb/gdb_core.go | 16 +------- database/gdb/gdb_z_mysql_method_test.go | 51 +++++++++++++++++-------- os/grpool/grpool_unit_test.go | 12 +++--- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index c8a631940..1e5ab47ef 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -703,25 +703,13 @@ func (c *Core) DoUpdate(link Link, table string, data interface{}, condition str case *Counter: if value.Value != 0 { column := c.DB.QuoteWord(value.Field) - var symbol string - if value.Value < 0 { - symbol = "-" - } else { - symbol = "+" - } - fields = append(fields, fmt.Sprintf("%s=%s%s?", column, column, symbol)) + fields = append(fields, fmt.Sprintf("%s=%s+?", column, column)) params = append(params, value.Value) } case Counter: if value.Value != 0 { column := c.DB.QuoteWord(value.Field) - var symbol string - if value.Value < 0 { - symbol = "-" - } else { - symbol = "+" - } - fields = append(fields, fmt.Sprintf("%s=%s%s?", column, column, symbol)) + fields = append(fields, fmt.Sprintf("%s=%s+?", column, column)) params = append(params, value.Value) } default: diff --git a/database/gdb/gdb_z_mysql_method_test.go b/database/gdb/gdb_z_mysql_method_test.go index 1929713c5..7c14b7402 100644 --- a/database/gdb/gdb_z_mysql_method_test.go +++ b/database/gdb/gdb_z_mysql_method_test.go @@ -10,7 +10,6 @@ import ( "fmt" "github.com/gogf/gf/container/garray" "github.com/gogf/gf/encoding/gparser" - "github.com/gogf/gf/util/gconv" "testing" "time" @@ -1409,8 +1408,7 @@ func Test_Empty_Slice_Argument(t *testing.T) { // update counter test func Test_DB_UpdateCounter(t *testing.T) { - tableName := "gf_update_counter_test" - defer dropTable(tableName) + tableName := "gf_update_counter_test_" + gtime.TimestampNanoStr() _, err := db.Exec(fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(10) unsigned NOT NULL, @@ -1421,16 +1419,18 @@ func Test_DB_UpdateCounter(t *testing.T) { if err != nil { gtest.Fatal(err) } - id := 1 - insertData := g.Map{ - "id": id, - "views": 0, - "updated_time": 0, - } - _, err = db.Insert(tableName, insertData) - if err != nil { - gtest.Fatal(err) - } + defer dropTable(tableName) + + gtest.C(t, func(t *gtest.T) { + insertData := g.Map{ + "id": 1, + "views": 0, + "updated_time": 0, + } + _, err = db.Insert(tableName, insertData) + t.Assert(err, nil) + }) + gtest.C(t, func(t *gtest.T) { gdbCounter := &gdb.Counter{ Field: "views", @@ -1440,13 +1440,32 @@ func Test_DB_UpdateCounter(t *testing.T) { "views": gdbCounter, "updated_time": gtime.Now().Unix(), } - result, err := db.Update(tableName, updateData, "id="+gconv.String(id)) + result, err := db.Update(tableName, updateData, "id", 1) t.Assert(err, nil) n, _ := result.RowsAffected() t.Assert(n, 1) - one, err := db.Table(tableName).Where("id", id).One() + one, err := db.Table(tableName).Where("id", 1).One() t.Assert(err, nil) t.Assert(one["id"].Int(), 1) - t.Assert(one["views"].String(), "1") + t.Assert(one["views"].Int(), 1) + }) + + gtest.C(t, func(t *gtest.T) { + gdbCounter := &gdb.Counter{ + Field: "views", + Value: -1, + } + updateData := g.Map{ + "views": gdbCounter, + "updated_time": gtime.Now().Unix(), + } + result, err := db.Update(tableName, updateData, "id", 1) + t.Assert(err, nil) + n, _ := result.RowsAffected() + t.Assert(n, 1) + one, err := db.Table(tableName).Where("id", 1).One() + t.Assert(err, nil) + t.Assert(one["id"].Int(), 1) + t.Assert(one["views"].Int(), 0) }) } diff --git a/os/grpool/grpool_unit_test.go b/os/grpool/grpool_unit_test.go index e0be156fe..b4250bd46 100644 --- a/os/grpool/grpool_unit_test.go +++ b/os/grpool/grpool_unit_test.go @@ -58,15 +58,17 @@ func Test_Limit1(t *testing.T) { func Test_Limit2(t *testing.T) { gtest.C(t, func(t *gtest.T) { - wg := sync.WaitGroup{} - array := garray.NewArray(true) - size := 100 - pool := grpool.New(1) + var ( + wg = sync.WaitGroup{} + array = garray.NewArray(true) + size = 100 + pool = grpool.New(1) + ) wg.Add(size) for i := 0; i < size; i++ { pool.Add(func() { + defer wg.Done() array.Append(1) - wg.Done() }) } wg.Wait()