// queryZone retrieves the specific ZoneConfig associated with the supplied ID, // if it exists. func (s *adminServer) queryZone( session *sql.Session, id sqlbase.ID, ) (config.ZoneConfig, bool, error) { const query = `SELECT config FROM system.zones WHERE id = $1` params := parser.NewPlaceholderInfo() params.SetValue(`1`, parser.NewDInt(parser.DInt(id))) r := s.server.sqlExecutor.ExecuteStatements(session, query, params) if err := s.checkQueryResults(r.ResultList, 1); err != nil { return config.ZoneConfig{}, false, err } result := r.ResultList[0] if len(result.Rows) == 0 { return config.ZoneConfig{}, false, nil } var zoneBytes []byte scanner := resultScanner{} err := scanner.ScanIndex(result.Rows[0], 0, &zoneBytes) if err != nil { return config.ZoneConfig{}, false, err } var zone config.ZoneConfig if err := zone.Unmarshal(zoneBytes); err != nil { return config.ZoneConfig{}, false, err } return zone, true, nil }
// 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 } }