func()

in component/loopback/loopback_fs.go [504:564]


func (lfs *LoopbackFS) CommitData(options internal.CommitDataOptions) error {
	log.Trace("LoopbackFS::StageData : name=%s", options.Name)

	mainFilepath := filepath.Join(lfs.path, options.Name)

	blob, err := os.OpenFile(mainFilepath, os.O_RDWR|os.O_CREATE, os.FileMode(0777))
	if err != nil {
		log.Err("LoopbackFS::CommitData : error opening [%s]", err)
		return err
	}

	if len(options.List) == 0 {
		err = blob.Truncate(0)
		if err != nil {
			return err
		}
	}

	for idx, id := range options.List {
		path := fmt.Sprintf("%s_%s", filepath.Join(lfs.path, options.Name), strings.ReplaceAll(id, "/", "_"))
		info, err := os.Lstat(path)
		if err == nil {
			block, err := os.OpenFile(path, os.O_RDONLY, os.FileMode(0666))
			if err != nil {
				return err
			}

			data := make([]byte, info.Size())
			n, err := block.Read(data)
			if int64(n) != info.Size() {
				log.Err("LoopbackFS::CommitData : error [could not read entire file]")
				return err
			}

			n, err = blob.WriteAt(data, int64(idx*(int)(options.BlockSize)))
			if err != nil {
				return err
			}
			if int64(n) != info.Size() {
				log.Err("LoopbackFS::CommitData : error [could not write file]")
				return err
			}

			err = block.Close()
			if err != nil {
				return err
			}
		} else if !os.IsNotExist(err) {
			return err
		}
	}

	// delete the staged files
	for _, id := range options.List {
		path := fmt.Sprintf("%s_%s", filepath.Join(lfs.path, options.Name), strings.ReplaceAll(id, "/", "_"))
		_ = os.Remove(path)
	}

	err = blob.Close()
	return err
}