48 lines
1.5 KiB
Go
48 lines
1.5 KiB
Go
package store
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
)
|
|
|
|
// InstanceGuardMarker 是 instance_guard 表的唯一一行。
|
|
type InstanceGuardMarker struct {
|
|
DBDev uint64
|
|
DBIno uint64
|
|
LockDev uint64
|
|
LockIno uint64
|
|
InstanceID string
|
|
LockGen string
|
|
}
|
|
|
|
// LoadInstanceGuard 读取守卫标记。没有行时 ok 为 false。
|
|
func (s *Store) LoadInstanceGuard() (InstanceGuardMarker, bool, error) {
|
|
var m InstanceGuardMarker
|
|
var dbDev, dbIno, lockDev, lockIno int64
|
|
err := s.db.QueryRow(`SELECT db_dev, db_ino, lock_dev, lock_ino, instance_id, lock_gen FROM instance_guard WHERE id=1`).
|
|
Scan(&dbDev, &dbIno, &lockDev, &lockIno, &m.InstanceID, &m.LockGen)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return InstanceGuardMarker{}, false, nil
|
|
}
|
|
if err != nil {
|
|
return InstanceGuardMarker{}, false, err
|
|
}
|
|
m.DBDev = uint64(dbDev)
|
|
m.DBIno = uint64(dbIno)
|
|
m.LockDev = uint64(lockDev)
|
|
m.LockIno = uint64(lockIno)
|
|
return m, true, nil
|
|
}
|
|
|
|
// SaveInstanceGuard 写入或覆盖唯一一行。
|
|
func (s *Store) SaveInstanceGuard(m InstanceGuardMarker) error {
|
|
_, err := s.db.Exec(s.q(`INSERT INTO instance_guard(id, db_dev, db_ino, lock_dev, lock_ino, instance_id, lock_gen)
|
|
VALUES(1,?,?,?,?,?,?)
|
|
ON CONFLICT(id) DO UPDATE SET
|
|
db_dev=excluded.db_dev, db_ino=excluded.db_ino,
|
|
lock_dev=excluded.lock_dev, lock_ino=excluded.lock_ino,
|
|
instance_id=excluded.instance_id, lock_gen=excluded.lock_gen`),
|
|
int64(m.DBDev), int64(m.DBIno), int64(m.LockDev), int64(m.LockIno), m.InstanceID, m.LockGen)
|
|
return err
|
|
}
|