示例#1
0
func processSubmit(db *sqlx.DB, sender func(msg proto.Message) error, rows grabber.RowOrRows) error {
	sub, err := scanSubmit(rows)
	if err != nil {
		return err
	}
	related, err := findRelatedSubmits(db, sub)
	if err != nil {
		return err
	}

	result := tickets.Ticket{
		SubmitId: proto.Uint32(uint32(sub.ID)),
		Printer:  &sub.Printer,
		Computer: &tickets.Computer{Id: &sub.ComputerID, Name: &sub.ComputerName},
		Area:     &tickets.IdName{Id: proto.Uint32(uint32(sub.AreaID)), Name: &sub.AreaName},
		Contest:  &tickets.IdName{Id: proto.Uint32(uint32(sub.Contest)), Name: &sub.ContestName},
		Problem:  &tickets.Ticket_Problem{Id: &sub.Task, Name: &sub.ProblemName},
	}

	teamName := sub.SchoolName
	if sub.TeamNum.Valid && sub.TeamNum.Int64 > 0 {
		teamName = teamName + " #" + strconv.FormatInt(sub.TeamNum.Int64, 10)
	}
	result.Team = &tickets.IdName{Id: proto.Uint32(uint32(sub.Team)), Name: &teamName}
	result.JudgeTime = proto.Uint64(uint64(sub.Touched.UnixNano() / 1000))

	result.Submit = make([]*tickets.Ticket_Submit, 0)
	result.Submit = append(result.Submit, createSubmit(db, sub, len(related)+1))
	for count := len(related); count > 0; {
		count -= 1
		result.Submit = append(result.Submit, createSubmit(db, related[count], count))
	}

	if err = sender(&result); err != nil {
		return err
	}
	if _, err = db.Exec("Update Submits set Printed = Touched where ID = ?", sub.ID); err != nil {
		return err
	}
	fmt.Printf("Printed submit %d\n", sub.ID)
	return nil
}