From ae018b6b4864dfb5528df276755167be27b13148 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Sat, 26 Nov 2022 22:41:03 +0800 Subject: [PATCH] fix: use PutVarint instead of AppendVarint --- models/bots/task.go | 15 ++++++++------- models/bots/task_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 models/bots/task_test.go diff --git a/models/bots/task.go b/models/bots/task.go index 866cba2170..08c0666c00 100644 --- a/models/bots/task.go +++ b/models/bots/task.go @@ -204,7 +204,7 @@ func (task *Task) GenerateToken() error { type LogIndexes []int64 -func (i *LogIndexes) FromDB(b []byte) error { +func (indexes *LogIndexes) FromDB(b []byte) error { reader := bytes.NewReader(b) for { v, err := binary.ReadVarint(reader) @@ -214,16 +214,17 @@ func (i *LogIndexes) FromDB(b []byte) error { } return fmt.Errorf("binary ReadVarint: %w", err) } - *i = append(*i, v) + *indexes = append(*indexes, v) } } -func (i *LogIndexes) ToDB() ([]byte, error) { - var buf []byte - for _, v := range *i { - buf = binary.AppendVarint(buf, v) +func (indexes *LogIndexes) ToDB() ([]byte, error) { + buf, i := make([]byte, binary.MaxVarintLen64*len(*indexes)), 0 + for _, v := range *indexes { + n := binary.PutVarint(buf[i:], v) + i += n } - return buf, nil + return buf[:i], nil } func GetTaskByID(ctx context.Context, id int64) (*Task, error) { diff --git a/models/bots/task_test.go b/models/bots/task_test.go new file mode 100644 index 0000000000..beba507be0 --- /dev/null +++ b/models/bots/task_test.go @@ -0,0 +1,34 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package bots + +import ( + "math" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestLogIndexes_ToDB(t *testing.T) { + tests := []struct { + indexes LogIndexes + }{ + { + indexes: []int64{1, 2, 0, -1, -2, math.MaxInt64, math.MinInt64}, + }, + } + for _, tt := range tests { + t.Run("", func(t *testing.T) { + got, err := tt.indexes.ToDB() + require.NoError(t, err) + + indexes := LogIndexes{} + require.NoError(t, indexes.FromDB(got)) + + assert.Equal(t, tt.indexes, indexes) + }) + } +}