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  }