Unverified Commit 737a2693 authored by Kevin Lyda's avatar Kevin Lyda
Browse files

First pass at storage.

parent 2f8e7094
Loading
Loading
Loading
Loading

Makefile

0 → 100644
+7 −0
Original line number Diff line number Diff line
.PHONY: all
all:
	go generate ./...


# vim:ft=make
#
+13 −0
Original line number Diff line number Diff line
@@ -3,3 +3,16 @@ Package ask provides routines to ask questions of users. It handles
getting a line of text, getting a choice from a liat and other things.
*/
package ask

import "github.com/chzyer/readline"

// GetLine gets a line.
func GetLine(prompt string) (string, error) {
	rl, err := readline.New(prompt)
	if err != nil {
		return "", err
	}
	defer rl.Close()
	line, err := rl.Readline()
	return line, err
}
+3 −47
Original line number Diff line number Diff line
package storage

import (
	"embed"
	"errors"
	"os"
	"path"

	"github.com/adrg/xdg"
	"github.com/golang-migrate/migrate/v4"
	"github.com/golang-migrate/migrate/v4/source/iofs"
	"github.com/jmoiron/sqlx"

	// Included to connect to sqlite.
@@ -16,49 +10,11 @@ import (
	_ "modernc.org/sqlite"
)

//go:embed migrations/*.sql
var migrationsFS embed.FS

// Store is the store for bulletin.
type Store struct {
	user string
	db   *sqlx.DB
}

// Open opens the bulletin database.
func Open(user string) (*Store, error) {
	fdir := path.Join(xdg.DataHome, "BULLETIN")
	err := os.MkdirAll(fdir, 0700)
	if err != nil {
		return nil, errors.New("bulletin directory problem")
	}
	fdb := path.Join(fdir, "bulletin.db")

	// Run db migrations if needed.
	migrations, err := iofs.New(migrationsFS, "migrations")
	if err != nil {
		return nil, err
	}
	m, err := migrate.NewWithSourceInstance("iofs", migrations,
		"sqlite://"+fdb+"?_pragma=foreign_keys(1)")
	if err != nil {
		return nil, err
	}
	err = m.Up()
	if err != nil && err != migrate.ErrNoChange {
		return nil, err
	}
	m.Close()

	store := &Store{user: user}
	store.db, err = sqlx.Connect("sqlite", "file://"+fdb+"?_pragma=foreign_keys(1)")
func Open(dbfile string) (*sqlx.DB, error) {
	db, err := sqlx.Connect("sqlite", "file://"+dbfile+"?_pragma=foreign_keys(1)")
	if err != nil {
		return nil, errors.New("bulletin database problem")
	}
	return store, nil
}

// Close closes the db backing the store.
func (fstore *Store) Close() {
	fstore.db.Close()
	return db, nil
}

storage/display.go

0 → 100644
+35 −0
Original line number Diff line number Diff line
package storage

import (
	"fmt"
	"strings"
	"time"
)

// Full renders a message.
func (m *Message) Full() string {
	buf := &strings.Builder{}
	changed := "*"
	if m.CreateAt.Compare(m.UpdateAt) == 0 {
		changed = ""
	}
	fmt.Fprintf(buf, "From: \"%s\" %s%s\n", m.Author,
		m.CreateAt.Format("02-JAN-2006 15:04:05"), changed)
	fmt.Fprintf(buf, "To: %s\n", m.Folder)
	fmt.Fprintf(buf, "Subj: %s\n\n", m.Subject)
	fmt.Fprintf(buf, "%s\n", m.Message)

	return buf.String()
}

// Short renders a message.
func (m *Message) Short(expire bool) string {
	var t time.Time
	if expire {
		t = m.Expiration
	} else {
		t = m.CreateAt
	}
	ts := t.Format("2006-05-04 15:02:01")
	return fmt.Sprintf("%4d %-43s %-12s %-10s\n", m.ID, m.Subject, m.Author, ts)
}
+2 −3
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ package storage

import (
	"context"
	"database/sql"
)

const createFolder = `-- name: CreateFolder :exec
@@ -97,7 +96,7 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS c ON f.name = c.folder

type IsFolderAccessParams struct {
	Name  string
	Owner sql.NullString
	Owner string
}

func (q *Queries) IsFolderAccess(ctx context.Context, arg IsFolderAccessParams) (int64, error) {
@@ -114,7 +113,7 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS c ON f.name = c.folder

type IsFolderOwnerParams struct {
	Name  string
	Owner sql.NullString
	Owner string
}

func (q *Queries) IsFolderOwner(ctx context.Context, arg IsFolderOwnerParams) (int64, error) {
Loading