go-wiki/data/pageStore.go
2020-03-19 09:04:54 +01:00

153 lines
3.6 KiB
Go

package data
import (
"database/sql"
"log"
"strings"
"github.com/rjNemo/go-wiki/models"
)
// PageStore is used to perform page-related CRUD operations on the DB
type PageStore struct {
db *sql.DB
}
// NewPageStore constructs a PageStore connected to the database.
func NewPageStore(db *sql.DB) PageStore {
return PageStore{db: db}
}
// CreateTable creates the page table in the database if it exits not yet.
func (ps PageStore) CreateTable() {
if _, err := ps.db.Exec(CreateTablePages); err != nil {
log.Fatal(err)
}
// log.Print("Table successfully created!")
}
// GetAll retrieves all the pages from the database.
func (ps PageStore) GetAll() ([]models.Page, error) {
var id uint
var title string
var body []byte
rows, err := ps.db.Query(GetAllPages)
if err != nil {
return nil, err
}
var pages []models.Page
for rows.Next() {
err := rows.Scan(&id, &title, &body)
if err != nil {
log.Fatal(err) // too severe
}
// p, err := models.NewPage(id, title, body)
p := models.NewPage(id, title, body)
// if err != nil {
// log.Printf("Error loading page id=%d: %s", id, err)
// }
pages = append(pages, *p)
}
return pages, nil
}
// Get retrieves the page identified by 'id' from database
func (ps PageStore) Get(t string) (models.Page, error) {
var id uint
var title string
var body []byte
t = strings.Title(t)
row := ps.db.QueryRow(GetPage, t)
switch err := row.Scan(&id, &title, &body); err {
case sql.ErrNoRows:
log.Println("No entry returned")
return models.Page{}, err
// return nil, err
case nil:
return *models.NewPage(id, title, body), nil
// p, err := models.NewPage(id, title, body)
// if err != nil {
// return *p, nil
// }
// log.Fatal(err)
// return models.Page{}, err
// return nil, err
default:
log.Fatal(err)
return models.Page{}, err
// return nil, err
}
}
// Add inserts a page in the database.
func (ps PageStore) Add(u models.Page) {
id := 0
err := ps.db.QueryRow(InsertPage, u.Title(), u.Body()).Scan(&id)
if err != nil {
log.Fatal(err) // too severe
}
log.Println("New Page ID is:", id)
}
// Update edits page identified by 'id' in the database
func (ps PageStore) Update(id uint, u models.Page) {
res, err := ps.db.Exec(UpdatePage, id, u.Title(), string(u.Body()))
if err != nil {
log.Fatal(err) // too severe
}
count, err := res.RowsAffected()
if err != nil {
log.Fatal(err) // too severe
}
if count == 0 {
log.Fatal("Update failed") // too severe
}
}
// Delete removes page identified by 'id' from the database
func (ps PageStore) Delete(id uint) {
res, err := ps.db.Exec(QueryDelete, id)
if err != nil {
log.Fatal(err) // too severe
}
count, err := res.RowsAffected()
if err != nil {
log.Fatal(err) // too severe
}
if count == 0 {
log.Fatal("Delete failed") // too severe
}
}
// Exists returns true if the page named title exists, false otherwise
func (ps PageStore) Exists(title string) (e bool) {
err := ps.db.QueryRow(ExistsPage, strings.Title(title)).Scan(&e)
if err != nil {
log.Fatal(err) // too severe
}
return e
}
// Find retrieves a page from the database using an expression
// func (ps PageStore) Find(k interface{}, v interface{}) ([]models.Page, error) {
// var id, title int
// var body, lastName, email string
// rows, err := ps.db.Query(QueryFind, k, v)
// if err != nil {
// return nil, err
// }
// var pages []models.Page
// for rows.Next() {
// err := rows.Scan(&id, &title, &body, &lastName, &email)
// if err != nil {
// log.Fatal(err) // too severe
// }
// u := models.NewPage(id, title, body, lastName, email)
// pages = append(pages, u)
// }
// return pages, nil
// }