func()

in nimo-shake/checkpoint/fileWriter.go [221:276]


func (fw *FileWriter) UpdateWithSet(shardId string, input map[string]interface{}, table string) error {
	fw.lockFile(table)
	defer fw.unlockFile(table)

	file := fmt.Sprintf("%s/%s", fw.dir, table)
	jsonFile, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE, 0666)
	if err != nil {
		return err
	}
	defer jsonFile.Close()

	data, err := fw.readJsonList(jsonFile)
	if err != nil {
		return err
	}

	if len(data) == 0 {
		return fmt.Errorf("empty data")
	}

	match := false
	for i := range data {
		if data[i].ShardId == shardId {
			match = true
			// set partial
			for key, val := range input {
				field := reflect.ValueOf(data[i]).Elem().FieldByName(key)
				switch field.Kind() {
				case reflect.String:
					v, _ := val.(string)
					field.SetString(v)
				case reflect.Invalid:
					printData, _ := json.Marshal(data[i])
					return fmt.Errorf("invalid field[%v], current checkpoint[%s], input checkpoint[%v]",
						key, printData, input)
				default:
					printData, _ := json.Marshal(data[i])
					return fmt.Errorf("unknown type[%v] of field[%v], current checkpoint[%s], input checkpoint[%v]",
						field.Kind(), key, printData, input)
				}
			}

			break
		}
	}
	if !match {
		return fmt.Errorf("shardId[%v] not exists", shardId)
	}

	// truncate file
	jsonFile.Truncate(0)
	jsonFile.Seek(0, 0)

	// write
	return fw.writeJsonList(jsonFile, data)
}