summaryrefslogtreecommitdiff
path: root/src/Index
diff options
context:
space:
mode:
Diffstat (limited to 'src/Index')
-rw-r--r--src/Index/Connection.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/Index/Connection.go b/src/Index/Connection.go
new file mode 100644
index 0000000..d4523b2
--- /dev/null
+++ b/src/Index/Connection.go
@@ -0,0 +1,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
+
+}