95 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package mysql
import (
"context"
"database/sql"
"strings"
"time"
"hyapp/pkg/xerr"
)
// Repository 是 wallet-service 的 MySQL v2 账本入口。
type Repository struct {
// db 是账户、交易、分录和 outbox 的同一事务边界。
db *sql.DB
}
// Open 创建 MySQL 连接池并做启动 ping。
func Open(ctx context.Context, dsn string) (*Repository, error) {
if strings.TrimSpace(dsn) == "" {
return nil, xerr.New(xerr.InvalidArgument, "mysql_dsn is required")
}
db, err := sql.Open("mysql", dsn)
if err != nil {
return nil, err
}
// 标准库默认不限制连接数,高并发下会打爆 MySQL max_connections必须显式设上限。
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(30 * time.Minute)
if err := db.PingContext(ctx); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureGiftDiamondRatioSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureCoinSellerSalaryExchangeRateSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureUserResourceEquipmentSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureExternalRechargeSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureResourceShopPurchaseOrderIndexes(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureHostSalarySettlementSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureResourceGrantRevokeSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureGooglePaymentPaidDetailsSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
if err := ensureWalletPolicyInstanceSchema(ctx, db); err != nil {
_ = db.Close()
return nil, err
}
return &Repository{db: db}, nil
}
// Close 释放 MySQL 连接池。
func (r *Repository) Close() error {
if r == nil || r.db == nil {
return nil
}
return r.db.Close()
}
// Ping 验证 MySQL 当前可用。
func (r *Repository) Ping(ctx context.Context) error {
if r == nil || r.db == nil {
return xerr.New(xerr.Unavailable, "mysql repository is not configured")
}
return r.db.PingContext(ctx)
}