From 6621f4977064a0d5f1d745816e9615ef3c55558f Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Sun, 21 Jun 2020 21:58:51 +0100 Subject: [PATCH] basic storage package --- .gitignore | 1 + build.sh | 3 +++ go.mod | 5 ++++ go.sum | 11 +++++++++ main.go | 18 ++++++++++++++ storage/folder.go | 42 ++++++++++++++++++++++++++++++++ storage/storage.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 140 insertions(+) create mode 100644 .gitignore create mode 100755 build.sh create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 storage/folder.go create mode 100644 storage/storage.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c1901cd --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +yarr diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..7d84adc --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +CGO_ENABLED=1 go build -tags sqlite_foreign_keys diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..bbdc08b --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module github.com/nkanaev/yarr + +go 1.14 + +require github.com/mattn/go-sqlite3 v1.14.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..514a196 --- /dev/null +++ b/go.sum @@ -0,0 +1,11 @@ +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/main.go b/main.go new file mode 100644 index 0000000..d36b6ab --- /dev/null +++ b/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "github.com/nkanaev/yarr/storage" + "log" +) + +func main() { + storage, err := storage.New() + if err != nil { + log.Fatal(err) + } + /* + folder := storage.CreateFolder("foo") + storage.RenameFolder(folder.Id, "bar") + storage.ToggleFolderExpanded(folder.Id, false) + */ +} diff --git a/storage/folder.go b/storage/folder.go new file mode 100644 index 0000000..bdffa25 --- /dev/null +++ b/storage/folder.go @@ -0,0 +1,42 @@ +package storage + +import "fmt" + +type Folder struct { + Id int64 + Title string + IsExpanded bool +} + +func (s *Storage) CreateFolder(title string) *Folder { + expanded := true + result, err := s.db.Exec(` + insert into folders (title, is_expanded) values (?, ?)`, + title, expanded, + ) + if err != nil { + fmt.Println(err) + return nil + } + id, idErr := result.LastInsertId() + if idErr != nil { + return nil + } + return &Folder{Id: id, Title: title, IsExpanded: expanded} +} + +func (s *Storage) DeleteFolder(folderId int64) bool { + _, err1 := s.db.Exec(`update feeds set folder_id = null where folder_id = ?`, folderId) + _, err2 := s.db.Exec(`delete from folders where id = ?`, folderId) + return err1 == nil && err2 == nil +} + +func (s *Storage) RenameFolder(folderId int64, newTitle string) bool { + _, err := s.db.Exec(`update folders set title = ? where id = ?`, newTitle, folderId) + return err == nil +} + +func (s *Storage) ToggleFolderExpanded(folderId int64, isExpanded bool) bool { + _, err := s.db.Exec(`update folders set is_expanded = ? where id = ?`, isExpanded, folderId) + return err == nil +} diff --git a/storage/storage.go b/storage/storage.go new file mode 100644 index 0000000..81af3d5 --- /dev/null +++ b/storage/storage.go @@ -0,0 +1,60 @@ +package storage + +import ( + "database/sql" + _ "github.com/mattn/go-sqlite3" +) + +var initQuery string = ` +create table if not exists folders ( + id integer primary key autoincrement, + title text not null, + is_expanded boolean +); + +create table if not exists feeds ( + id integer primary key autoincrement, + folder_id references folders(id), + title text not null, + description text, + link text, + feed_link text, + icon text +); + +create index if not exists idx_feed_folder_id on feeds(folder_id); + +create table if not exists items ( + id string primary key, + feed_id references feeds(id), + title text, + link text, + description text, + content text, + author text, + date integer, + date_updated integer, + status integer, + image text +); + +create index if not exists idx_item_feed_id on items(feed_id); +create index if not exists idx_item_status on items(status); +` + +type Storage struct { + db *sql.DB +} + +func New() (*Storage, error) { + path := "./storage.db" + db, err := sql.Open("sqlite3", path) + if err != nil { + return nil, err + } + _, err = db.Exec(initQuery) + if err != nil { + return nil, err + } + return &Storage{db: db}, nil +}