55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package postgres
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
"go.uber.org/zap"
|
|
|
|
"telesrv/internal/store"
|
|
"telesrv/internal/store/postgres/sqlcgen"
|
|
)
|
|
|
|
// MessageStore 用 PostgreSQL 实现 store.MessageStore。
|
|
type MessageStore struct {
|
|
db sqlcgen.DBTX
|
|
q *sqlcgen.Queries
|
|
boxIDs store.BoxIDAllocator
|
|
log *zap.Logger
|
|
}
|
|
|
|
type txBeginner interface {
|
|
Begin(ctx context.Context) (pgx.Tx, error)
|
|
}
|
|
|
|
// MessageStoreOption 调整 PostgreSQL MessageStore 依赖。
|
|
type MessageStoreOption func(*MessageStore)
|
|
|
|
// WithMessageAllocators 注入 Redis-backed box_id allocator。
|
|
func WithMessageAllocators(boxIDs store.BoxIDAllocator) MessageStoreOption {
|
|
return func(s *MessageStore) {
|
|
s.boxIDs = boxIDs
|
|
}
|
|
}
|
|
|
|
// WithMessageLogger 注入消息 store 日志器,用于追踪消息与 pts 原子写入。
|
|
func WithMessageLogger(log *zap.Logger) MessageStoreOption {
|
|
return func(s *MessageStore) {
|
|
s.log = log
|
|
}
|
|
}
|
|
|
|
// NewMessageStore 基于 pgx 连接池(或事务)创建 MessageStore。
|
|
func NewMessageStore(db sqlcgen.DBTX, opts ...MessageStoreOption) *MessageStore {
|
|
s := &MessageStore{db: db, q: sqlcgen.New(db)}
|
|
for _, opt := range opts {
|
|
opt(s)
|
|
}
|
|
if s.log == nil {
|
|
s.log = zap.NewNop()
|
|
}
|
|
if s.boxIDs == nil {
|
|
s.boxIDs = pgBoxIDAllocator{s: s}
|
|
}
|
|
return s
|
|
}
|