summaryrefslogtreecommitdiff
path: root/crawler
diff options
context:
space:
mode:
Diffstat (limited to 'crawler')
-rw-r--r--crawler/database.go8
-rw-r--r--crawler/main.go1
-rw-r--r--crawler/scrape.go24
3 files changed, 27 insertions, 6 deletions
diff --git a/crawler/database.go b/crawler/database.go
index c5e2291..d617722 100644
--- a/crawler/database.go
+++ b/crawler/database.go
@@ -92,7 +92,7 @@ func (app *App) save_offer(W []Angebot) error {
query := `INSERT INTO angebot (shop, name, url, abv, volume, age, original_price, discounted_price, base_price, valid_until, image_url, website_raw, spirit_type, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
- stmt, err := app.DB.Prepare(query)
+ stmt, err := app.Tx.Prepare(query)
if err != nil {
Debug(err, "Save Offer: Preparing query failed")
return err
@@ -109,7 +109,7 @@ func (app *App) save_offer(W []Angebot) error {
// resembles UNIQUE constraint
detect_duplicate_query := fmt.Sprintf(`SELECT 1 FROM _intern_view WHERE name = ? AND shop_id = %d AND volume = %4.2f AND abv = %4.2f AND original_price = %d AND discounted_price = %d AND valid_until = %d`, o.Shop, o.Volume, o.Abv, o.Original_price, o.Discounted_price, o.Valid_until)
- err := app.DB.QueryRow(detect_duplicate_query, o.Name).Scan(&found)
+ err := app.Tx.QueryRow(detect_duplicate_query, o.Name).Scan(&found)
if err == sql.ErrNoRows {
@@ -144,7 +144,7 @@ func (app *App) remove_expired(W []Angebot, shop Shop) error {
query := `SELECT id, name, shop, volume, abv, original_price, discounted_price FROM angebot WHERE shop = ? AND created_at < ?
AND (valid_until = 0 OR valid_until > ?)`
- rows, err := app.DB.Queryx(query, shop.Id, app.Now, app.Now)
+ rows, err := app.Tx.Queryx(query, shop.Id, app.Now, app.Now)
if err != nil {
Debug(err, "Remove expired: Query failed")
return err
@@ -163,7 +163,7 @@ func (app *App) remove_expired(W []Angebot, shop Shop) error {
if !app.offer_contains(W, offer_db) {
DebugOffer(offer_db, "Contains not - Set to expire")
expire_query := `UPDATE angebot SET valid_until = ? WHERE id = ?`
- _, err = app.DB.Exec(expire_query, app.Now, offer_db.Id)
+ _, err = app.Tx.Exec(expire_query, app.Now, offer_db.Id)
if err != nil {
offer_db.error_msg = err.Error()
offer_db.error_ctx = fmt.Sprintf("UPDATE angebot SET valid_until = %d WHERE id = %d", app.Now, offer_db.Id)
diff --git a/crawler/main.go b/crawler/main.go
index b75c21a..c44d8e9 100644
--- a/crawler/main.go
+++ b/crawler/main.go
@@ -17,6 +17,7 @@ type App struct {
Shops []Shop
Config *Config
DB *sqlx.DB
+ Tx *sqlx.Tx
Now int64
Debug bool
}
diff --git a/crawler/scrape.go b/crawler/scrape.go
index 055b00e..6ef9fcf 100644
--- a/crawler/scrape.go
+++ b/crawler/scrape.go
@@ -27,6 +27,12 @@ func (app *App) ScrapeHTML(shops []Shop) {
func (app *App) Scrape(shop Shop, wait chan bool) {
var W []Angebot
var err error
+ txFailed := false
+
+ app.Tx, err = app.DB.Beginx()
+ if err != nil {
+ Fatal(err, "scrape.go: Starting transaction failed. Shop: "+shop.Name)
+ }
// retry on error
for i := 0; i < 3; i++ {
@@ -41,11 +47,25 @@ func (app *App) Scrape(shop Shop, wait chan bool) {
err = app.save_offer(W)
if err != nil {
- Warn(err, "Saving offers failed")
+ txFailed = true
+ Warn(err, "Saving offers failed. Shop: "+shop.Name)
}
err = app.remove_expired(W, shop)
if err != nil {
- Warn(err, "Removing expired offers failed")
+ txFailed = true
+ Warn(err, "Removing expired offers failed. Shop: "+shop.Name)
+ }
+
+ if txFailed {
+ err = app.Tx.Rollback()
+ if err != nil {
+ Fatal(err, "scrape.go: Rollback transaction failed")
+ }
+ } else {
+ err = app.Tx.Commit()
+ if err != nil {
+ Fatal(err, "scrape.go: Committing transaction failed")
+ }
}
wait <- true