Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Strain nodes replace host nodes in FleetTopologyMap; server queues epidemiology_fix on auth and reports interrupts to AI and Seer.
47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
"time"
|
|
)
|
|
|
|
// UpdateAgentGraft records an approved genealogy graft on the target agent.
|
|
func (d *Database) UpdateAgentGraft(id, sourceStrain, graftTier string, approvedAt time.Time) error {
|
|
if approvedAt.IsZero() {
|
|
approvedAt = time.Now().UTC()
|
|
}
|
|
_, err := d.Exec(
|
|
`UPDATE agents SET graft_source_strain = ?, graft_tier = ?, graft_approved_at = ? WHERE id = ?`,
|
|
sourceStrain, graftTier, approvedAt.UTC().Format(time.RFC3339), id,
|
|
)
|
|
return err
|
|
}
|
|
|
|
// ClearAgentGraft removes pending graft metadata after the agent consumes it on spread.
|
|
func (d *Database) ClearAgentGraft(id string) error {
|
|
_, err := d.Exec(
|
|
`UPDATE agents SET graft_source_strain = '', graft_tier = '', graft_approved_at = NULL WHERE id = ?`,
|
|
id,
|
|
)
|
|
return err
|
|
}
|
|
|
|
func scanGraftFields(sourceStrain, graftTier, approvedRaw sql.NullString) (string, string, *time.Time) {
|
|
strain := ""
|
|
if sourceStrain.Valid {
|
|
strain = sourceStrain.String
|
|
}
|
|
tier := ""
|
|
if graftTier.Valid {
|
|
tier = graftTier.String
|
|
}
|
|
var approved *time.Time
|
|
if approvedRaw.Valid && approvedRaw.String != "" {
|
|
if t, err := time.Parse(time.RFC3339, approvedRaw.String); err == nil {
|
|
utc := t.UTC()
|
|
approved = &utc
|
|
}
|
|
}
|
|
return strain, tier, approved
|
|
}
|