github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/menus/menusdbr/db-file-store.go (about) 1 package menusdbr 2 3 import ( 4 "io/ioutil" 5 "os" 6 7 "github.com/gocaveman/caveman/filesystem" 8 yaml "gopkg.in/yaml.v2" 9 ) 10 11 // DBFileStore wraps a DBMenuStore and provides loading and saveing to a flat file. 12 type DBFileStore struct { 13 FileSystem filesystem.FileSystem 14 FilePath string 15 *DBMenuStore 16 } 17 18 func (s *DBFileStore) Save() error { 19 20 // FIXME: we really should make this a nice heirachical dump with things 21 // all organized for human editing, but won't take the time right this sec. -bgp 22 23 sess := s.DBMenuStore.Connection.NewSession(nil) 24 var dbmis []DBMenuItem 25 _, err := sess.Select("*"). 26 From(s.DBMenuStore.TablePrefix+"menu"). 27 Where("menu_id = ?", ""). 28 OrderBy("parent_menu_id, sequence, menu_id"). 29 Load(&dbmis) 30 if err != nil { 31 return err 32 } 33 34 b, err := yaml.Marshal(dbmis) 35 if err != nil { 36 return err 37 } 38 39 f, err := s.FileSystem.OpenFile(s.FilePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) 40 if err != nil { 41 return err 42 } 43 defer f.Close() 44 45 _, err = f.Write(b) 46 if err != nil { 47 return err 48 } 49 50 return nil 51 } 52 53 func (s *DBFileStore) Load() error { 54 55 sess := s.DBMenuStore.Connection.NewSession(nil) 56 57 f, err := s.FileSystem.Open(s.FilePath) 58 if err != nil { 59 return err 60 } 61 defer f.Close() 62 63 b, err := ioutil.ReadAll(f) 64 if err != nil { 65 return err 66 } 67 68 var dbmis []DBMenuItem 69 err = yaml.Unmarshal(b, &dbmis) 70 if err != nil { 71 return err 72 } 73 74 // truncate the table 75 _, err = sess.DeleteFrom(s.DBMenuStore.TablePrefix + "menu").Exec() 76 if err != nil { 77 return err 78 } 79 80 for _, dbmi := range dbmis { 81 _, err = sess.InsertInto(s.DBMenuStore.TablePrefix+"menu"). 82 Columns("menu_id", "parent_menu_id", "sequence", "title", "meta", "enabled", "registry_edited"). 83 Values(dbmi.MenuID, dbmi.ParentMenuID, dbmi.Sequence, dbmi.Title, dbmi.Meta, dbmi.Enabled, dbmi.RegistryEdited). 84 Exec() 85 if err != nil { 86 return err 87 } 88 } 89 90 return nil 91 }