Files
AetherForge/server/internal/db/graft.go
AetherForge c8b3b2a126
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Add fleet topology epidemiology: strain plague map and mining interrupt fixes.
Strain nodes replace host nodes in FleetTopologyMap; server queues epidemiology_fix on auth and reports interrupts to AI and Seer.
2026-06-07 09:19:48 -07:00

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
}