func upgrade2to3(db *db.DB) error { tx, err := db.Beginx() if err != nil { return err } defer tx.Rollback() t := time.Now().AddDate(0, -1, 0) _, err = tx.Exec(upgrade2To3SplitStatesToUnread, t) if err != nil { return err } _, err = tx.Exec(upgrade2To3SplitStatesToFavorite) if err != nil { return err } _, err = tx.Exec("DROP TABLE users_articles_states") if err != nil { return err } return tx.Commit() }
func upgrade3to4(db *db.DB) error { table := "users_feeds_tags" var tabledef string for _, s := range initSQL { if strings.Contains(s, table) { tabledef = s } } if tabledef == "" { return errors.New("Definition for users_feeds_tags not found") } tx, err := db.Beginx() if err != nil { return err } defer tx.Rollback() _, err = tx.Exec("ALTER TABLE " + table + " RENAME TO " + table + "2") if err != nil { return err } _, err = tx.Exec(tabledef) if err != nil { return err } _, err = tx.Exec(upgrade3To4PopulateTags) if err != nil { return err } _, err = tx.Exec(upgrade3To4PopulateUsersFeedsTags) if err != nil { return err } _, err = tx.Exec("DROP TABLE " + table + "2") if err != nil { return err } return tx.Commit() }
func upgrade1to2(db *db.DB) error { tx, err := db.Beginx() if err != nil { return err } defer tx.Rollback() _, err = tx.Exec(upgrade1To2MergeReadAndFav) if err != nil { return err } _, err = tx.Exec("DROP TABLE users_articles_read") if err != nil { return err } _, err = tx.Exec("DROP TABLE users_articles_fav") if err != nil { return err } return tx.Commit() }
func readState(u content.User, dbo *db.DB, logger webfw.Logger, opts data.ArticleUpdateStateOptions, read bool, join, joinPredicate, deleteJoin, deleteWhere string, insertArgs, deleteArgs []interface{}) { if u.HasErr() { return } s := dbo.SQL() var err error if readStateInsertTemplate == nil { readStateInsertTemplate, err = template.New("read-state-insert-sql"). Parse(s.User.ReadStateInsertTemplate) if err != nil { u.Err(fmt.Errorf("Error generating read-state-insert template: %v", err)) return } } if readStateDeleteTemplate == nil { readStateDeleteTemplate, err = template.New("read-state-delete-sql"). Parse(s.User.ReadStateDeleteTemplate) if err != nil { u.Err(fmt.Errorf("Error generating read-state-delete template: %v", err)) return } } tx, err := dbo.Beginx() if err != nil { u.Err(err) return } defer tx.Rollback() if read { args := append([]interface{}{u.Data().Login}, deleteArgs...) buf := util.BufferPool.GetBuffer() defer util.BufferPool.Put(buf) data := readStateDeleteData{} if deleteJoin != "" { data.Join = deleteJoin } if opts.FavoriteOnly { data.Join += s.User.ReadStateDeleteFavoriteJoin } if opts.UntaggedOnly { data.Join += s.User.ReadStateDeleteUntaggedJoin } where := []string{} if deleteWhere != "" { where = append(where, deleteWhere) } if !opts.BeforeDate.IsZero() { where = append(where, fmt.Sprintf("(a.date IS NULL OR a.date < $%d)", len(args)+1)) args = append(args, opts.BeforeDate) } if !opts.AfterDate.IsZero() { where = append(where, fmt.Sprintf("a.date > $%d", len(args)+1)) args = append(args, opts.AfterDate) } if opts.BeforeId > 0 { where = append(where, fmt.Sprintf("a.id < $%d", len(args)+1)) args = append(args, opts.BeforeId) } if opts.AfterId > 0 { where = append(where, fmt.Sprintf("a.id > $%d", len(args)+1)) args = append(args, opts.AfterId) } if opts.FavoriteOnly { where = append(where, "af.article_id IS NOT NULL") } if opts.UntaggedOnly { where = append(where, "uft.feed_id IS NULL") } if len(where) > 0 { data.Where = " WHERE " + strings.Join(where, " AND ") } if err := readStateDeleteTemplate.Execute(buf, data); err != nil { u.Err(fmt.Errorf("Error executing read-state-delete template: %v", err)) return } sql := buf.String() logger.Debugf("Read state delete SQL:\n%s\nArgs:%v\n", sql, args) stmt, err := tx.Preparex(sql) if err != nil { u.Err(err) return } defer stmt.Close() _, err = stmt.Exec(args...) if err != nil { u.Err(err) return } } else { args := append([]interface{}{u.Data().Login}, insertArgs...) buf := util.BufferPool.GetBuffer() defer util.BufferPool.Put(buf) data := readStateInsertData{} if joinPredicate != "" { data.JoinPredicate = " AND " + joinPredicate } if opts.FavoriteOnly { data.Join += s.User.ReadStateInsertFavoriteJoin } if opts.UntaggedOnly { data.Join += s.User.ReadStateInsertUntaggedJoin } if join != "" { data.Join += joinPredicate } where := []string{} if !opts.BeforeDate.IsZero() { where = append(where, fmt.Sprintf("(a.date IS NULL OR a.date < $%d)", len(args)+1)) args = append(args, opts.BeforeDate) } if !opts.AfterDate.IsZero() { where = append(where, fmt.Sprintf("a.date > $%d", len(args)+1)) args = append(args, opts.AfterDate) } if opts.BeforeId > 0 { where = append(where, fmt.Sprintf("a.id < $%d", len(args)+1)) args = append(args, opts.BeforeId) } if opts.AfterId > 0 { where = append(where, fmt.Sprintf("a.id > $%d", len(args)+1)) args = append(args, opts.AfterId) } if opts.FavoriteOnly { where = append(where, "af.article_id IS NOT NULL") } if opts.UntaggedOnly { where = append(where, "uft.feed_id IS NULL") } if len(where) > 0 { data.Where = " WHERE " + strings.Join(where, " AND ") } if err := readStateInsertTemplate.Execute(buf, data); err != nil { u.Err(fmt.Errorf("Error executing read-state-insert template: %v", err)) return } sql := buf.String() logger.Debugf("Read state insert SQL:\n%s\nArgs:%q\n", sql, args) stmt, err := tx.Preparex(sql) if err != nil { u.Err(err) return } defer stmt.Close() _, err = stmt.Exec(args...) if err != nil { u.Err(err) return } } if err = tx.Commit(); err != nil { u.Err(err) } }