intake/core/env.go
2025-02-12 10:04:58 -08:00

85 lines
1.7 KiB
Go

package core
import (
"fmt"
"strings"
)
func GetEnvs(db DB, source string) (envs []string, err error) {
rows, err := db.Query(`
select name, value
from envs
where source = ?
`, source)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var name string
var value string
if err = rows.Scan(&name, &value); err != nil {
return nil, err
}
envs = append(envs, fmt.Sprintf("%s=%s", name, value))
}
if err = rows.Err(); err != nil {
return nil, err
}
return
}
func GetEnvsMap(db DB, source string) (envs map[string]string, err error) {
rows, err := db.Query(`
select name, value
from envs
where source = ?
`, source)
if err != nil {
return nil, err
}
defer rows.Close()
envs = make(map[string]string)
for rows.Next() {
var name string
var value string
if err = rows.Scan(&name, &value); err != nil {
return nil, err
}
envs[name] = value
}
if err = rows.Err(); err != nil {
return nil, err
}
return
}
func SetEnvs(db DB, source string, envs []string) error {
return db.Transact(func(tx DB) error {
for _, env := range envs {
parts := strings.SplitN(env, "=", 2)
if len(parts) != 2 {
return fmt.Errorf("invalid env format: %s", env)
}
if parts[1] == "" {
_, err := tx.Exec(`
delete from envs
where source = ? and name = ?
`, source, parts[0])
if err != nil {
return fmt.Errorf("failed to clear source %s env %s: %v", source, parts[0], err)
}
} else {
_, err := tx.Exec(`
insert into envs (source, name, value)
values (?, ?, ?)
`, source, parts[0], parts[1])
if err != nil {
return fmt.Errorf("failed to set source %s env %s = %s: %v", source, parts[0], parts[1], err)
}
}
}
return nil
})
}