package index import ( "database/sql" "fmt" "log/slog" _ "github.com/mattn/go-sqlite3" settings "physick.ru/Settings" ) var db *sql.DB = nil type Article struct { Id int DisplayName string FileName string URL string Tags []Tag } type Tag struct { Id int Name string } func EstablistDBConnection() { var database, err = sql.Open("sqlite3", settings.Current.IndexDB) if err != nil { panic(fmt.Sprintf("Failed to start a server: DB connection failed (%s)", err.Error())) } db = database } func GetAllArticles() ([]Article, error) { var rows, sqlErr = db.Query("SELECT Id, DisplayName, FileName, URL FROM Articles;") if sqlErr != nil { return []Article{}, sqlErr } var outp = make([]Article, 0) for rows.Next() { var new = Article{} rows.Scan(&new.Id, &new.DisplayName, &new.FileName, &new.URL) var tagsErr = new.FillTags() if tagsErr != nil { slog.Warn("Failed to parse article flags", slog.Any("Error", tagsErr)) } outp = append(outp, new) } return outp, nil } func (base *Article) FillTags() error { var rows, sqlErr = db.Query(`SELECT Tags.Id, Tags.Name FROM ArticlesToTags LEFT JOIN Tags ON Tags.Id = ArticlesToTags.TagId WHERE ArticlesToTags.ArticleId = ?;`, base.Id) if sqlErr != nil { return sqlErr } var outp = make([]Tag, 0) for rows.Next() { var new = Tag{} var err = rows.Scan(&new.Id, &new.Name) if err != nil { slog.Warn("Failed to parse a tag descriptor from the table", slog.Any("Error", err)) } outp = append(outp, new) } base.Tags = outp return nil } func GetArticleByName(URL string) (Article, error) { var rows, sqlErr = db.Query("SELECT Id, DisplayName, FileName, URL FROM Articles WHERE URL = ?;", URL) if sqlErr != nil { return Article{}, sqlErr } var new = Article{} for rows.Next() { rows.Scan(&new.Id, &new.DisplayName, &new.FileName, &new.URL) var tagsErr = new.FillTags() if tagsErr != nil { slog.Error("Failed to parse article flags", slog.Any("Error", tagsErr)) } } return new, nil }