sqlx: use github.com/alimy/yesql parse SQL files with multiple named queries and automatically prepare and scan them into structs

r/paopao-ce-xtra
Michael Li 3 years ago
parent c5866c0f74
commit f890e647d3
No known key found for this signature in database

@ -7,6 +7,7 @@ require (
github.com/afocus/captcha v0.0.0-20191010092841-4bd1f21c8868 github.com/afocus/captcha v0.0.0-20191010092841-4bd1f21c8868
github.com/alimy/cfg v0.3.0 github.com/alimy/cfg v0.3.0
github.com/alimy/mir/v3 v3.1.1 github.com/alimy/mir/v3 v3.1.1
github.com/alimy/yesql v0.2.0
github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible
github.com/allegro/bigcache/v3 v3.0.2 github.com/allegro/bigcache/v3 v3.0.2
github.com/bytedance/sonic v1.8.5 github.com/bytedance/sonic v1.8.5
@ -20,7 +21,7 @@ require (
github.com/golang-jwt/jwt/v4 v4.5.0 github.com/golang-jwt/jwt/v4 v4.5.0
github.com/golang-migrate/migrate/v4 v4.15.2 github.com/golang-migrate/migrate/v4 v4.15.2
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.3+incompatible github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.3+incompatible
github.com/jmoiron/sqlx v1.3.1 github.com/jmoiron/sqlx v1.3.5
github.com/json-iterator/go v1.1.12 github.com/json-iterator/go v1.1.12
github.com/meilisearch/meilisearch-go v0.21.0 github.com/meilisearch/meilisearch-go v0.21.0
github.com/minio/minio-go/v7 v7.0.49 github.com/minio/minio-go/v7 v7.0.49

@ -127,6 +127,8 @@ github.com/alimy/cfg v0.3.0 h1:9xgA0QWVCPSq9fFNRcYahVCAX22IL9ts2wrTQPfAStY=
github.com/alimy/cfg v0.3.0/go.mod h1:rOxbasTH2srl6StAjNF5Vyi8bfrdkl3fLGmOYtSw81c= github.com/alimy/cfg v0.3.0/go.mod h1:rOxbasTH2srl6StAjNF5Vyi8bfrdkl3fLGmOYtSw81c=
github.com/alimy/mir/v3 v3.1.1 h1:3tz7uGOwuA1IKU0BysyBvGbyqKtEVMuhPBD/APk1ANw= github.com/alimy/mir/v3 v3.1.1 h1:3tz7uGOwuA1IKU0BysyBvGbyqKtEVMuhPBD/APk1ANw=
github.com/alimy/mir/v3 v3.1.1/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU= github.com/alimy/mir/v3 v3.1.1/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU=
github.com/alimy/yesql v0.2.0 h1:tYDPxWSakSUOss1xcYisRjDH//GnUunvlrfB4Ek8ikQ=
github.com/alimy/yesql v0.2.0/go.mod h1:Y0FdRIwIbJyTv56wSX+MpaIHiAW1PyKTDYO6K/er4JY=
github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible h1:KXeJoM1wo9I/6xPTyt6qCxoSZnmASiAjlrr0dyTUKt8= github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible h1:KXeJoM1wo9I/6xPTyt6qCxoSZnmASiAjlrr0dyTUKt8=
github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/allegro/bigcache/v3 v3.0.2 h1:AKZCw+5eAaVyNTBmI2fgyPVJhHkdWder3O9IrprcQfI= github.com/allegro/bigcache/v3 v3.0.2 h1:AKZCw+5eAaVyNTBmI2fgyPVJhHkdWder3O9IrprcQfI=
@ -795,8 +797,9 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/jmoiron/sqlx v1.3.1 h1:aLN7YINNZ7cYOPK3QC83dbM6KT0NMqVMw961TqrejlE=
github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=

@ -53,7 +53,7 @@ func (s *authorizationManageSrv) isFriend(userId int64, friendId int64) bool {
func newAuthorizationManageService(db *sqlx.DB) core.AuthorizationManageService { func newAuthorizationManageService(db *sqlx.DB) core.AuthorizationManageService {
return &authorizationManageSrv{ return &authorizationManageSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtIdx: c(`SELECT * FROM @person WHERE first_name=?`), stmtIdx: c(`SELECT * FROM @user WHERE username=?`),
stmtUpdateFriend: c(`SELECT * FROM @person WHERE first_name=?`), stmtUpdateFriend: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -96,15 +96,15 @@ func (s *commentManageSrv) CreateCommentContent(content *core.CommentContent) (*
func newCommentService(db *sqlx.DB) core.CommentService { func newCommentService(db *sqlx.DB) core.CommentService {
return &commentSrv{ return &commentSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtGetComments: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetComments: c(`SELECT * FROM @user WHERE username=?`),
stmtGetReply: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetReply: c(`SELECT * FROM @user WHERE username=?`),
} }
} }
func newCommentManageService(db *sqlx.DB) core.CommentManageService { func newCommentManageService(db *sqlx.DB) core.CommentManageService {
return &commentManageSrv{ return &commentManageSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtAddComents: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddComents: c(`SELECT * FROM @user WHERE username=?`),
stmtDelComments: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelComments: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -59,7 +59,7 @@ func (s *contactManageSrv) IsFriend(userId int64, friendId int64) bool {
func newContactManageService(db *sqlx.DB) core.ContactManageService { func newContactManageService(db *sqlx.DB) core.ContactManageService {
return &contactManageSrv{ return &contactManageSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtAddFriend: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddFriend: c(`SELECT * FROM @user WHERE username=?`),
stmtDelFriend: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelFriend: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -60,8 +60,8 @@ func (s *messageSrv) GetMessageCount(conditions *core.ConditionsT) (int64, error
func newMessageService(db *sqlx.DB) core.MessageService { func newMessageService(db *sqlx.DB) core.MessageService {
return &messageSrv{ return &messageSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtAddMsg: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddMsg: c(`SELECT * FROM @user WHERE username=?`),
stmtGetMsg: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetMsg: c(`SELECT * FROM @user WHERE username=?`),
stmtReadMsg: c(`SELECT * FROM @person WHERE first_name=?`), stmtReadMsg: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -9,6 +9,7 @@ import (
"github.com/Masterminds/semver/v3" "github.com/Masterminds/semver/v3"
"github.com/alimy/cfg" "github.com/alimy/cfg"
"github.com/alimy/yesql"
"github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/dao/cache" "github.com/rocboss/paopao-ce/internal/dao/cache"
"github.com/rocboss/paopao-ce/internal/dao/security" "github.com/rocboss/paopao-ce/internal/dao/security"
@ -19,6 +20,9 @@ var (
_ core.DataService = (*dataSrv)(nil) _ core.DataService = (*dataSrv)(nil)
_ core.VersionInfo = (*dataSrv)(nil) _ core.VersionInfo = (*dataSrv)(nil)
_ core.WebDataServantA = (*webDataSrvA)(nil)
_ core.VersionInfo = (*webDataSrvA)(nil)
_onceInitial sync.Once _onceInitial sync.Once
) )
@ -38,6 +42,13 @@ type dataSrv struct {
core.AttachmentCheckService core.AttachmentCheckService
} }
type webDataSrvA struct {
core.TopicServantA
core.TweetServantA
core.TweetManageServantA
core.TweetHelpServantA
}
func NewDataService() (core.DataService, core.VersionInfo) { func NewDataService() (core.DataService, core.VersionInfo) {
lazyInitial() lazyInitial()
@ -75,11 +86,12 @@ func NewDataService() (core.DataService, core.VersionInfo) {
} }
logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version()) logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version())
query := yesql.MustParseBytes(yesqlBytes)
ds := &dataSrv{ ds := &dataSrv{
IndexPostsService: cis, IndexPostsService: cis,
WalletService: newWalletService(_db), WalletService: newWalletService(_db),
MessageService: newMessageService(_db), MessageService: newMessageService(_db),
TopicService: newTopicService(_db), TopicService: newTopicService(_db, query),
TweetService: newTweetService(_db), TweetService: newTweetService(_db),
TweetManageService: newTweetManageService(_db, cis), TweetManageService: newTweetManageService(_db, cis),
TweetHelpService: newTweetHelpService(_db), TweetHelpService: newTweetHelpService(_db),
@ -94,8 +106,10 @@ func NewDataService() (core.DataService, core.VersionInfo) {
} }
func NewWebDataServantA() (core.WebDataServantA, core.VersionInfo) { func NewWebDataServantA() (core.WebDataServantA, core.VersionInfo) {
logrus.Fatal("not support now") lazyInitial()
return nil, nil // db := conf.MustSqlxDB()
ds := &webDataSrvA{}
return ds, ds
} }
func NewAuthorizationManageService() core.AuthorizationManageService { func NewAuthorizationManageService() core.AuthorizationManageService {
@ -111,6 +125,14 @@ func (s *dataSrv) Version() *semver.Version {
return semver.MustParse("v0.1.0") return semver.MustParse("v0.1.0")
} }
func (s *webDataSrvA) Name() string {
return "Sqlx"
}
func (s *webDataSrvA) Version() *semver.Version {
return semver.MustParse("v0.0.0")
}
// lazyInitial do some package lazy initialize for performance // lazyInitial do some package lazy initialize for performance
func lazyInitial() { func lazyInitial() {
_onceInitial.Do(func() { _onceInitial.Do(func() {

@ -46,7 +46,7 @@ func newSecurityService(db *sqlx.DB, phoneVerify core.PhoneVerifyService) core.S
return &securitySrv{ return &securitySrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
phoneVerify: phoneVerify, phoneVerify: phoneVerify,
stmtAddCaptcha: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddCaptcha: c(`SELECT * FROM @user WHERE username=?`),
stmtGetCaptcha: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetCaptcha: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -7,13 +7,18 @@ package sakila
import ( import (
"context" "context"
"database/sql" "database/sql"
_ "embed"
"strings" "strings"
"github.com/alimy/yesql"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/conf"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
//go:embed yesql.sql
var yesqlBytes []byte
var ( var (
_db *sqlx.DB _db *sqlx.DB
) )
@ -89,7 +94,8 @@ func r(query string) string {
} }
func c(query string) *sqlx.Stmt { func c(query string) *sqlx.Stmt {
stmt, err := _db.Preparex(_db.Rebind(t(query))) query = _db.Rebind(t(query))
stmt, err := _db.Preparex(query)
if err != nil { if err != nil {
logrus.Fatalf("prepare query(%s) error: %s", query, err) logrus.Fatalf("prepare query(%s) error: %s", query, err)
} }
@ -97,7 +103,8 @@ func c(query string) *sqlx.Stmt {
} }
func n(query string) *sqlx.NamedStmt { func n(query string) *sqlx.NamedStmt {
stmt, err := _db.PrepareNamed(t(query)) query = t(query)
stmt, err := _db.PrepareNamed(query)
if err != nil { if err != nil {
logrus.Fatalf("prepare named query(%s) error: %s", query, err) logrus.Fatalf("prepare named query(%s) error: %s", query, err)
} }
@ -111,4 +118,16 @@ func t(query string) string {
func initSqlxDB() { func initSqlxDB() {
_db = conf.MustSqlxDB() _db = conf.MustSqlxDB()
yesql.UseSqlx(_db)
yesql.SetDefaultQueryHooks(func(query *yesql.Query) (*yesql.Query, error) {
qstr := strings.TrimRight(query.Query, ";")
// table name fixed
qstr = strings.Replace(qstr, "@", conf.DatabaseSetting.TablePrefix, -1)
// rebind query
if clause, exist := query.Tags["clause"]; !exist || clause != "in" {
qstr = _db.Rebind(qstr)
}
query.Query = qstr
return query, nil
})
} }

@ -91,7 +91,7 @@ func newFriendIndexService(db *sqlx.DB, ams core.AuthorizationManageService, ths
return &friendIndexSrv{ return &friendIndexSrv{
ams: ams, ams: ams,
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
} }
} }
@ -99,7 +99,7 @@ func newFollowIndexService(db *sqlx.DB, ths core.TweetHelpService) core.IndexPos
return &followIndexSrv{ return &followIndexSrv{
ths: ths, ths: ths,
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
} }
} }
@ -107,7 +107,7 @@ func newLightIndexService(db *sqlx.DB, ths core.TweetHelpService) core.IndexPost
return &lightIndexSrv{ return &lightIndexSrv{
ths: ths, ths: ths,
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
} }
} }
@ -115,6 +115,6 @@ func newSimpleIndexPostsService(db *sqlx.DB, ths core.TweetHelpService) core.Ind
return &simpleIndexPostsSrv{ return &simpleIndexPostsSrv{
ths: ths, ths: ths,
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtIndex: c(`SELECT * FROM @person WHERE first_name=?`), stmtIndex: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -8,9 +8,11 @@ import (
"strings" "strings"
"time" "time"
"github.com/alimy/yesql"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/internal/core/cs"
"github.com/sirupsen/logrus"
) )
var ( var (
@ -19,16 +21,17 @@ var (
type topicSrv struct { type topicSrv struct {
*sqlxSrv *sqlxSrv
stmtNewestTags *sqlx.Stmt Scope yesql.Scope `yesql:"topic"`
stmtHotTags *sqlx.Stmt StmtNewestTags *sqlx.Stmt `yesql:"newest_tags"`
stmtTagsByKeywordA *sqlx.Stmt StmtHotTags *sqlx.Stmt `yesql:"hot_tags"`
stmtTagsByKeywordB *sqlx.Stmt StmtTagsByKeywordA *sqlx.Stmt `yesql:"tags_by_keyword_a"`
stmtInsertTag *sqlx.Stmt StmtTagsByKeywordB *sqlx.Stmt `yesql:"tags_by_keyword_b"`
sqlTagsByIdA string StmtInsertTag *sqlx.Stmt `yesql:"insert_tag"`
sqlTagsByIdB string SqlTagsByIdA string `yesql:"tags_by_id_a"`
sqlDecrTagsById string SqlTagsByIdB string `yesql:"tags_by_id_b"`
sqlTagsForIncr string SqlDecrTagsById string `yesql:"decr_tags_by_id"`
sqlIncrTagsById string SqlTagsForIncr string `yesql:"tags_for_incr"`
SqlIncrTagsById string `yesql:"incr_tags_by_id"`
} }
func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList, xerr error) { func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList, xerr error) {
@ -37,7 +40,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
} }
xerr = s.with(func(tx *sqlx.Tx) error { xerr = s.with(func(tx *sqlx.Tx) error {
var upTags cs.TagInfoList var upTags cs.TagInfoList
if err := s.inSelect(tx, &upTags, s.sqlTagsForIncr, tags); err != nil { if err := s.inSelect(tx, &upTags, s.SqlTagsForIncr, tags); err != nil {
return err return err
} }
now := time.Now().Unix() now := time.Now().Unix()
@ -57,7 +60,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
} }
} }
} }
if _, err := s.inExec(tx, s.sqlIncrTagsById, now, ids); err != nil { if _, err := s.inExec(tx, s.SqlIncrTagsById, now, ids); err != nil {
return err return err
} }
res = append(res, upTags...) res = append(res, upTags...)
@ -68,7 +71,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
} }
var ids []int64 var ids []int64
for _, tag := range tags { for _, tag := range tags {
res, err := s.stmtInsertTag.Exec(userId, tag, now, now) res, err := s.StmtInsertTag.Exec(userId, tag, now, now)
if err != nil { if err != nil {
return err return err
} }
@ -79,7 +82,7 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
ids = append(ids, id) ids = append(ids, id)
} }
var newTags cs.TagInfoList var newTags cs.TagInfoList
if err := s.inSelect(tx, &newTags, s.sqlTagsByIdB, ids); err != nil { if err := s.inSelect(tx, &newTags, s.SqlTagsByIdB, ids); err != nil {
return err return err
} }
res = append(res, newTags...) res = append(res, newTags...)
@ -91,11 +94,11 @@ func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList,
func (s *topicSrv) DecrTagsById(ids []int64) error { func (s *topicSrv) DecrTagsById(ids []int64) error {
return s.with(func(tx *sqlx.Tx) error { return s.with(func(tx *sqlx.Tx) error {
var ids []int64 var ids []int64
err := s.inSelect(tx, &ids, s.sqlTagsByIdA, ids) err := s.inSelect(tx, &ids, s.SqlTagsByIdA, ids)
if err != nil { if err != nil {
return err return err
} }
_, err = s.inExec(tx, s.sqlDecrTagsById, time.Now().Unix(), ids) _, err = s.inExec(tx, s.SqlDecrTagsById, time.Now().Unix(), ids)
return err return err
}) })
} }
@ -103,9 +106,9 @@ func (s *topicSrv) DecrTagsById(ids []int64) error {
func (s *topicSrv) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagList, err error) { func (s *topicSrv) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagList, err error) {
switch typ { switch typ {
case cs.TagTypeHot: case cs.TagTypeHot:
err = s.stmtHotTags.Select(&res, limit, offset) err = s.StmtHotTags.Select(&res, limit, offset)
case cs.TagTypeNew: case cs.TagTypeNew:
err = s.stmtNewestTags.Select(&res, limit, offset) err = s.StmtNewestTags.Select(&res, limit, offset)
} }
return return
} }
@ -113,25 +116,19 @@ func (s *topicSrv) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagLi
func (s *topicSrv) TagsByKeyword(keyword string) (res cs.TagInfoList, err error) { func (s *topicSrv) TagsByKeyword(keyword string) (res cs.TagInfoList, err error) {
keyword = "%" + strings.Trim(keyword, " ") + "%" keyword = "%" + strings.Trim(keyword, " ") + "%"
if keyword == "%%" { if keyword == "%%" {
err = s.stmtTagsByKeywordA.Select(&res) err = s.StmtTagsByKeywordA.Select(&res)
} else { } else {
err = s.stmtTagsByKeywordB.Select(&res) err = s.StmtTagsByKeywordB.Select(&res)
} }
return return
} }
func newTopicService(db *sqlx.DB) core.TopicService { func newTopicService(db *sqlx.DB, query yesql.SQLQuery) core.TopicService {
return &topicSrv{ obj := &topicSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtNewestTags: c(`SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?`),
stmtHotTags: c(`SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.quote_num DESC LIMIT ? OFFSET ?`),
stmtTagsByKeywordA: c(`SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6`),
stmtTagsByKeywordB: c(`SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6`),
stmtInsertTag: c(`INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1)`),
sqlTagsByIdA: t(`SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0`),
sqlTagsByIdB: t(`SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?)`),
sqlDecrTagsById: t(`UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?)`),
sqlTagsForIncr: t(`SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?)`),
sqlIncrTagsById: t(`UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?)`),
} }
if err := yesql.Scan(obj, query); err != nil {
logrus.Fatal(err)
}
return obj
} }

@ -326,9 +326,9 @@ func (s *tweetSrv) AttachmentByTweetId(userId int64, tweetId int64) (*cs.Attachm
func newTweetService(db *sqlx.DB) core.TweetService { func newTweetService(db *sqlx.DB) core.TweetService {
return &tweetSrv{ return &tweetSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtGetTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtListTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtListTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtListStar: c(`SELECT * FROM @person WHERE first_name=?`), stmtListStar: c(`SELECT * FROM @user WHERE username=?`),
} }
} }
@ -336,17 +336,17 @@ func newTweetManageService(db *sqlx.DB, cacheIndex core.CacheIndexService) core.
return &tweetManageSrv{ return &tweetManageSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
cacheIndex: cacheIndex, cacheIndex: cacheIndex,
stmtAddTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtDelTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelTweet: c(`SELECT * FROM @user WHERE username=?`),
stmtStickTweet: c(`SELECT * FROM @person WHERE first_name=?`), stmtStickTweet: c(`SELECT * FROM @user WHERE username=?`),
} }
} }
func newTweetHelpService(db *sqlx.DB) core.TweetHelpService { func newTweetHelpService(db *sqlx.DB) core.TweetHelpService {
return &tweetHelpSrv{ return &tweetHelpSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtAddTag: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddTag: c(`SELECT * FROM @user WHERE username=?`),
stmtDelTag: c(`SELECT * FROM @person WHERE first_name=?`), stmtDelTag: c(`SELECT * FROM @user WHERE username=?`),
stmtListTag: c(`SELECT * FROM @person WHERE first_name=?`), stmtListTag: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -66,8 +66,8 @@ func (s *userManageSrv) UpdateUser(user *core.User) error {
func newUserManageService(db *sqlx.DB) core.UserManageService { func newUserManageService(db *sqlx.DB) core.UserManageService {
return &userManageSrv{ return &userManageSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtAddUser: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddUser: c(`SELECT * FROM @user WHERE username=?`),
stmtUpdateUser: c(`SELECT * FROM @person WHERE first_name=?`), stmtUpdateUser: c(`SELECT * FROM @user WHERE username=?`),
stmtGetUser: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetUser: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -59,8 +59,8 @@ func (s *walletSrv) HandlePostAttachmentBought(post *core.Post, user *core.User)
func newWalletService(db *sqlx.DB) core.WalletService { func newWalletService(db *sqlx.DB) core.WalletService {
return &walletSrv{ return &walletSrv{
sqlxSrv: newSqlxSrv(db), sqlxSrv: newSqlxSrv(db),
stmtAddRecharge: c(`SELECT * FROM @person WHERE first_name=?`), stmtAddRecharge: c(`SELECT * FROM @user WHERE username=?`),
stmtGetRecharge: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetRecharge: c(`SELECT * FROM @user WHERE username=?`),
stmtGetBills: c(`SELECT * FROM @person WHERE first_name=?`), stmtGetBills: c(`SELECT * FROM @user WHERE username=?`),
} }
} }

@ -0,0 +1,50 @@
-- name: newest_tags@topic
-- get newest tag information
SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin
FROM @tag t
JOIN @user u
ON t.user_id = u.id
WHERE t.is_del = 0 AND t.quote_num > 0
ORDER BY t.id DESC
LIMIT ? OFFSET ?;
-- name: hot_tags@topic
-- get get host tag information
SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin
FROM @tag t
JOIN @user u
ON t.user_id = u.id
WHERE t.is_del = 0 AND t.quote_num > 0
ORDER BY t.quote_num DESC
LIMIT ? OFFSET ?;
-- name: tags_by_keyword_a@topic
-- get tags by keyword
SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6;
-- name: tags_by_keyword_b@topic
SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6;
-- name: insert_tag@topic
INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1);
-- name: tags_by_id_a@topic
-- clause: in
SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0;
-- name: tags_by_id_b@topic
-- clause: in
SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?);
-- name: decr_tags_by_id@topic
-- clause: in
UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?);
-- name: tags_for_incr@topic
-- clause: in
SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?);
-- name: incr_tags_by_id@topic
-- clause: in
UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?);
Loading…
Cancel
Save