1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
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
}
|