package persistence import ( "encoding/json" "fmt" "regexp" "strings" "github.com/Masterminds/squirrel" "github.com/deluan/navidrome/model" "github.com/deluan/navidrome/utils" ) func toSqlArgs(rec interface{}) (map[string]interface{}, error) { // Convert to JSON... b, err := json.Marshal(rec) if err != nil { return nil, err } // ... then convert to map var m map[string]interface{} err = json.Unmarshal(b, &m) r := make(map[string]interface{}, len(m)) for f, v := range m { if !utils.StringInSlice(f, model.AnnotationFields) && v != nil { r[toSnakeCase(f)] = v } } return r, err } var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)") var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])") func toSnakeCase(str string) string { snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}") snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}") return strings.ToLower(snake) } func exists(subTable string, cond squirrel.Sqlizer) existsCond { return existsCond{subTable: subTable, cond: cond} } type existsCond struct { subTable string cond squirrel.Sqlizer } func (e existsCond) ToSql() (string, []interface{}, error) { sql, args, err := e.cond.ToSql() sql = fmt.Sprintf("exists (select 1 from %s where %s)", e.subTable, sql) return sql, args, err }