From ef2925389c552e094cf5a625faef149265f88a4f Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 7 Jan 2023 19:53:58 +0800 Subject: [PATCH 1/2] sqlx: add sqlxServent with help method for db transcation logic --- internal/dao/sakila/authority.go | 4 ++-- internal/dao/sakila/comments.go | 8 ++++---- internal/dao/sakila/contacts.go | 4 ++-- internal/dao/sakila/index.go | 12 +++++------ internal/dao/sakila/messages.go | 4 ++-- internal/dao/sakila/security.go | 4 ++-- internal/dao/sakila/sqlx.go | 35 ++++++++++++++++++++++++++++++++ internal/dao/sakila/topics.go | 4 ++-- internal/dao/sakila/tweets.go | 12 +++++------ internal/dao/sakila/user.go | 4 ++-- internal/dao/sakila/wallet.go | 4 ++-- 11 files changed, 65 insertions(+), 30 deletions(-) diff --git a/internal/dao/sakila/authority.go b/internal/dao/sakila/authority.go index 8e2e0fb2..476e8a1b 100644 --- a/internal/dao/sakila/authority.go +++ b/internal/dao/sakila/authority.go @@ -15,7 +15,7 @@ var ( ) type authorizationManageServant struct { - db *sqlx.DB + *sqlxServant stmtIdx *sqlx.Stmt stmtUpdateFriend *sqlx.Stmt } @@ -52,7 +52,7 @@ func (s *authorizationManageServant) isFriend(userId int64, friendId int64) bool func newAuthorizationManageService(db *sqlx.DB) core.AuthorizationManageService { return &authorizationManageServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtIdx: c(`SELECT * FROM @person WHERE first_name=?`), stmtUpdateFriend: c(`SELECT * FROM @person WHERE first_name=?`), } diff --git a/internal/dao/sakila/comments.go b/internal/dao/sakila/comments.go index c4a25eac..09dd3f97 100644 --- a/internal/dao/sakila/comments.go +++ b/internal/dao/sakila/comments.go @@ -16,13 +16,13 @@ var ( ) type commentServant struct { - db *sqlx.DB + *sqlxServant stmtGetComments *sqlx.Stmt stmtGetReply *sqlx.Stmt } type commentManageServant struct { - db *sqlx.DB + *sqlxServant stmtDelComments *sqlx.Stmt stmtAddComents *sqlx.Stmt } @@ -95,7 +95,7 @@ func (s *commentManageServant) CreateCommentContent(content *core.CommentContent func newCommentService(db *sqlx.DB) core.CommentService { return &commentServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtGetComments: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetReply: c(`SELECT * FROM @person WHERE first_name=?`), } @@ -103,7 +103,7 @@ func newCommentService(db *sqlx.DB) core.CommentService { func newCommentManageService(db *sqlx.DB) core.CommentManageService { return &commentManageServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtAddComents: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelComments: c(`SELECT * FROM @person WHERE first_name=?`), } diff --git a/internal/dao/sakila/contacts.go b/internal/dao/sakila/contacts.go index b7b8eba2..4aa07339 100644 --- a/internal/dao/sakila/contacts.go +++ b/internal/dao/sakila/contacts.go @@ -15,7 +15,7 @@ var ( ) type contactManageServant struct { - db *sqlx.DB + *sqlxServant stmtAddFriend *sqlx.Stmt stmtDelFriend *sqlx.Stmt } @@ -58,7 +58,7 @@ func (s *contactManageServant) IsFriend(userId int64, friendId int64) bool { func newContactManageService(db *sqlx.DB) core.ContactManageService { return &contactManageServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtAddFriend: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelFriend: c(`SELECT * FROM @person WHERE first_name=?`), } diff --git a/internal/dao/sakila/index.go b/internal/dao/sakila/index.go index d70ec2ec..341cc544 100644 --- a/internal/dao/sakila/index.go +++ b/internal/dao/sakila/index.go @@ -16,12 +16,12 @@ var ( ) type indexPostsServant struct { - db *sqlx.DB + *sqlxServant stmtIndex *sqlx.Stmt } type simpleIndexPostsServant struct { - db *sqlx.DB + *sqlxServant stmtIndex *sqlx.Stmt } @@ -41,14 +41,14 @@ func (s *simpleIndexPostsServant) IndexPosts(_user *core.User, offset int, limit func newIndexPostsService(db *sqlx.DB) core.IndexPostsService { return &indexPostsServant{ - db: db, - stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), + sqlxServant: newSqlxServant(db), + stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), } } func newSimpleIndexPostsService(db *sqlx.DB) core.IndexPostsService { return &simpleIndexPostsServant{ - db: db, - stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), + sqlxServant: newSqlxServant(db), + stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), } } diff --git a/internal/dao/sakila/messages.go b/internal/dao/sakila/messages.go index d0539edf..16ba8391 100644 --- a/internal/dao/sakila/messages.go +++ b/internal/dao/sakila/messages.go @@ -15,7 +15,7 @@ var ( ) type messageServant struct { - db *sqlx.DB + *sqlxServant stmtAddMsg *sqlx.Stmt stmtGetMsg *sqlx.Stmt stmtReadMsg *sqlx.Stmt @@ -59,7 +59,7 @@ func (s *messageServant) GetMessageCount(conditions *core.ConditionsT) (int64, e func newMessageService(db *sqlx.DB) core.MessageService { return &messageServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtAddMsg: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetMsg: c(`SELECT * FROM @person WHERE first_name=?`), stmtReadMsg: c(`SELECT * FROM @person WHERE first_name=?`), diff --git a/internal/dao/sakila/security.go b/internal/dao/sakila/security.go index 457b407d..2804f97f 100644 --- a/internal/dao/sakila/security.go +++ b/internal/dao/sakila/security.go @@ -15,7 +15,7 @@ var ( ) type securityServant struct { - db *sqlx.DB + *sqlxServant phoneVerify core.PhoneVerifyService stmtAddCaptcha *sqlx.Stmt stmtGetCaptcha *sqlx.Stmt @@ -44,7 +44,7 @@ func (s *securityServant) SendPhoneCaptcha(phone string) error { func newSecurityService(db *sqlx.DB, phoneVerify core.PhoneVerifyService) core.SecurityService { return &securityServant{ - db: db, + sqlxServant: newSqlxServant(db), phoneVerify: phoneVerify, stmtAddCaptcha: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetCaptcha: c(`SELECT * FROM @person WHERE first_name=?`), diff --git a/internal/dao/sakila/sqlx.go b/internal/dao/sakila/sqlx.go index b1f9d1e7..d5696418 100644 --- a/internal/dao/sakila/sqlx.go +++ b/internal/dao/sakila/sqlx.go @@ -8,6 +8,8 @@ package sakila import ( + "context" + "database/sql" "strings" "sync" @@ -21,6 +23,39 @@ var ( _once sync.Once ) +type sqlxServant struct { + db *sqlx.DB +} + +func (s *sqlxServant) with(handle func(*sqlx.Tx) error) error { + tx, err := s.db.Beginx() + if err != nil { + return err + } + if err = handle(tx); err == nil { + return tx.Commit() + } + return tx.Rollback() +} + +func (s *sqlxServant) withTx(ctx context.Context, opts *sql.TxOptions, handle func(*sqlx.Tx) error) error { + tx, err := s.db.BeginTxx(ctx, opts) + if err != nil { + return err + + } + if err = handle(tx); err == nil { + return tx.Commit() + } + return tx.Rollback() +} + +func newSqlxServant(db *sqlx.DB) *sqlxServant { + return &sqlxServant{ + db: db, + } +} + func sqlxDB() *sqlx.DB { _once.Do(func() { _db = conf.MustSqlxDB() diff --git a/internal/dao/sakila/topics.go b/internal/dao/sakila/topics.go index 7f599509..1d5e47f1 100644 --- a/internal/dao/sakila/topics.go +++ b/internal/dao/sakila/topics.go @@ -15,7 +15,7 @@ var ( ) type topicServant struct { - db *sqlx.DB + *sqlxServant stmtAddTag *sqlx.Stmt stmtDelTag *sqlx.Stmt stmtListTag *sqlx.Stmt @@ -47,7 +47,7 @@ func (s *topicServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { func newTopicService(db *sqlx.DB) core.TopicService { return &topicServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtAddTag: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelTag: c(`SELECT * FROM @person WHERE first_name=?`), stmtListTag: c(`SELECT * FROM @person WHERE first_name=?`), diff --git a/internal/dao/sakila/tweets.go b/internal/dao/sakila/tweets.go index 3d3fa958..78455535 100644 --- a/internal/dao/sakila/tweets.go +++ b/internal/dao/sakila/tweets.go @@ -19,14 +19,14 @@ var ( ) type tweetServant struct { - db *sqlx.DB + *sqlxServant stmtGetTweet *sqlx.Stmt stmtListTweet *sqlx.Stmt stmtListStar *sqlx.Stmt } type tweetManageServant struct { - db *sqlx.DB + *sqlxServant cacheIndex core.CacheIndexService stmtAddTweet *sqlx.Stmt stmtDelTweet *sqlx.Stmt @@ -34,7 +34,7 @@ type tweetManageServant struct { } type tweetHelpServant struct { - db *sqlx.DB + *sqlxServant stmtAddTag *sqlx.Stmt stmtDelTag *sqlx.Stmt stmtListTag *sqlx.Stmt @@ -230,7 +230,7 @@ func (s *tweetServant) GetPostContentByID(id int64) (*core.PostContent, error) { func newTweetService(db *sqlx.DB) core.TweetService { return &tweetServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtGetTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtListTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtListStar: c(`SELECT * FROM @person WHERE first_name=?`), @@ -239,7 +239,7 @@ func newTweetService(db *sqlx.DB) core.TweetService { func newTweetManageService(db *sqlx.DB, cacheIndex core.CacheIndexService) core.TweetManageService { return &tweetManageServant{ - db: db, + sqlxServant: newSqlxServant(db), cacheIndex: cacheIndex, stmtAddTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelTweet: c(`SELECT * FROM @person WHERE first_name=?`), @@ -249,7 +249,7 @@ func newTweetManageService(db *sqlx.DB, cacheIndex core.CacheIndexService) core. func newTweetHelpService(db *sqlx.DB) core.TweetHelpService { return &tweetHelpServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtAddTag: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelTag: c(`SELECT * FROM @person WHERE first_name=?`), stmtListTag: c(`SELECT * FROM @person WHERE first_name=?`), diff --git a/internal/dao/sakila/user.go b/internal/dao/sakila/user.go index 74c8ec38..282dd65e 100644 --- a/internal/dao/sakila/user.go +++ b/internal/dao/sakila/user.go @@ -15,7 +15,7 @@ var ( ) type userManageServant struct { - db *sqlx.DB + *sqlxServant stmtAddUser *sqlx.Stmt stmtUpdateUser *sqlx.Stmt stmtGetUser *sqlx.Stmt @@ -71,7 +71,7 @@ func (s *userManageServant) UpdateUser(user *core.User) error { func newUserManageService(db *sqlx.DB) core.UserManageService { return &userManageServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtAddUser: c(`SELECT * FROM @person WHERE first_name=?`), stmtUpdateUser: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetUser: c(`SELECT * FROM @person WHERE first_name=?`), diff --git a/internal/dao/sakila/wallet.go b/internal/dao/sakila/wallet.go index 950484d2..71782007 100644 --- a/internal/dao/sakila/wallet.go +++ b/internal/dao/sakila/wallet.go @@ -15,7 +15,7 @@ var ( ) type walletServant struct { - db *sqlx.DB + *sqlxServant stmtAddRecharge *sqlx.Stmt stmtGetRecharge *sqlx.Stmt stmtGetBills *sqlx.Stmt @@ -58,7 +58,7 @@ func (s *walletServant) HandlePostAttachmentBought(post *core.Post, user *core.U func newWalletService(db *sqlx.DB) core.WalletService { return &walletServant{ - db: db, + sqlxServant: newSqlxServant(db), stmtAddRecharge: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetRecharge: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetBills: c(`SELECT * FROM @person WHERE first_name=?`), From 4efb9d043661ea1a134a9919be096ba79acd9e56 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sun, 8 Jan 2023 01:28:38 +0800 Subject: [PATCH 2/2] mir: upgrade github.com/alimy/mir/v3 => v3.0.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 61fe1d1e..4be05e53 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/Masterminds/semver/v3 v3.1.1 github.com/afocus/captcha v0.0.0-20191010092841-4bd1f21c8868 github.com/alimy/cfg v0.3.0 - github.com/alimy/mir/v3 v3.0.0-rc.1 + github.com/alimy/mir/v3 v3.0.0 github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible github.com/allegro/bigcache/v3 v3.0.2 github.com/bytedance/sonic v1.5.0 diff --git a/go.sum b/go.sum index 3a27eb98..f009c99f 100644 --- a/go.sum +++ b/go.sum @@ -147,8 +147,8 @@ github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:C github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/alimy/cfg v0.3.0 h1:9xgA0QWVCPSq9fFNRcYahVCAX22IL9ts2wrTQPfAStY= github.com/alimy/cfg v0.3.0/go.mod h1:rOxbasTH2srl6StAjNF5Vyi8bfrdkl3fLGmOYtSw81c= -github.com/alimy/mir/v3 v3.0.0-rc.1 h1:f/UihOI8OFhIeyIVfKOEPQYss/aJq0PsPLMzP6Eq2rA= -github.com/alimy/mir/v3 v3.0.0-rc.1/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU= +github.com/alimy/mir/v3 v3.0.0 h1:bUcT+SLs/BYHIuHzTCbYnxnEwbYDSCDJULU5a1YZDes= +github.com/alimy/mir/v3 v3.0.0/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU= github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible h1:9gWa46nstkJ9miBReJcN8Gq34cBFbzSpQZVVT9N09TM= github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=