func()

in nimo-full-check/checker/document-checker.go [221:292]


func (dc *DocumentChecker) executor() {
	LOG.Info("%s start executor", dc.String())

	diffFile := fmt.Sprintf("%s/%s", conf.Opts.DiffOutputFile, dc.ns.Collection)
	f, err := os.Create(diffFile)
	if err != nil {
		LOG.Crashf("%s create diff output file[%v] failed", dc.String(), diffFile)
		return
	}

	for {
		data, ok := <-dc.parserChan
		if !ok {
			break
		}

		//var query map[string]interface{}
		query := make(map[string]interface{})
		if dc.primaryKeyWithType.name != "" {
			// find by union key
			if conf.Opts.ConvertType == shakeUtils.ConvertMTypeChange {
				query[dc.primaryKeyWithType.name] = data.Data.(map[string]interface{})[dc.primaryKeyWithType.name]
			} else {
				LOG.Crashf("unknown convert type[%v]", conf.Opts.ConvertType)
			}
		}
		if dc.sortKeyWithType.name != "" {
			if conf.Opts.ConvertType == shakeUtils.ConvertMTypeChange {
				query[dc.sortKeyWithType.name] = data.Data.(map[string]interface{})[dc.sortKeyWithType.name]
			} else {
				LOG.Crashf("unknown convert type[%v]", conf.Opts.ConvertType)
			}
		}

		LOG.Info("query: %v", query)

		// query
		var output, outputMap interface{}
		isSame := true
		err := dc.mongoClient.Client.Database(dc.ns.Database).Collection(dc.ns.Collection).
			FindOne(context.TODO(), query).Decode(&output)
		if err != nil {
			err = fmt.Errorf("target query failed[%v][%v][%v]", err, output, query)
			LOG.Error("%s %v", dc.String(), err)
		} else {
			outputMap = convertToMap(output)
			isSame = interIsEqual(data.Data, outputMap)
		}

		inputJson, _ := json.Marshal(data.Data)
		outputJson, _ := json.Marshal(outputMap)
		if err != nil {
			f.WriteString(fmt.Sprintf("compare src[%s] to dst[%s] failed: %v\n", inputJson, outputJson, err))
		} else if isSame == false {
			LOG.Warn("compare src[%s] and dst[%s] failed", inputJson, outputJson)
			f.WriteString(fmt.Sprintf("src[%s] != dst[%s]\n", inputJson, outputJson))
		}
	}

	LOG.Info("%s close executor", dc.String())
	f.Close()

	// remove file if size == 0
	if fi, err := os.Stat(diffFile); err != nil {
		LOG.Warn("stat diffFile[%v] failed[%v]", diffFile, err)
		return
	} else if fi.Size() == 0 {
		if err := os.Remove(diffFile); err != nil {
			LOG.Warn("remove diffFile[%v] failed[%v]", diffFile, err)
		}
	}
}