package db import ( "encoding/json" "fmt" "log" "os" "ssender/internal/models" "github.com/boltdb/bolt" ) func InitDb(rss models.Rss2, dbpath string) error { db, err := openDB(dbpath) if err != nil { return err } log.Println("Initialize DB") defer db.Close() err = db.Update(func(tx *bolt.Tx) error { b, err := tx.CreateBucketIfNotExists([]byte("rss")) if err != nil { return err } for _, v := range rss.ItemList { encoded, err := json.Marshal(v) if err != nil { return err } err = b.Put([]byte(v.Link), encoded) if err != nil { return err } } return nil }) if err != nil { return err } return nil } func FindItems(rss models.Rss2, dbpath string) (*models.SendItems, error) { var sendItems models.SendItems // Check if DB file exists if _, err := os.Stat(dbpath); os.IsNotExist(err) { return nil, fmt.Errorf("database file does not exist: %s", dbpath) } // Open database db, err := openDB(dbpath) if err != nil { return nil, err } defer db.Close() log.Println("Finding new items in DB") err = db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("rss")) if b == nil { return fmt.Errorf("bucket 'rss' not found in database") } for _, v := range rss.ItemList { if b.Get([]byte(v.Link)) != nil { sendItems.ItemList = append(sendItems.ItemList, v) } } return nil }) if err != nil { return nil, err } log.Printf("Found %d new items", len(sendItems.ItemList)) return &sendItems, nil } func UpdateDb(dbpath string, senditems *models.SendItems) error { db, err := openDB(dbpath) if err != nil { return err } log.Println("Update DB") defer db.Close() err = db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("rss")) for _, v := range senditems.ItemList { encoded, err := json.Marshal(v) if err != nil { return err } err = b.Put([]byte(v.Link), encoded) if err != nil { return err } } return nil }) if err != nil { return err } return nil } func openDB(dbpath string) (*bolt.DB, error) { return bolt.Open(dbpath, 0600, nil) }