Ejemplo n.º 1
0
// Translated from nzedb Binaries.php and pynab handling
// Save all messages that match a basic regex as segments and
func saveOverviewBatch(dbh *db.Handle, group string, overviews []nntp.MessageOverview, missed types.MessageNumberSet) error {
	parts := map[string]*types.Part{}

	for _, o := range overviews {
		//TODO: make this a function call
		if blacklistRegexp.MatchString(o.Subject) {
			continue
		}
		m := segmentRegexp.FindStringSubmatch(o.Subject)
		if m != nil {
			subj := m[1]
			if !yencRegexp.MatchString(subj) {
				subj += " yEnc"
			}
			segNum, _ := strconv.Atoi(m[2])
			segTotal, _ := strconv.Atoi(m[3])

			hash := hashOverview(subj, o.From, group, segTotal)
			seg := types.Segment{
				MessageID: o.MessageID,
				Segment:   segNum,
				Size:      int64(o.Bytes),
			}
			if part, ok := parts[hash]; ok {
				part.Segments = append(part.Segments, seg)
			} else {
				parts[hash] = &types.Part{
					Hash:          hash,
					Subject:       subj,
					Posted:        o.Date,
					From:          o.From,
					GroupName:     group,
					TotalSegments: segTotal,
					Xref:          o.Xref(),
					Segments:      []types.Segment{seg},
				}
			}
		}
	}
	mm := make([]types.MissedMessage, missed.Cardinality())
	i := 0
	for id := range missed.Iter() {
		mm[i] = types.MissedMessage{
			MessageNumber: int64(id),
			GroupName:     group,
			Attempts:      1,
		}
		i++
	}
	logrus.Debugf("Found %d new parts, %d missed messages", len(parts), len(mm))
	return dbh.SavePartsAndMissedMessages(parts, mm)
}