Files
scroll/database/orm/session_info.go
colinlyguo 303a7d02c8 feat: coordinator graceful restart (#110)
Co-authored-by: colinlyguo <colinlyguo@gmail.com>
Co-authored-by: maskpp <maskpp266@gmail.com>
Co-authored-by: Péter Garamvölgyi <peter@scroll.io>
Co-authored-by: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com>
Co-authored-by: Lawliet-Chan <1576710154@qq.com>
Co-authored-by: HAOYUatHZ <haoyu@protonmail.com>
2022-12-08 19:44:16 +08:00

56 lines
1.3 KiB
Go

package orm
import (
"encoding/json"
"github.com/jmoiron/sqlx"
)
type sessionInfoOrm struct {
db *sqlx.DB
}
var _ SessionInfoOrm = (*sessionInfoOrm)(nil)
// NewSessionInfoOrm create an sessionInfoOrm instance
func NewSessionInfoOrm(db *sqlx.DB) SessionInfoOrm {
return &sessionInfoOrm{db: db}
}
func (o *sessionInfoOrm) GetSessionInfosByIDs(ids []string) ([]*SessionInfo, error) {
if len(ids) == 0 {
return nil, nil
}
query, args, err := sqlx.In("SELECT rollers_info FROM session_info WHERE id IN (?);", ids)
if err != nil {
return nil, err
}
rows, err := o.db.Queryx(o.db.Rebind(query), args...)
if err != nil {
return nil, err
}
var sessionInfos []*SessionInfo
for rows.Next() {
var infoBytes []byte
if err := rows.Scan(&infoBytes); err != nil {
return nil, err
}
sessionInfo := &SessionInfo{}
if err := json.Unmarshal(infoBytes, sessionInfo); err != nil {
return nil, err
}
sessionInfos = append(sessionInfos, sessionInfo)
}
return sessionInfos, nil
}
func (o *sessionInfoOrm) SetSessionInfo(rollersInfo *SessionInfo) error {
infoBytes, err := json.Marshal(rollersInfo)
if err != nil {
return err
}
sqlStr := "INSERT INTO session_info (id, rollers_info) VALUES ($1, $2) ON CONFLICT (id) DO UPDATE SET rollers_info = EXCLUDED.rollers_info;"
_, err = o.db.Exec(sqlStr, rollersInfo.ID, infoBytes)
return err
}