// runSetZone parses the yaml input file, converts it to proto, // and inserts it in the system.zones table. // TODO(marc): accept db/table names rather than IDs. func runSetZone(cmd *cobra.Command, args []string) { if len(args) != 2 { mustUsage(cmd) return } id, err := strconv.Atoi(args[0]) if err != nil { log.Errorf("could not parse object ID %s", args[0]) return } // Read in the config file. body, err := ioutil.ReadFile(args[1]) if err != nil { log.Errorf("unable to read zone config file %q: %s", args[1], err) return } // Convert it to proto and marshal it again to put into the table. // This is a bit more tedious than taking protos directly, // but yaml is a more widely understood format. var pbZoneConfig config.ZoneConfig if err := yaml.Unmarshal(body, &pbZoneConfig); err != nil { log.Errorf("unable to parse zone config file %q: %s", args[1], err) return } if err := pbZoneConfig.Validate(); err != nil { log.Error(err) return } buf, err := gogoproto.Marshal(&pbZoneConfig) if err != nil { log.Errorf("unable to parse zone config file %q: %s", args[1], err) return } db := makeSQLClient() // TODO(marc): switch to UPSERT. err = runPrettyQuery(db, `INSERT INTO system.zones VALUES ($1, $2)`, id, buf) if err != nil { log.Error(err) return } }
// runSetZone parses the yaml input file, converts it to proto, // and inserts it in the system.zones table. // TODO(marc): accept db/table names rather than IDs. func runSetZone(cmd *cobra.Command, args []string) { if len(args) != 2 { mustUsage(cmd) return } id, err := strconv.Atoi(args[0]) if err != nil { log.Errorf("could not parse object ID %s", args[0]) return } // Convert it to proto and marshal it again to put into the table. // This is a bit more tedious than taking protos directly, // but yaml is a more widely understood format. var pbZoneConfig config.ZoneConfig if err := yaml.Unmarshal([]byte(args[1]), &pbZoneConfig); err != nil { log.Errorf("unable to parse zone config file %q: %s", args[1], err) return } if err := pbZoneConfig.Validate(); err != nil { log.Error(err) return } buf, err := proto.Marshal(&pbZoneConfig) if err != nil { log.Errorf("unable to parse zone config file %q: %s", args[1], err) return } db, _ := makeSQLClient() defer func() { _ = db.Close() }() // TODO(marc): switch to UPSERT. // TODO(marc): switch to placeholders when they're fixed with pgwire. err = runPrettyQuery(db, os.Stdout, fmt.Sprintf(`INSERT INTO system.zones VALUES (%d, '%s'::bytes)`, id, string(buf))) if err != nil { log.Error(err) return } }