summaryrefslogtreecommitdiff
path: root/src/Index/Connection.go
blob: d4523b2094fc99c4baec12eef84a144d317ac935 (plain)
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

}