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
}