go-hep.org/x/hep@v0.38.1/groot/riofs/dir_example_test.go (about) 1 // Copyright ©2018 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package riofs_test 6 7 import ( 8 "fmt" 9 "log" 10 "os" 11 stdpath "path" 12 13 "go-hep.org/x/hep/groot" 14 "go-hep.org/x/hep/groot/rbase" 15 "go-hep.org/x/hep/groot/riofs" 16 "go-hep.org/x/hep/groot/root" 17 ) 18 19 func Example_mkdir() { 20 const fname = "../testdata/subdirs.root" 21 defer os.Remove(fname) 22 23 { 24 w, err := groot.Create(fname) 25 if err != nil { 26 log.Fatal(err) 27 } 28 defer w.Close() 29 30 dir1, err := w.Mkdir("dir1") 31 if err != nil { 32 log.Fatal(err) 33 } 34 35 dir11, err := dir1.Mkdir("dir11") 36 if err != nil { 37 log.Fatal(err) 38 } 39 40 err = dir11.Put("obj1", rbase.NewObjString("data-obj1")) 41 if err != nil { 42 log.Fatal(err) 43 } 44 45 dir2, err := w.Mkdir("dir2") 46 if err != nil { 47 log.Fatal(err) 48 } 49 50 err = dir2.Put("obj2", rbase.NewObjString("data-obj2")) 51 if err != nil { 52 log.Fatal(err) 53 } 54 55 err = w.Close() 56 if err != nil { 57 log.Fatal(err) 58 } 59 } 60 61 r, err := groot.Open(fname) 62 if err != nil { 63 log.Fatal(err) 64 } 65 defer r.Close() 66 67 err = riofs.Walk(r, func(path string, obj root.Object, err error) error { 68 fmt.Printf(">> %v\n", path) 69 return err 70 }) 71 if err != nil { 72 log.Fatalf("could not walk ROOT file: %+v", err) 73 } 74 75 // Output: 76 // >> ../testdata/subdirs.root 77 // >> ../testdata/subdirs.root/dir1 78 // >> ../testdata/subdirs.root/dir1/dir11 79 // >> ../testdata/subdirs.root/dir1/dir11/obj1 80 // >> ../testdata/subdirs.root/dir2 81 // >> ../testdata/subdirs.root/dir2/obj2 82 } 83 84 func Example_recursivePut() { 85 dir, err := os.MkdirTemp("", "groot-riofs-") 86 if err != nil { 87 log.Fatal(err) 88 } 89 defer os.RemoveAll(dir) 90 91 fname := stdpath.Join(dir, "dirs.root") 92 f, err := groot.Create(fname) 93 if err != nil { 94 log.Fatal(err) 95 } 96 defer f.Close() 97 98 rd := riofs.Dir(f) 99 100 // create obj-1, put it under dir1/dir11, create all intermediate directories. 101 err = rd.Put("dir1/dir11/obj-1", rbase.NewObjString("obj-1")) 102 if err != nil { 103 log.Fatal(err) 104 } 105 106 // create obj-2 107 err = rd.Put("/dir2/dir22/dir222/obj-2", rbase.NewObjString("obj-2")) 108 if err != nil { 109 log.Fatal(err) 110 } 111 112 // update obj-1 113 err = rd.Put("dir1/dir11/obj-1", rbase.NewObjString("obj-1-1")) 114 if err != nil { 115 log.Fatal(err) 116 } 117 118 o, err := rd.Get("dir1/dir11/obj-1;1") 119 if err != nil { 120 log.Fatal(err) 121 } 122 if got, want := o.(*rbase.ObjString).String(), "obj-1"; got != want { 123 log.Fatalf("invalid obj-1;1 value. got=%q, want=%q", got, want) 124 } 125 126 o, err = rd.Get("dir1/dir11/obj-1;2") 127 if err != nil { 128 log.Fatal(err) 129 } 130 if got, want := o.(*rbase.ObjString).String(), "obj-1-1"; got != want { 131 log.Fatalf("invalid obj-1;1 value. got=%q, want=%q", got, want) 132 } 133 134 o, err = rd.Get("dir1/dir11/obj-1") 135 if err != nil { 136 log.Fatal(err) 137 } 138 if got, want := o.(*rbase.ObjString).String(), "obj-1-1"; got != want { 139 log.Fatalf("invalid obj-1 value. got=%q, want=%q", got, want) 140 } 141 142 err = riofs.Walk(f, func(path string, obj root.Object, err error) error { 143 name := path[len(fname):] 144 if name == "" { 145 return err 146 } 147 switch o := obj.(type) { 148 case *rbase.ObjString: 149 fmt.Printf(">> %v -- value=%q\n", name, o) 150 default: 151 fmt.Printf(">> %v\n", name) 152 } 153 return err 154 }) 155 if err != nil { 156 log.Fatalf("could not walk ROOT file: %+v", err) 157 } 158 159 err = f.Close() 160 if err != nil { 161 log.Fatalf("could not close ROOT file: %v", err) 162 } 163 164 // Output: 165 // >> /dir1 166 // >> /dir1/dir11 167 // >> /dir1/dir11/obj-1 -- value="obj-1-1" 168 // >> /dir2 169 // >> /dir2/dir22 170 // >> /dir2/dir22/dir222 171 // >> /dir2/dir22/dir222/obj-2 -- value="obj-2" 172 } 173 174 func Example_recursiveMkdir() { 175 dir, err := os.MkdirTemp("", "groot-riofs-") 176 if err != nil { 177 log.Fatal(err) 178 } 179 defer os.RemoveAll(dir) 180 181 fname := stdpath.Join(dir, "dirs.root") 182 f, err := groot.Create(fname) 183 if err != nil { 184 log.Fatal(err) 185 } 186 defer f.Close() 187 188 rd := riofs.Dir(f) 189 190 for _, path := range []string{ 191 "dir1/dir11/dir111", 192 "/dir2/dir22/dir000", 193 "dir2/dir22/dir222", 194 } { 195 _, err = rd.Mkdir(path) 196 if err != nil { 197 log.Fatal(err) 198 } 199 } 200 201 err = rd.Put("/dir1/dir11/obj-1", rbase.NewObjString("obj-1")) 202 if err != nil { 203 log.Fatal(err) 204 } 205 206 err = riofs.Walk(f, func(path string, obj root.Object, err error) error { 207 name := path[len(fname):] 208 if name == "" { 209 return err 210 } 211 switch o := obj.(type) { 212 case *rbase.ObjString: 213 fmt.Printf(">> %v -- value=%q\n", name, o) 214 default: 215 fmt.Printf(">> %v\n", name) 216 } 217 return err 218 }) 219 if err != nil { 220 log.Fatalf("could not walk ROOT file: %+v", err) 221 } 222 223 err = f.Close() 224 if err != nil { 225 log.Fatalf("could not close ROOT file: %v", err) 226 } 227 228 // Output: 229 // >> /dir1 230 // >> /dir1/dir11 231 // >> /dir1/dir11/dir111 232 // >> /dir1/dir11/obj-1 -- value="obj-1" 233 // >> /dir2 234 // >> /dir2/dir22 235 // >> /dir2/dir22/dir000 236 // >> /dir2/dir22/dir222 237 }