diff --git a/Makefile b/Makefile index 8ac08fb9493f703554cc05613d006cc3d1f44432..57f50a0c598a35d28a4acaa6fc4cf6b3f761cd15 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ .PHONY: all all: go generate ./... + go install ./... # vim:ft=make diff --git a/folders/messages.go b/folders/messages.go index 87c9f025457b62c57bd1ae18da2c9bf3b4c7e035..3be061c4dc24d512ba742ff7f12fe4bb7436f42a 100644 --- a/folders/messages.go +++ b/folders/messages.go @@ -63,7 +63,7 @@ func ReadMessage(login, folder string, msgid int64) (*storage.Message, error) { } // ListMessages lists messages. -func ListMessages(folder string) ([]storage.ListMessagesRow, error) { +func ListMessages(folder string) ([]storage.Message, error) { ctx := context.TODO() // TODO: options aren't implemented - need to set them? rows, err := this.Q.ListMessages(ctx, folder) diff --git a/repl/messages.go b/repl/messages.go index f8068b165677e68a585d8c913281e5bc3c5a241c..019f176d98eb5a4da7514bd4381a92b26444e24e 100644 --- a/repl/messages.go +++ b/repl/messages.go @@ -19,6 +19,10 @@ import ( // messages in the current folder. func ActionDirectory(cmd *dclish.Command) error { // TODO: flag parsing. + showExpiration := false + if cmd.Flags["/EXPIRATION"].Value == "true" { + showExpiration = true + } if len(cmd.Args) == 1 { folder, err := folders.ValidFolder(cmd.Args[0]) if err != nil { @@ -36,8 +40,7 @@ func ActionDirectory(cmd *dclish.Command) error { } fmt.Printf("%4s %-43s %-12s %-10s\n", "#", "Subject", "From", "Date") for _, msg := range msgs { - fmt.Printf("%4d %-43s %-12s %-10s\n", msg.ID, msg.Subject, msg.Author, - msg.CreateAt.Format("2006-05-04 15:02:01")) + fmt.Printf("%s\n", msg.OneLine(showExpiration)) } return nil diff --git a/storage/display.go b/storage/display.go index cf41bf664907ca1dd352b8be1f42454f23d29fc0..75155344ae056ec99677f9ff5bf43fc312de4fc7 100644 --- a/storage/display.go +++ b/storage/display.go @@ -22,8 +22,8 @@ func (m *Message) String() string { return buf.String() } -// String renders a message row. -func (m *ListMessagesRow) String(expire bool) string { +// OneLine renders a message in a line. +func (m *Message) OneLine(expire bool) string { var t time.Time if expire { t = m.Expiration diff --git a/storage/folders.sql.go b/storage/folders.sql.go index cad1cd795e650d8e6d5e383c6d0d6d7a324dbc8a..7b5bc42eaf4e208236a7760e86a1c4b22d077e60 100644 --- a/storage/folders.sql.go +++ b/storage/folders.sql.go @@ -61,15 +61,6 @@ func (q *Queries) CreateFolder(ctx context.Context, arg CreateFolderParams) erro return err } -const deleteFolder = `-- name: DeleteFolder :exec -DELETE FROM folders WHERE name=? -` - -func (q *Queries) DeleteFolder(ctx context.Context, name string) error { - _, err := q.db.ExecContext(ctx, deleteFolder, name) - return err -} - const findFolderExact = `-- name: FindFolderExact :one SELECT name FROM folders where name = ? ` diff --git a/storage/messages.sql.go b/storage/messages.sql.go index 5e37783894dc9ae6c1b85b050b7eded2ae459aa1..cf675fa48f064e5da4419f484ea7885862124eac 100644 --- a/storage/messages.sql.go +++ b/storage/messages.sql.go @@ -54,70 +54,6 @@ func (q *Queries) GetFirstMessageID(ctx context.Context, folder string) (int64, return id, err } -const listMessages = `-- name: ListMessages :many -SELECT id, folder, author, subject, message, expiration, create_at, update_at -FROM messages -WHERE folder = ? -` - -type ListMessagesRow struct { - ID int64 - Folder string - Author string - Subject string - Message string - Expiration time.Time - CreateAt time.Time - UpdateAt time.Time -} - -func (q *Queries) ListMessages(ctx context.Context, folder string) ([]ListMessagesRow, error) { - rows, err := q.db.QueryContext(ctx, listMessages, folder) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ListMessagesRow - for rows.Next() { - var i ListMessagesRow - if err := rows.Scan( - &i.ID, - &i.Folder, - &i.Author, - &i.Subject, - &i.Message, - &i.Expiration, - &i.CreateAt, - &i.UpdateAt, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const markMessage = `-- name: MarkMessage :exec -INSERT INTO mark (login, folder, msgid) VALUES (?, ?, ?) -` - -type MarkMessageParams struct { - Login string - Folder string - Msgid int64 -} - -func (q *Queries) MarkMessage(ctx context.Context, arg MarkMessageParams) error { - _, err := q.db.ExecContext(ctx, markMessage, arg.Login, arg.Folder, arg.Msgid) - return err -} - const readMessage = `-- name: ReadMessage :one SELECT id, folder, author, subject, message, permanent, shutdown, expiration, create_at, update_at FROM messages WHERE folder = ? AND id = ? ` diff --git a/storage/migrations/1_create_table.up.sql b/storage/migrations/1_create_table.up.sql index 4899e330808792e09cc999ecce73de52e56ea2bf..863515cede390c0d4325644d4c0f9189af93c5d9 100644 --- a/storage/migrations/1_create_table.up.sql +++ b/storage/migrations/1_create_table.up.sql @@ -135,7 +135,7 @@ CREATE TABLE seen ( ON UPDATE CASCADE ) WITHOUT ROWID; -CREATE TABLE mark ( +CREATE TABLE marks ( login VARCHAR(25) REFERENCES users(login) ON DELETE CASCADE ON UPDATE CASCADE NOT NULL, folder VARCHAR(25) REFERENCES folders(name) @@ -158,7 +158,7 @@ CREATE TABLE folder_access ( ) WITHOUT ROWID; --- User folder configs. -CREATE TABLE config ( +CREATE TABLE folder_configs ( login VARCHAR(25) REFERENCES users(login) ON DELETE CASCADE ON UPDATE CASCADE NOT NULL, folder VARCHAR(25) REFERENCES folders(name) diff --git a/storage/models.go b/storage/models.go index ac7da0b7f55da831fd3336c58ae3b620a733227b..ea5558cbbd29ae33e95a32d67b078de035ec0138 100644 --- a/storage/models.go +++ b/storage/models.go @@ -8,13 +8,6 @@ import ( "time" ) -type Config struct { - Login string - Folder string - Always int64 - Alert int64 -} - type Folder struct { Name string Always int64 @@ -35,6 +28,13 @@ type FolderAccess struct { Folder string } +type FolderConfig struct { + Login string + Folder string + Always int64 + Alert int64 +} + type Mark struct { Login string Folder string diff --git a/storage/queries/folders.sql b/storage/queries/folders.sql index 7882910b0c6a19c2570d78ea4bb9b254faf3776b..16183321535b352140fc38df3963d1a9abecab54 100644 --- a/storage/queries/folders.sql +++ b/storage/queries/folders.sql @@ -36,8 +36,5 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS o ON f.name = c.folder -- name: IsFolderOwner :one SELECT 1 FROM owners WHERE folder = ? AND login = ?; --- name: DeleteFolder :exec -DELETE FROM folders WHERE name=?; - -- name: GetFolderExpire :one SELECT expire FROM folders WHERE name = ?; diff --git a/storage/queries/messages.sql b/storage/queries/messages.sql index 9f6ea221d4611cb9e046a419ea5c103f64ba8ad7..345619b3088c4c761ae6f83f6a0b905b8bc28101 100644 --- a/storage/queries/messages.sql +++ b/storage/queries/messages.sql @@ -8,14 +8,6 @@ INSERT INTO messages ( -- name: SetMessageSeen :exec INSERT INTO seen (login, folder, msgid) VALUES (?, ?, ?); --- name: MarkMessage :exec -INSERT INTO mark (login, folder, msgid) VALUES (?, ?, ?); - --- name: ListMessages :many -SELECT id, folder, author, subject, message, expiration, create_at, update_at -FROM messages -WHERE folder = ?; - -- name: GetFirstMessageID :one SELECT id FROM messages WHERE folder = ? and id = MIN(id) GROUP BY folder; diff --git a/storage/queries/standard.sql b/storage/queries/standard.sql new file mode 100644 index 0000000000000000000000000000000000000000..cdfe2e4afff983b469b3b4e9035a87eff74bcece --- /dev/null +++ b/storage/queries/standard.sql @@ -0,0 +1,95 @@ +-- name: ListUsers :many +SELECT * FROM users; + +-- name: DeleteUser :exec +DELETE FROM users WHERE login = ?; + +-- name: AddFolder :exec +INSERT INTO folders (name) VALUES (?); + +-- name: ListFolders :many +SELECT * FROM folders; + +-- name: GetFolder :one +SELECT * FROM folders WHERE name = ?; + +-- name: DeleteFolder :exec +DELETE FROM folders WHERE name = ?; + +-- name: AddOwner :exec +INSERT INTO owners (folder, login) VALUES (?, ?); + +-- name: ListOwners :many +SELECT * FROM owners; + +-- name: GetOwner :one +SELECT * FROM owners WHERE folder = ? AND login = ?; + +-- name: DeleteOwner :exec +DELETE FROM owners WHERE folder = ? AND login = ?; + +-- name: AddMessage :exec +INSERT INTO messages (id, folder) VALUES (?, ?); + +-- name: ListMessages :many +SELECT * FROM messages WHERE folder = ?; + +-- name: GetMessage :one +SELECT * FROM messages WHERE id = ? AND folder = ?; + +-- name: DeleteMessage :exec +DELETE FROM messages WHERE id = ? AND folder = ?; + +-- name: AddSeen :exec +INSERT INTO seen (folder, login, msgid) VALUES (?, ?, ?); + +-- name: ListSeen :many +SELECT * FROM seen; + +-- name: GetSeen :one +SELECT * FROM seen WHERE folder = ? AND login = ? AND msgid = ?; + +-- name: DeleteSeen :exec +DELETE FROM seen WHERE folder = ? AND login = ? AND msgid = ?; + +-- name: AddMark :exec +INSERT INTO marks (folder, login, msgid) VALUES (?, ?, ?); + +-- name: ListMark :many +SELECT * FROM marks; + +-- name: GetMark :one +SELECT * FROM marks WHERE folder = ? AND login = ? AND msgid = ?; + +-- name: DeleteMark :exec +DELETE FROM marks WHERE folder = ? AND login = ? AND msgid = ?; + +-- name: AddFolderAccess :exec +INSERT INTO folder_access (login, folder) VALUES (?, ?); + +-- name: ListFolderAccess :many +SELECT * FROM folder_access; + +-- name: GetFolderAccess :one +SELECT * FROM folder_access WHERE login = ? AND folder = ?; + +-- name: DeleteFolderAccess :exec +DELETE FROM folder_access WHERE login = ? AND folder = ?; + +-- name: AddFolderConfig :exec +INSERT INTO folder_configs (login, folder) VALUES (?, ?); + +-- name: ListFolderConfig :many +SELECT * FROM folder_configs; + +-- name: GetFolderConfig :one +SELECT * FROM folder_configs WHERE login = ? AND folder = ?; + +-- name: DeleteFolderConfig :exec +DELETE FROM folder_configs WHERE login = ? AND folder = ?; + +-- name: AddSystem :exec +INSERT INTO system (name) VALUES (?); + +-- name: GetSystem :one +SELECT * FROM system WHERE name = ?; diff --git a/storage/standard.sql.go b/storage/standard.sql.go new file mode 100644 index 0000000000000000000000000000000000000000..5e464f92a2830b038f19f512acbd54a7f5e3c885 --- /dev/null +++ b/storage/standard.sql.go @@ -0,0 +1,632 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.29.0 +// source: standard.sql + +package storage + +import ( + "context" +) + +const addFolder = `-- name: AddFolder :exec +INSERT INTO folders (name) VALUES (?) +` + +func (q *Queries) AddFolder(ctx context.Context, name string) error { + _, err := q.db.ExecContext(ctx, addFolder, name) + return err +} + +const addFolderAccess = `-- name: AddFolderAccess :exec +INSERT INTO folder_access (login, folder) VALUES (?, ?) +` + +type AddFolderAccessParams struct { + Login string + Folder string +} + +func (q *Queries) AddFolderAccess(ctx context.Context, arg AddFolderAccessParams) error { + _, err := q.db.ExecContext(ctx, addFolderAccess, arg.Login, arg.Folder) + return err +} + +const addFolderConfig = `-- name: AddFolderConfig :exec +INSERT INTO folder_configs (login, folder) VALUES (?, ?) +` + +type AddFolderConfigParams struct { + Login string + Folder string +} + +func (q *Queries) AddFolderConfig(ctx context.Context, arg AddFolderConfigParams) error { + _, err := q.db.ExecContext(ctx, addFolderConfig, arg.Login, arg.Folder) + return err +} + +const addMark = `-- name: AddMark :exec +INSERT INTO marks (folder, login, msgid) VALUES (?, ?, ?) +` + +type AddMarkParams struct { + Folder string + Login string + Msgid int64 +} + +func (q *Queries) AddMark(ctx context.Context, arg AddMarkParams) error { + _, err := q.db.ExecContext(ctx, addMark, arg.Folder, arg.Login, arg.Msgid) + return err +} + +const addMessage = `-- name: AddMessage :exec +INSERT INTO messages (id, folder) VALUES (?, ?) +` + +type AddMessageParams struct { + ID int64 + Folder string +} + +func (q *Queries) AddMessage(ctx context.Context, arg AddMessageParams) error { + _, err := q.db.ExecContext(ctx, addMessage, arg.ID, arg.Folder) + return err +} + +const addOwner = `-- name: AddOwner :exec +INSERT INTO owners (folder, login) VALUES (?, ?) +` + +type AddOwnerParams struct { + Folder string + Login string +} + +func (q *Queries) AddOwner(ctx context.Context, arg AddOwnerParams) error { + _, err := q.db.ExecContext(ctx, addOwner, arg.Folder, arg.Login) + return err +} + +const addSeen = `-- name: AddSeen :exec +INSERT INTO seen (folder, login, msgid) VALUES (?, ?, ?) +` + +type AddSeenParams struct { + Folder string + Login string + Msgid int64 +} + +func (q *Queries) AddSeen(ctx context.Context, arg AddSeenParams) error { + _, err := q.db.ExecContext(ctx, addSeen, arg.Folder, arg.Login, arg.Msgid) + return err +} + +const addSystem = `-- name: AddSystem :exec +INSERT INTO system (name) VALUES (?) +` + +func (q *Queries) AddSystem(ctx context.Context, name string) error { + _, err := q.db.ExecContext(ctx, addSystem, name) + return err +} + +const deleteFolder = `-- name: DeleteFolder :exec +DELETE FROM folders WHERE name = ? +` + +func (q *Queries) DeleteFolder(ctx context.Context, name string) error { + _, err := q.db.ExecContext(ctx, deleteFolder, name) + return err +} + +const deleteFolderAccess = `-- name: DeleteFolderAccess :exec +DELETE FROM folder_access WHERE login = ? AND folder = ? +` + +type DeleteFolderAccessParams struct { + Login string + Folder string +} + +func (q *Queries) DeleteFolderAccess(ctx context.Context, arg DeleteFolderAccessParams) error { + _, err := q.db.ExecContext(ctx, deleteFolderAccess, arg.Login, arg.Folder) + return err +} + +const deleteFolderConfig = `-- name: DeleteFolderConfig :exec +DELETE FROM folder_configs WHERE login = ? AND folder = ? +` + +type DeleteFolderConfigParams struct { + Login string + Folder string +} + +func (q *Queries) DeleteFolderConfig(ctx context.Context, arg DeleteFolderConfigParams) error { + _, err := q.db.ExecContext(ctx, deleteFolderConfig, arg.Login, arg.Folder) + return err +} + +const deleteMark = `-- name: DeleteMark :exec +DELETE FROM marks WHERE folder = ? AND login = ? AND msgid = ? +` + +type DeleteMarkParams struct { + Folder string + Login string + Msgid int64 +} + +func (q *Queries) DeleteMark(ctx context.Context, arg DeleteMarkParams) error { + _, err := q.db.ExecContext(ctx, deleteMark, arg.Folder, arg.Login, arg.Msgid) + return err +} + +const deleteMessage = `-- name: DeleteMessage :exec +DELETE FROM messages WHERE id = ? AND folder = ? +` + +type DeleteMessageParams struct { + ID int64 + Folder string +} + +func (q *Queries) DeleteMessage(ctx context.Context, arg DeleteMessageParams) error { + _, err := q.db.ExecContext(ctx, deleteMessage, arg.ID, arg.Folder) + return err +} + +const deleteOwner = `-- name: DeleteOwner :exec +DELETE FROM owners WHERE folder = ? AND login = ? +` + +type DeleteOwnerParams struct { + Folder string + Login string +} + +func (q *Queries) DeleteOwner(ctx context.Context, arg DeleteOwnerParams) error { + _, err := q.db.ExecContext(ctx, deleteOwner, arg.Folder, arg.Login) + return err +} + +const deleteSeen = `-- name: DeleteSeen :exec +DELETE FROM seen WHERE folder = ? AND login = ? AND msgid = ? +` + +type DeleteSeenParams struct { + Folder string + Login string + Msgid int64 +} + +func (q *Queries) DeleteSeen(ctx context.Context, arg DeleteSeenParams) error { + _, err := q.db.ExecContext(ctx, deleteSeen, arg.Folder, arg.Login, arg.Msgid) + return err +} + +const deleteUser = `-- name: DeleteUser :exec +DELETE FROM users WHERE login = ? +` + +func (q *Queries) DeleteUser(ctx context.Context, login string) error { + _, err := q.db.ExecContext(ctx, deleteUser, login) + return err +} + +const getFolder = `-- name: GetFolder :one +SELECT name, "always", brief, description, notify, readnew, shownew, system, expire, visibility, create_at, update_at FROM folders WHERE name = ? +` + +func (q *Queries) GetFolder(ctx context.Context, name string) (Folder, error) { + row := q.db.QueryRowContext(ctx, getFolder, name) + var i Folder + err := row.Scan( + &i.Name, + &i.Always, + &i.Brief, + &i.Description, + &i.Notify, + &i.Readnew, + &i.Shownew, + &i.System, + &i.Expire, + &i.Visibility, + &i.CreateAt, + &i.UpdateAt, + ) + return i, err +} + +const getFolderAccess = `-- name: GetFolderAccess :one +SELECT login, folder FROM folder_access WHERE login = ? AND folder = ? +` + +type GetFolderAccessParams struct { + Login string + Folder string +} + +func (q *Queries) GetFolderAccess(ctx context.Context, arg GetFolderAccessParams) (FolderAccess, error) { + row := q.db.QueryRowContext(ctx, getFolderAccess, arg.Login, arg.Folder) + var i FolderAccess + err := row.Scan(&i.Login, &i.Folder) + return i, err +} + +const getFolderConfig = `-- name: GetFolderConfig :one +SELECT login, folder, "always", alert FROM folder_configs WHERE login = ? AND folder = ? +` + +type GetFolderConfigParams struct { + Login string + Folder string +} + +func (q *Queries) GetFolderConfig(ctx context.Context, arg GetFolderConfigParams) (FolderConfig, error) { + row := q.db.QueryRowContext(ctx, getFolderConfig, arg.Login, arg.Folder) + var i FolderConfig + err := row.Scan( + &i.Login, + &i.Folder, + &i.Always, + &i.Alert, + ) + return i, err +} + +const getMark = `-- name: GetMark :one +SELECT login, folder, msgid FROM marks WHERE folder = ? AND login = ? AND msgid = ? +` + +type GetMarkParams struct { + Folder string + Login string + Msgid int64 +} + +func (q *Queries) GetMark(ctx context.Context, arg GetMarkParams) (Mark, error) { + row := q.db.QueryRowContext(ctx, getMark, arg.Folder, arg.Login, arg.Msgid) + var i Mark + err := row.Scan(&i.Login, &i.Folder, &i.Msgid) + return i, err +} + +const getMessage = `-- name: GetMessage :one +SELECT id, folder, author, subject, message, permanent, shutdown, expiration, create_at, update_at FROM messages WHERE id = ? AND folder = ? +` + +type GetMessageParams struct { + ID int64 + Folder string +} + +func (q *Queries) GetMessage(ctx context.Context, arg GetMessageParams) (Message, error) { + row := q.db.QueryRowContext(ctx, getMessage, arg.ID, arg.Folder) + var i Message + err := row.Scan( + &i.ID, + &i.Folder, + &i.Author, + &i.Subject, + &i.Message, + &i.Permanent, + &i.Shutdown, + &i.Expiration, + &i.CreateAt, + &i.UpdateAt, + ) + return i, err +} + +const getOwner = `-- name: GetOwner :one +SELECT folder, login, create_at, update_at FROM owners WHERE folder = ? AND login = ? +` + +type GetOwnerParams struct { + Folder string + Login string +} + +func (q *Queries) GetOwner(ctx context.Context, arg GetOwnerParams) (Owner, error) { + row := q.db.QueryRowContext(ctx, getOwner, arg.Folder, arg.Login) + var i Owner + err := row.Scan( + &i.Folder, + &i.Login, + &i.CreateAt, + &i.UpdateAt, + ) + return i, err +} + +const getSeen = `-- name: GetSeen :one +SELECT login, folder, msgid FROM seen WHERE folder = ? AND login = ? AND msgid = ? +` + +type GetSeenParams struct { + Folder string + Login string + Msgid int64 +} + +func (q *Queries) GetSeen(ctx context.Context, arg GetSeenParams) (Seen, error) { + row := q.db.QueryRowContext(ctx, getSeen, arg.Folder, arg.Login, arg.Msgid) + var i Seen + err := row.Scan(&i.Login, &i.Folder, &i.Msgid) + return i, err +} + +const getSystem = `-- name: GetSystem :one +SELECT name, default_expire, expire_limit FROM system WHERE name = ? +` + +func (q *Queries) GetSystem(ctx context.Context, name string) (System, error) { + row := q.db.QueryRowContext(ctx, getSystem, name) + var i System + err := row.Scan(&i.Name, &i.DefaultExpire, &i.ExpireLimit) + return i, err +} + +const listFolderAccess = `-- name: ListFolderAccess :many +SELECT login, folder FROM folder_access +` + +func (q *Queries) ListFolderAccess(ctx context.Context) ([]FolderAccess, error) { + rows, err := q.db.QueryContext(ctx, listFolderAccess) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FolderAccess + for rows.Next() { + var i FolderAccess + if err := rows.Scan(&i.Login, &i.Folder); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listFolderConfig = `-- name: ListFolderConfig :many +SELECT login, folder, "always", alert FROM folder_configs +` + +func (q *Queries) ListFolderConfig(ctx context.Context) ([]FolderConfig, error) { + rows, err := q.db.QueryContext(ctx, listFolderConfig) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FolderConfig + for rows.Next() { + var i FolderConfig + if err := rows.Scan( + &i.Login, + &i.Folder, + &i.Always, + &i.Alert, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listFolders = `-- name: ListFolders :many +SELECT name, "always", brief, description, notify, readnew, shownew, system, expire, visibility, create_at, update_at FROM folders +` + +func (q *Queries) ListFolders(ctx context.Context) ([]Folder, error) { + rows, err := q.db.QueryContext(ctx, listFolders) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Folder + for rows.Next() { + var i Folder + if err := rows.Scan( + &i.Name, + &i.Always, + &i.Brief, + &i.Description, + &i.Notify, + &i.Readnew, + &i.Shownew, + &i.System, + &i.Expire, + &i.Visibility, + &i.CreateAt, + &i.UpdateAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listMark = `-- name: ListMark :many +SELECT login, folder, msgid FROM marks +` + +func (q *Queries) ListMark(ctx context.Context) ([]Mark, error) { + rows, err := q.db.QueryContext(ctx, listMark) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Mark + for rows.Next() { + var i Mark + if err := rows.Scan(&i.Login, &i.Folder, &i.Msgid); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listMessages = `-- name: ListMessages :many +SELECT id, folder, author, subject, message, permanent, shutdown, expiration, create_at, update_at FROM messages WHERE folder = ? +` + +func (q *Queries) ListMessages(ctx context.Context, folder string) ([]Message, error) { + rows, err := q.db.QueryContext(ctx, listMessages, folder) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Message + for rows.Next() { + var i Message + if err := rows.Scan( + &i.ID, + &i.Folder, + &i.Author, + &i.Subject, + &i.Message, + &i.Permanent, + &i.Shutdown, + &i.Expiration, + &i.CreateAt, + &i.UpdateAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listOwners = `-- name: ListOwners :many +SELECT folder, login, create_at, update_at FROM owners +` + +func (q *Queries) ListOwners(ctx context.Context) ([]Owner, error) { + rows, err := q.db.QueryContext(ctx, listOwners) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Owner + for rows.Next() { + var i Owner + if err := rows.Scan( + &i.Folder, + &i.Login, + &i.CreateAt, + &i.UpdateAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listSeen = `-- name: ListSeen :many +SELECT login, folder, msgid FROM seen +` + +func (q *Queries) ListSeen(ctx context.Context) ([]Seen, error) { + rows, err := q.db.QueryContext(ctx, listSeen) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Seen + for rows.Next() { + var i Seen + if err := rows.Scan(&i.Login, &i.Folder, &i.Msgid); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const listUsers = `-- name: ListUsers :many +SELECT login, name, admin, moderator, alert, disabled, last_login, create_at, update_at FROM users +` + +func (q *Queries) ListUsers(ctx context.Context) ([]User, error) { + rows, err := q.db.QueryContext(ctx, listUsers) + if err != nil { + return nil, err + } + defer rows.Close() + var items []User + for rows.Next() { + var i User + if err := rows.Scan( + &i.Login, + &i.Name, + &i.Admin, + &i.Moderator, + &i.Alert, + &i.Disabled, + &i.LastLogin, + &i.CreateAt, + &i.UpdateAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +}