2 changed files with 127 additions and 0 deletions
@ -0,0 +1,100 @@ |
|||||||
|
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 |
||||||
|
} |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
package rss |
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/xml" |
||||||
|
"os" |
||||||
|
"ssender/internal/models" |
||||||
|
) |
||||||
|
|
||||||
|
func NewRSS(rssPath string) (*models.Rss2, error) { |
||||||
|
rss := &models.Rss2{} |
||||||
|
|
||||||
|
// Open rss2 file
|
||||||
|
file, err := os.Open(rssPath) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
defer file.Close() |
||||||
|
|
||||||
|
d := xml.NewDecoder(file) |
||||||
|
|
||||||
|
// Start RSS decoding from file
|
||||||
|
if err := d.Decode(&rss); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
return rss, nil |
||||||
|
} |
||||||
Loading…
Reference in new issue