13111: Rearrange source files.
[arvados.git] / sdk / go / arvados / fs_base.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package arvados
6
7 import (
8         "os"
9         "sync"
10 )
11
12 type nullnode struct{}
13
14 func (*nullnode) Mkdir(string, os.FileMode) error {
15         return ErrInvalidOperation
16 }
17
18 func (*nullnode) Read([]byte, filenodePtr) (int, filenodePtr, error) {
19         return 0, filenodePtr{}, ErrInvalidOperation
20 }
21
22 func (*nullnode) Write([]byte, filenodePtr) (int, filenodePtr, error) {
23         return 0, filenodePtr{}, ErrInvalidOperation
24 }
25
26 func (*nullnode) Truncate(int64) error {
27         return ErrInvalidOperation
28 }
29
30 func (*nullnode) FileInfo() os.FileInfo {
31         return fileinfo{}
32 }
33
34 func (*nullnode) IsDir() bool {
35         return false
36 }
37
38 func (*nullnode) Readdir() []os.FileInfo {
39         return nil
40 }
41
42 func (*nullnode) Child(name string, replace func(inode) inode) inode {
43         return nil
44 }
45
46 type treenode struct {
47         parent   inode
48         inodes   map[string]inode
49         fileinfo fileinfo
50         sync.RWMutex
51         nullnode
52 }
53
54 func (n *treenode) Parent() inode {
55         n.RLock()
56         defer n.RUnlock()
57         return n.parent
58 }
59
60 func (n *treenode) IsDir() bool {
61         return true
62 }
63
64 func (n *treenode) Child(name string, replace func(inode) inode) (child inode) {
65         // TODO: special treatment for "", ".", ".."
66         child = n.inodes[name]
67         if replace != nil {
68                 child = replace(child)
69                 if child == nil {
70                         delete(n.inodes, name)
71                 } else {
72                         n.inodes[name] = child
73                 }
74         }
75         return
76 }
77
78 func (n *treenode) Size() int64 {
79         return n.FileInfo().Size()
80 }
81
82 func (n *treenode) FileInfo() os.FileInfo {
83         n.Lock()
84         defer n.Unlock()
85         n.fileinfo.size = int64(len(n.inodes))
86         return n.fileinfo
87 }
88
89 func (n *treenode) Readdir() (fi []os.FileInfo) {
90         n.RLock()
91         defer n.RUnlock()
92         fi = make([]os.FileInfo, 0, len(n.inodes))
93         for _, inode := range n.inodes {
94                 fi = append(fi, inode.FileInfo())
95         }
96         return
97 }