You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.1 KiB
112 lines
2.1 KiB
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) |
|
}
|
|
|