Social sender
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.

100 lines
1.8 KiB

package db
import (
"encoding/json"
"log"
"ssender/internal/models"
"github.com/boltdb/bolt"
)
func InitDb(rss models.Rss2, dbpath string) error {
log.Println("Initialize DB")
db, err := bolt.Open(dbpath, 0600, nil)
if err != nil {
log.Fatal(err)
}
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
db, err := bolt.Open(dbpath, 0600, nil)
if err != nil {
return nil, err
}
defer db.Close()
for _, v := range rss.ItemList {
err = db.View(func(tx *bolt.Tx) error {
// Assume bucket exists and has keys
b := tx.Bucket([]byte("rss"))
c := b.Cursor()
flag := false
for key, _ := c.First(); key != nil; key, _ = c.Next() {
if v.Link == string(key) {
flag = true
break
}
}
if flag {
sendItems.ItemList = append(sendItems.ItemList, v)
}
return nil
})
if err != nil {
return nil, err
}
}
return &sendItems, nil
}
func UpdateDb(dbpath string, senditems *models.SendItems) error {
log.Println("Update DB")
db, err := bolt.Open(dbpath, 0600, nil)
if err != nil {
log.Fatal(err)
}
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
}