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
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 |
|
}
|
|
|