From e0df45921b627814a9d8e212e621451f579e7d25 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Thu, 17 Jul 2025 14:54:04 +0100 Subject: [PATCH] appview: add repo_languages table Change-Id: smkqswpzzylwzmmrlrtvoyvulsmnvpst and db helpers to set and get. Signed-off-by: oppiliappan --- appview/db/db.go | 15 ++++++++ appview/db/language.go | 81 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 appview/db/language.go diff --git a/appview/db/db.go b/appview/db/db.go index df9382f..3013c01 100644 --- a/appview/db/db.go +++ b/appview/db/db.go @@ -421,6 +421,21 @@ func Make(dbPath string) (*DB, error) { on delete cascade ); + create table if not exists repo_languages ( + -- identifiers + id integer primary key autoincrement, + + -- repo identifiers + repo_at text not null, + ref text not null, + + -- language breakdown + language text not null, + bytes integer not null check (bytes >= 0), + + unique(repo_at, ref, language) + ); + create table if not exists migrations ( id integer primary key autoincrement, name text unique diff --git a/appview/db/language.go b/appview/db/language.go new file mode 100644 index 0000000..599806e --- /dev/null +++ b/appview/db/language.go @@ -0,0 +1,81 @@ +package db + +import ( + "fmt" + "strings" + + "github.com/bluesky-social/indigo/atproto/syntax" +) + +type RepoLanguage struct { + Id int64 + RepoAt syntax.ATURI + Ref string + Language string + Bytes int64 +} + +func GetRepoLanguages(e Execer, filters ...filter) ([]RepoLanguage, error) { + var conditions []string + var args []any + for _, filter := range filters { + conditions = append(conditions, filter.Condition()) + args = append(args, filter.Arg()...) + } + + whereClause := "" + if conditions != nil { + whereClause = " where " + strings.Join(conditions, " and ") + } + + query := fmt.Sprintf( + `select id, repo_at, ref, language, bytes from repo_languages %s`, + whereClause, + ) + rows, err := e.Query(query, args...) + + if err != nil { + return nil, fmt.Errorf("failed to execute query: %w ", err) + } + + var langs []RepoLanguage + for rows.Next() { + var rl RepoLanguage + + err := rows.Scan( + &rl.Id, + &rl.RepoAt, + &rl.Ref, + &rl.Language, + &rl.Bytes, + ) + if err != nil { + return nil, fmt.Errorf("failed to scan: %w ", err) + } + + langs = append(langs, rl) + } + if err = rows.Err(); err != nil { + return nil, fmt.Errorf("failed to scan rows: %w ", err) + } + + return langs, nil +} + +func InsertRepoLanguages(e Execer, langs []RepoLanguage) error { + stmt, err := e.Prepare( + "insert or replace into repo_languages (repo_at, ref, language, bytes) values (?, ?, ?, ?)", + ) + if err != nil { + return err + } + + for _, l := range langs { + _, err := stmt.Exec(l.RepoAt, l.Ref, l.Language, l.Bytes) + if err != nil { + return err + } + } + + return nil +} -- 2.43.0