| package model |
| |
| import ( |
| "context" |
| "database/sql" |
| "fmt" |
| ) |
| |
| func (m *sqlModel) ConfigureMissingSessions(ctx context.Context, gen func() SessionConfig) error { |
| tx := m.db.MustBeginTx(ctx, &sql.TxOptions{}) |
| defer tx.Rollback() |
| |
| q := ` |
| SELECT |
| peer_routers.peer_id "peer_id", |
| peer_routers.id "id" |
| FROM peer_routers |
| WHERE peer_routers.id NOT IN ( |
| SELECT session_configs.peer_router_id |
| FROM session_configs |
| ) |
| ` |
| missing := []struct { |
| PeerID string `db:"peer_id"` |
| ID string `db:"id"` |
| }{} |
| if err := m.db.SelectContext(ctx, &missing, q); err != nil { |
| return fmt.Errorf("SELECT peerRouters: %v", err) |
| } |
| |
| for _, m := range missing { |
| config := gen() |
| q = ` |
| INSERT INTO |
| session_configs |
| (peer_id, peer_router_id, bgp_secret) |
| VALUES |
| (:peer_id, :peer_router_id, :bgp_secret) |
| ` |
| data := sqlSessionConfig{ |
| PeerID: m.PeerID, |
| PeerRouterID: m.ID, |
| BGPSecret: config.BGPSecret, |
| } |
| if _, err := tx.NamedExecContext(ctx, q, data); err != nil { |
| return err |
| } |
| } |
| |
| return tx.Commit() |
| } |