diff --git a/database/category.go b/database/category.go index 99d679c..18e0dac 100644 --- a/database/category.go +++ b/database/category.go @@ -17,6 +17,7 @@ import ( "sync" "git.erbosoft.com/amy/amsterdam/util" + log "github.com/sirupsen/logrus" ) // Category is the structure defining a category. @@ -71,7 +72,10 @@ func loadCategories(ctx context.Context) error { return errors.New("internal error loading categories") } var ncats int32 - rs.Scan(&ncats) + err = rs.Scan(&ncats) + if err != nil { + return err + } allCategories = make([]Category, 0, ncats) err = amdb.SelectContext(ctx, &allCategories, "SELECT * FROM refcategory ORDER BY parent, name") if err != nil { @@ -243,7 +247,10 @@ func AmSearchCategories(ctx context.Context, oper int, term string, offset int, return nil, -1, errors.New("internal error getting category total") } var total int - rs.Scan(&total) + err = rs.Scan(&total) + if err != nil { + return nil, total, err + } if total == 0 { return make([]*Category, 0), 0, nil } @@ -258,10 +265,15 @@ func AmSearchCategories(ctx context.Context, oper int, term string, offset int, rc := make([]*Category, 0, min(max, 1000)) for rs.Next() { var catid int32 - rs.Scan(&catid) - c, err := AmGetCategory(ctx, catid) + err = rs.Scan(&catid) if err == nil { - rc = append(rc, c) + c, err := AmGetCategory(ctx, catid) + if err == nil { + rc = append(rc, c) + } + } + if err != nil { + log.Errorf("AmSearchCategoris scan error: %v", err) } } return rc, total, nil diff --git a/database/community.go b/database/community.go index 492c95c..67db7b5 100644 --- a/database/community.go +++ b/database/community.go @@ -23,6 +23,7 @@ import ( "git.erbosoft.com/amy/amsterdam/util" lru "github.com/hashicorp/golang-lru" "github.com/jmoiron/sqlx" + log "github.com/sirupsen/logrus" "golang.org/x/text/language" ) @@ -219,11 +220,15 @@ func (c *Community) Membership(ctx context.Context, u *User) (bool, bool, uint16 if rs.Next() { var locked bool var level uint16 - rs.Scan(&locked, &level) - memberCache.Add(key, &memberCacheData{isMember: true, locked: locked, level: level}) - return true, locked, level, nil + err = rs.Scan(&locked, &level) + if err == nil { + memberCache.Add(key, &memberCacheData{isMember: true, locked: locked, level: level}) + return true, locked, level, nil + } + } + if err == nil { + memberCache.Add(key, &memberCacheData{isMember: false, locked: false, level: uint16(0)}) } - memberCache.Add(key, &memberCacheData{isMember: false, locked: false, level: uint16(0)}) } return false, false, uint16(0), err } @@ -379,7 +384,10 @@ func (c *Community) SetMembership(ctx context.Context, u *User, level uint16, lo if rs.Next() { var oldLevel uint16 var lockStatus bool - rs.Scan(&oldLevel, &lockStatus) + err = rs.Scan(&oldLevel, &lockStatus) + if err != nil { + return err + } if level != oldLevel || lockStatus != locked { _, err := tx.ExecContext(ctx, "UPDATE commmember SET granted_lvl = ?, locked = ? WHERE commid = ? AND uid = ?", level, locked, c.Id, u.Uid) @@ -510,9 +518,12 @@ func (c *Community) SetProfileData(ctx context.Context, name string, alias strin c.DeleteLevel = delete_lvl c.JoinLevel = join_lvl rs, err2 := amdb.QueryContext(ctx, "SELECT lastupdate FROM communities WHERE commid = ?", c.Id) - if err2 != nil { + if err2 == nil { rs.Next() - rs.Scan(&c.LastUpdate) + err2 = rs.Scan(&c.LastUpdate) + } + if err2 != nil { + log.Errorf("SetProfileData scan error: %v", err2) } } return err @@ -782,7 +793,10 @@ func AmAutoJoinCommunities(ctx context.Context, tx *sqlx.Tx, user *User) error { for rows.Next() { var cid int32 var lock bool - rows.Scan(&cid, &lock) + err = rows.Scan(&cid, &lock) + if err != nil { + break + } if !slices.Contains(current, cid) { _, err = tx.ExecContext(ctx, "INSERT INTO commmember (commid, uid, granted_lvl, locked) VALUES (?, ?, ?, ?)", cid, user.Uid, grantLevel, lock) diff --git a/database/globals.go b/database/globals.go index a78daf3..cfded6e 100644 --- a/database/globals.go +++ b/database/globals.go @@ -122,7 +122,10 @@ func AmGetGlobalProperty(ctx context.Context, index int32) (string, error) { return "", err } if rs.Next() { - rs.Scan(&rc) + err = rs.Scan(&rc) + if err != nil { + return "", err + } globalProps[index] = rc return rc, nil } diff --git a/database/imagestore.go b/database/imagestore.go index bc6cd4f..56f143d 100644 --- a/database/imagestore.go +++ b/database/imagestore.go @@ -93,7 +93,10 @@ func AmStoreImage(ctx context.Context, typecode int16, owner int32, mimetype str var img *ImageStore if rs.Next() { var id int32 - rs.Scan(&id) + err = rs.Scan(&id) + if err != nil { + return nil, err + } img, err = AmLoadImage(ctx, id) if err != nil { return nil, err diff --git a/database/ipban.go b/database/ipban.go index aad146a..4dcf4ba 100644 --- a/database/ipban.go +++ b/database/ipban.go @@ -73,7 +73,10 @@ func AmTestIPBan(ctx context.Context, ip_address string) (string, error) { } defer rows.Close() if rows.Next() { - rows.Scan(&rc) + err = rows.Scan(&rc) + if err != nil { + return "", err + } knownBans[ip_address] = rc return rc, nil } diff --git a/database/topic.go b/database/topic.go index b2df68f..95261a7 100644 --- a/database/topic.go +++ b/database/topic.go @@ -17,6 +17,7 @@ import ( "time" "github.com/jmoiron/sqlx" + log "github.com/sirupsen/logrus" ) // Topic is the top-level structure detailing topics. @@ -61,9 +62,9 @@ func (t *Topic) GetLastRead(ctx context.Context, u *User) (int32, error) { } var rc int32 = -1 if rs.Next() { - rs.Scan(&rc) + err = rs.Scan(&rc) } - return rc, nil + return rc, err } // SetLastRead sets the "last read" message for a user on a topic. @@ -103,6 +104,8 @@ type TopicSummary struct { Archived bool // is topic archived? Subscribed bool // is topic subscribed? Hidden bool // is topic hidden? + Sticky bool // is topic sticky? + NewFlag bool // does topic have new messages? } /* AmGetTopic retrieves a topic by ID. @@ -310,9 +313,13 @@ func AmListTopics(ctx context.Context, confid int32, uid int32, viewOption int, rc := make([]*TopicSummary, 0) for rs.Next() { var rec TopicSummary - rs.Scan(&rec.TopicID, &rec.Number, &rec.Name, &rec.Unread, &rec.Total, &rec.LastUpdate, &rec.Frozen, &rec.Archived, - &rec.Subscribed, &rec.Hidden) - rc = append(rc, &rec) + err = rs.Scan(&rec.TopicID, &rec.Number, &rec.Name, &rec.Unread, &rec.Total, &rec.LastUpdate, &rec.Frozen, + &rec.Archived, &rec.Subscribed, &rec.Hidden, &rec.Sticky, &rec.NewFlag) + if err != nil { + log.Errorf("AmListTopics scan error: %v", err) + } else { + rc = append(rc, &rec) + } } return rc, nil } diff --git a/database/user.go b/database/user.go index f9b5a07..0e37109 100644 --- a/database/user.go +++ b/database/user.go @@ -925,7 +925,10 @@ func AmSearchUsers(ctx context.Context, field int, oper int, term string, offset return nil, -1, errors.New("internal error getting count") } var total int - rs.Scan(&total) + err = rs.Scan(&total) + if err != nil { + return nil, -1, err + } if total == 0 { return make([]*User, 0), 0, nil } @@ -942,10 +945,16 @@ func AmSearchUsers(ctx context.Context, field int, oper int, term string, offset rc := make([]*User, 0, min(max, 10000)) for rs.Next() { var uid int32 - rs.Scan(&uid) - u, err := AmGetUser(ctx, uid) + err = rs.Scan(&uid) if err == nil { - rc = append(rc, u) + var u *User + u, err = AmGetUser(ctx, uid) + if err == nil { + rc = append(rc, u) + } + } + if err != nil { + log.Errorf("AmSearchUsers scan error: %v", err) } } return rc, total, nil diff --git a/ui/views/conflist.jet b/ui/views/conflist.jet index a183fdb..3a03417 100644 --- a/ui/views/conflist.jet +++ b/ui/views/conflist.jet @@ -23,12 +23,12 @@ 🟣
- {{ c.Name }} - Latest activity: {{ DisplayActivity(c.LastUpdate, .) }}
- {{ hl := c.HostsQ() }} + {{ hl := c.HostsQ(.Ctx()) }} {{ if len(hl) == 1 }} Host: {{ else }}