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)
}