Initial commit: hugot lysenko
This commit is contained in:
86
handlers/quotedb/dao.go
Normal file
86
handlers/quotedb/dao.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package quotedb
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// TODO(lupine): Much of the contents here can be replaced with sqlx, in time
|
||||
|
||||
type Quote struct {
|
||||
Id int // Unique among all quotes
|
||||
QuoteId int // Unique within a particular channel
|
||||
Channel string
|
||||
Data string
|
||||
Author string
|
||||
CreatedAt NullTime
|
||||
DeletedAt NullTime
|
||||
DeletedBy sql.NullString
|
||||
}
|
||||
|
||||
var (
|
||||
SCHEMA = `
|
||||
create table if not exists quotes(
|
||||
id integer not null primary key,
|
||||
quote_id integer not null,
|
||||
channel string not null,
|
||||
data text not null,
|
||||
author text not null,
|
||||
created_at timestamp,
|
||||
deleted_at timestamp,
|
||||
deleted_by string
|
||||
);
|
||||
create index if not exists quotes_by_channel on quotes(channel);
|
||||
create index if not exists quotes_by_deleted_at on quotes(deleted_at);
|
||||
create index if not exists quotes_by_data on quotes(data);
|
||||
create unique index if not exists unique_quotes_by_channel_and_quote_id on quotes(channel, quote_id);
|
||||
`
|
||||
|
||||
quoteCols = `id,quote_id,channel,data,author,created_at,deleted_at,deleted_by`
|
||||
|
||||
findQuoteById = `SELECT ` + quoteCols + ` FROM quotes WHERE id = ? LIMIT 1`
|
||||
findQuoteByQuoteId = `SELECT ` + quoteCols + ` FROM quotes WHERE quote_id = ? AND channel = ? LIMIT 1`
|
||||
findLastQuote = `SELECT ` + quoteCols + ` FROM quotes WHERE channel = ? ORDER BY quote_id DESC LIMIT 1`
|
||||
findQuotesByTerm = `SELECT ` + quoteCols + ` FROM quotes WHERE channel = ? AND data LIKE ? ORDER BY quote_id DESC`
|
||||
findRandomQuote = `SELECT ` + quoteCols + ` FROM quotes WHERE deleted_at IS NULL AND channel = ? ORDER BY RANDOM() LIMIT 1`
|
||||
|
||||
insertQuote = `
|
||||
INSERT INTO quotes (
|
||||
channel,
|
||||
quote_id,
|
||||
data,
|
||||
author,
|
||||
created_at
|
||||
) SELECT
|
||||
$1,
|
||||
ifnull(max(quote_id),0)+1,
|
||||
$2,
|
||||
$3,
|
||||
$4
|
||||
FROM quotes WHERE channel = $1;
|
||||
`
|
||||
|
||||
errInsertIdUnknown = errors.New("SQL: Couldn't determine insert ID")
|
||||
)
|
||||
|
||||
// urgh. Code reuse. Not.
|
||||
func scanQuotesRows(rows *sql.Rows) (*Quote, error) {
|
||||
var quote Quote
|
||||
|
||||
err := rows.Scan(
|
||||
"e.Id, "e.QuoteId, "e.Channel, "e.Data, "e.Author,
|
||||
"e.CreatedAt, "e.DeletedAt, "e.DeletedBy,
|
||||
)
|
||||
|
||||
return "e, err
|
||||
}
|
||||
|
||||
func scanQuotesRow(row *sql.Row) (*Quote, error) {
|
||||
var quote Quote
|
||||
|
||||
err := row.Scan(
|
||||
"e.Id, "e.QuoteId, "e.Channel, "e.Data, "e.Author,
|
||||
"e.CreatedAt, "e.DeletedAt, "e.DeletedBy)
|
||||
|
||||
return "e, err
|
||||
}
|
Reference in New Issue
Block a user