Users: NullTime, removing transaction from insert.
This commit is contained in:
parent
950b15a117
commit
f912a434b5
4 changed files with 12 additions and 42 deletions
|
@ -2,11 +2,9 @@ package datastore
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/jmoiron/modl"
|
||||
"github.com/thermokarst/bactdb/models"
|
||||
)
|
||||
|
||||
|
@ -30,46 +28,16 @@ func (s *usersStore) Get(id int64) (*models.User, error) {
|
|||
}
|
||||
|
||||
func (s *usersStore) Create(user *models.User) (bool, error) {
|
||||
retries := 3
|
||||
var wantRetry bool
|
||||
currentTime := time.Now()
|
||||
user.CreatedAt = currentTime
|
||||
user.UpdatedAt = currentTime
|
||||
|
||||
retry:
|
||||
retries--
|
||||
wantRetry = false
|
||||
if retries == 0 {
|
||||
return false, fmt.Errorf("failed to create user with username %q after retrying", user.UserName)
|
||||
fmt.Println(user)
|
||||
if err := s.dbh.Insert(user); err != nil {
|
||||
if strings.Contains(err.Error(), `violates unique constraint "username_idx"`) {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
|
||||
var created bool
|
||||
err := transact(s.dbh, func(tx modl.SqlExecutor) error {
|
||||
var existing []*models.User
|
||||
if err := tx.Select(&existing, `SELECT * FROM users WHERE username=$1 LIMIT 1;`, user.UserName); err != nil {
|
||||
return err
|
||||
}
|
||||
if len(existing) > 0 {
|
||||
*user = *existing[0]
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := tx.Insert(user); err != nil {
|
||||
if strings.Contains(err.Error(), `violates unique constraint "username_idx"`) {
|
||||
time.Sleep(time.Duration(rand.Intn(75)) * time.Millisecond)
|
||||
wantRetry = true
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
created = true
|
||||
return nil
|
||||
})
|
||||
if wantRetry {
|
||||
goto retry
|
||||
}
|
||||
return created, err
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (s *usersStore) List(opt *models.UserListOptions) ([]*models.User, error) {
|
||||
|
|
|
@ -37,6 +37,7 @@ func TestUsersStore_Get_db(t *testing.T) {
|
|||
}
|
||||
|
||||
normalizeTime(&want.CreatedAt, &want.UpdatedAt, &want.DeletedAt)
|
||||
normalizeTime(&user.CreatedAt, &user.UpdatedAt, &user.DeletedAt)
|
||||
if !reflect.DeepEqual(user, want) {
|
||||
t.Errorf("got user %+v, want %+v", user, want)
|
||||
}
|
||||
|
@ -77,8 +78,9 @@ func TestUsersStore_List_db(t *testing.T) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, u := range want {
|
||||
normalizeTime(&u.CreatedAt, &u.UpdatedAt, &u.DeletedAt)
|
||||
for i := range want {
|
||||
normalizeTime(&want[i].CreatedAt, &want[i].UpdatedAt, &want[i].DeletedAt)
|
||||
normalizeTime(&users[i].CreatedAt, &users[i].UpdatedAt, &users[i].DeletedAt)
|
||||
}
|
||||
if !reflect.DeepEqual(users, want) {
|
||||
t.Errorf("got users %+v, want %+v", users, want)
|
||||
|
|
Reference in a new issue