appview/languages: fix logic bug in updating language breakdowns #625

merged
opened by oppi.li targeting master from push-zomkuzmzokvl
Changed files
+63 -1
appview
+35
appview/db/language.go
··· 1 package db 2 3 import ( 4 "fmt" 5 "strings" 6 7 "tangled.org/core/appview/models" 8 ) 9 ··· 82 83 return nil 84 }
··· 1 package db 2 3 import ( 4 + "database/sql" 5 "fmt" 6 "strings" 7 8 + "github.com/bluesky-social/indigo/atproto/syntax" 9 + "tangled.org/core/appview/db" 10 "tangled.org/core/appview/models" 11 ) 12 ··· 85 86 return nil 87 } 88 + 89 + func DeleteRepoLanguages(e Execer, filters ...filter) error { 90 + var conditions []string 91 + var args []any 92 + for _, filter := range filters { 93 + conditions = append(conditions, filter.Condition()) 94 + args = append(args, filter.Arg()...) 95 + } 96 + 97 + whereClause := "" 98 + if conditions != nil { 99 + whereClause = " where " + strings.Join(conditions, " and ") 100 + } 101 + 102 + query := fmt.Sprintf(`delete from repo_languages %s`, whereClause) 103 + 104 + _, err := e.Exec(query, args...) 105 + return err 106 + } 107 + 108 + func UpdateRepoLanguages(tx *sql.Tx, repoAt syntax.ATURI, ref string, langs []models.RepoLanguage) error { 109 + err := DeleteRepoLanguages( 110 + tx, 111 + FilterEq("repo_at", repoAt), 112 + FilterEq("ref", ref), 113 + ) 114 + if err != nil { 115 + return fmt.Errorf("failed to delete existing languages: %w", err) 116 + } 117 + 118 + return InsertRepoLanguages(tx, langs) 119 + }
+12 -1
appview/repo/index.go
··· 200 }) 201 } 202 203 // update appview's cache 204 - err = db.InsertRepoLanguages(rp.db, langs) 205 if err != nil { 206 // non-fatal 207 log.Println("failed to cache lang results", err) 208 } 209 } 210 211 var total int64
··· 200 }) 201 } 202 203 + tx, err := rp.db.Begin() 204 + if err != nil { 205 + return nil, err 206 + } 207 + defer tx.Rollback() 208 + 209 // update appview's cache 210 + err = db.UpdateRepoLanguages(tx, f.RepoAt(), currentRef, langs) 211 if err != nil { 212 // non-fatal 213 log.Println("failed to cache lang results", err) 214 } 215 + 216 + err = tx.Commit() 217 + if err != nil { 218 + return nil, err 219 + } 220 } 221 222 var total int64
+16
appview/state/knotstream.go
··· 172 }) 173 } 174 175 return db.InsertRepoLanguages(d, langs) 176 } 177
··· 172 }) 173 } 174 175 + tx, err := d.Begin() 176 + if err != nil { 177 + return err 178 + } 179 + defer tx.Rollback() 180 + 181 + // update appview's cache 182 + err = db.UpdateRepoLanguages(tx, repo.RepoAt(), ref.Short(), langs) 183 + if err != nil { 184 + // non-fatal 185 + } 186 + 187 + err = tx.Commit() 188 + if err != nil { 189 + return err 190 + } 191 return db.InsertRepoLanguages(d, langs) 192 } 193