60 lines
938 B
Go
60 lines
938 B
Go
package wal
|
|
|
|
import (
|
|
"database/sql"
|
|
)
|
|
|
|
type Record struct {
|
|
SeqNum uint64
|
|
Collection string
|
|
ID uint64
|
|
Store bool
|
|
Data []byte
|
|
}
|
|
|
|
type Follower struct {
|
|
db *sql.DB
|
|
selectStmt *sql.Stmt
|
|
}
|
|
|
|
func NewFollower(walPath string) *Follower {
|
|
db := initWAL(walPath)
|
|
|
|
selectStmt, err := db.Prepare(sqlWALFollowQuery)
|
|
must(err)
|
|
|
|
return &Follower{
|
|
db: db,
|
|
selectStmt: selectStmt,
|
|
}
|
|
}
|
|
|
|
func (f *Follower) Close() {
|
|
f.db.Close()
|
|
}
|
|
|
|
func (f *Follower) MaxSeqNum() (n uint64) {
|
|
must(f.db.QueryRow(sqlWALMaxSeqNum).Scan(&n))
|
|
return
|
|
}
|
|
|
|
func (f *Follower) Replay(afterSeqNum uint64, each func(rec Record) error) error {
|
|
rec := Record{}
|
|
rows, err := f.selectStmt.Query(afterSeqNum)
|
|
must(err)
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
must(rows.Scan(
|
|
&rec.SeqNum,
|
|
&rec.Collection,
|
|
&rec.ID,
|
|
&rec.Store,
|
|
&rec.Data))
|
|
if err = each(rec); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|