func()

in oracle/pkg/database/dbdaemon/dbdaemon_server.go [1928:1985]


func (s *Server) ReadDir(ctx context.Context, req *dbdpb.ReadDirRequest) (*dbdpb.ReadDirResponse, error) {
	if !strings.HasPrefix(req.GetPath(), "/") {
		return nil, fmt.Errorf("dbdaemon/ReadDir failed to read %v, only accept absolute path", req.GetPath())
	}
	currFileInfo, err := os.Stat(req.GetPath())
	if err != nil {
		return nil, fmt.Errorf("dbdaemon/ReadDir os.Stat(%v) failed: %v ", req.GetPath(), err)
	}
	rpcCurrFileInfo, err := convertToRpcFileInfo(currFileInfo, req.GetPath(), req.GetReadFileContent())
	if err != nil {
		return nil, fmt.Errorf("dbdaemon/ReadDir failed: %v ", err)
	}
	resp := &dbdpb.ReadDirResponse{
		CurrPath: rpcCurrFileInfo,
	}

	if !currFileInfo.IsDir() {
		// for a file, just return its fileInfo
		return resp, nil
	}

	if req.GetRecursive() {
		if err := filepath.Walk(req.GetPath(), func(path string, info os.FileInfo, err error) error {
			if err != nil {
				// stop walking if we see any error.
				return fmt.Errorf("visit %v, %v failed: %v", path, info, err)
			}
			if len(resp.SubPaths) >= maxWalkFiles {
				return fmt.Errorf("visited more than %v files, try reduce the dir scope", maxWalkFiles)
			}
			if path == req.GetPath() {
				return nil
			}
			rpcInfo, err := convertToRpcFileInfo(info, path, req.GetReadFileContent())
			if err != nil {
				return fmt.Errorf("visit %v, %v failed: %v ", info, path, err)
			}
			resp.SubPaths = append(resp.SubPaths, rpcInfo)
			return nil
		}); err != nil {
			return nil, fmt.Errorf("dbdaemon/ReadDir filepath.Walk(%v) failed: %v ", req.GetPath(), err)
		}
	} else {
		subFileInfos, err := ioutil.ReadDir(req.GetPath())
		if err != nil {
			return nil, fmt.Errorf("dbdaemon/ReadDir ioutil.ReadDir(%v) failed: %v ", req.GetPath(), err)
		}
		for _, info := range subFileInfos {
			rpcInfo, err := convertToRpcFileInfo(info, filepath.Join(req.GetPath(), info.Name()), req.GetReadFileContent())
			if err != nil {
				return nil, fmt.Errorf("dbdaemon/ReadDir failed: %v ", err)
			}
			resp.SubPaths = append(resp.SubPaths, rpcInfo)
		}
	}

	return resp, nil
}