func (ns *namespace) SetWorkSpec(data map[string]interface{}) (coordinate.WorkSpec, error) { name, meta, err := coordinate.ExtractWorkSpecMeta(data) if err != nil { return nil, err } spec := workSpec{ namespace: ns, name: name, } err = withTx(ns, false, func(tx *sql.Tx) error { params := queryParams{} query := buildSelect([]string{ workSpecID, }, []string{ workSpecTable, }, []string{ workSpecInNamespace(¶ms, ns.id), workSpecHasName(¶ms, name), }) row := tx.QueryRow(query, params...) err = row.Scan(&spec.id) if err == nil { err = spec.setData(tx, data, meta) } else if err == sql.ErrNoRows { var dataBytes []byte dataBytes, err = mapToBytes(data) if err != nil { return err } params = queryParams{} fields := fieldList{} fields.Add(¶ms, "namespace_id", ns.id) fields.Add(¶ms, "name", name) fields.Add(¶ms, "data", dataBytes) fields.Add(¶ms, "priority", meta.Priority) fields.Add(¶ms, "weight", meta.Weight) fields.Add(¶ms, "paused", meta.Paused) fields.Add(¶ms, "continuous", meta.Continuous) fields.Add(¶ms, "can_be_continuous", meta.CanBeContinuous) fields.Add(¶ms, "min_memory_gb", meta.MinMemoryGb) fields.Add(¶ms, "interval", durationToSQL(meta.Interval)) fields.Add(¶ms, "next_continuous", timeToNullTime(meta.NextContinuous)) fields.Add(¶ms, "max_running", meta.MaxRunning) fields.Add(¶ms, "max_attempts_returned", meta.MaxAttemptsReturned) fields.Add(¶ms, "next_work_spec_name", meta.NextWorkSpecName) fields.AddDirect("next_work_spec_preempts", "FALSE") fields.Add(¶ms, "runtime", meta.Runtime) query = fields.InsertStatement(workSpecTable) + "RETURNING id" row = tx.QueryRow(query, params...) err = row.Scan(&spec.id) } return err }) if err != nil { return nil, err } return &spec, nil }
func (spec *workSpec) SetData(data map[string]interface{}) error { name, meta, err := coordinate.ExtractWorkSpecMeta(data) if err != nil { return err } if name != spec.name { return coordinate.ErrChangedName } return withTx(spec, false, func(tx *sql.Tx) error { return spec.setData(tx, data, meta) }) }
// setData is an internal version of SetData() with the same constraints, // guarantees, and checking. It assumes the global lock. func (spec *workSpec) setData(data map[string]interface{}) error { name, meta, err := coordinate.ExtractWorkSpecMeta(data) if err == nil { if name != spec.name { err = coordinate.ErrChangedName } } if err == nil { spec.data = data spec.meta = meta } return err }