2024-05-12 22:47:24 +00:00
|
|
|
package store
|
|
|
|
|
|
|
|
import "database/sql"
|
|
|
|
|
|
|
|
var (
|
2024-05-13 08:45:38 +00:00
|
|
|
votingInsert *sql.Stmt
|
|
|
|
votingSelect *sql.Stmt
|
|
|
|
voteEligible *sql.Stmt
|
|
|
|
voteInsert *sql.Stmt
|
|
|
|
voteSelect *sql.Stmt
|
2024-05-12 22:47:24 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func initCreateTables(db *sql.DB) {
|
2024-05-13 08:45:38 +00:00
|
|
|
var err error
|
|
|
|
createTables := `
|
2024-05-12 22:47:24 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS voting (
|
|
|
|
id TEXT PRIMARY KEY,
|
|
|
|
referendum TEXT NOT NULL,
|
|
|
|
created DATETIME WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
deadline DATETIME WITHOUT TIME ZONE NOT NULL,
|
|
|
|
quorum TEXT NOT NULL DEFAULT 'SIMPLE',
|
|
|
|
threshold TEXT NOT NULL DEFAULT 'SIMPLE',
|
|
|
|
electors TEXT,
|
|
|
|
anonymous BOOL NOT NULL DEFAULT false
|
|
|
|
);
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS vote (
|
|
|
|
id BLOB PRIMARY KEY,
|
|
|
|
voting TEXT NOT NULL,
|
|
|
|
elector TEXT NOT NULL,
|
|
|
|
choice TEXT NOT NULL,
|
|
|
|
timestamp DATETIME WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
FOREIGN KEY(voting) REFERENCES voting(id)
|
|
|
|
);
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS vote_voting ON vote ( voting );
|
|
|
|
`
|
|
|
|
|
2024-05-13 08:45:38 +00:00
|
|
|
if _, err = db.Exec(createTables); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2024-05-12 22:47:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func initStmts(db *sql.DB) {
|
2024-05-13 08:45:38 +00:00
|
|
|
initStmtVotingInsert(db)
|
|
|
|
initStmtVotingSelect(db)
|
2024-05-12 22:47:24 +00:00
|
|
|
|
2024-05-13 08:45:38 +00:00
|
|
|
initStmtVoteEligible(db)
|
|
|
|
initStmtVoteInsert(db)
|
|
|
|
initStmtVoteSelect(db)
|
2024-05-12 22:47:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func initStmtVotingInsert(db *sql.DB) {
|
2024-05-13 08:45:38 +00:00
|
|
|
var err error
|
|
|
|
if votingInsert, err = db.Prepare(`
|
2024-05-12 22:47:24 +00:00
|
|
|
INSERT INTO voting (
|
|
|
|
id,
|
|
|
|
referendum,
|
|
|
|
deadline,
|
|
|
|
quorum,
|
|
|
|
threshold,
|
|
|
|
electors,
|
|
|
|
anonymous
|
|
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?);
|
|
|
|
`); err != nil {
|
2024-05-13 08:45:38 +00:00
|
|
|
panic(err)
|
|
|
|
}
|
2024-05-12 22:47:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func initStmtVotingSelect(db *sql.DB) {
|
2024-05-13 08:45:38 +00:00
|
|
|
var err error
|
|
|
|
if votingSelect, err = db.Prepare(`
|
2024-05-12 22:47:24 +00:00
|
|
|
SELECT
|
|
|
|
referendum,
|
|
|
|
deadline,
|
|
|
|
quorum,
|
|
|
|
threshold,
|
|
|
|
electors,
|
|
|
|
anonymous
|
|
|
|
FROM voting
|
|
|
|
WHERE id = ?;
|
|
|
|
`); err != nil {
|
2024-05-13 08:45:38 +00:00
|
|
|
panic(err)
|
|
|
|
}
|
2024-05-12 22:47:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func initStmtVoteEligible(db *sql.DB) {
|
2024-05-13 08:45:38 +00:00
|
|
|
var err error
|
|
|
|
if voteEligible, err = db.Prepare(`
|
2024-05-12 22:47:24 +00:00
|
|
|
SELECT
|
|
|
|
id,
|
|
|
|
referendum,
|
|
|
|
created,
|
|
|
|
deadline,
|
|
|
|
quorum,
|
|
|
|
threshold
|
|
|
|
FROM voting
|
|
|
|
WHERE
|
|
|
|
id = ?
|
|
|
|
AND deadline > datetime('now')
|
|
|
|
AND (
|
|
|
|
electors IS NULL
|
|
|
|
OR ',' || electors || ',' LIKE '%,' || ? || ',%'
|
|
|
|
)
|
|
|
|
LIMIT 1;
|
|
|
|
`); err != nil {
|
2024-05-13 08:45:38 +00:00
|
|
|
panic(err)
|
|
|
|
}
|
2024-05-12 22:47:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func initStmtVoteInsert(db *sql.DB) {
|
2024-05-13 08:45:38 +00:00
|
|
|
var err error
|
|
|
|
if voteInsert, err = db.Prepare(`
|
2024-05-12 22:47:24 +00:00
|
|
|
INSERT INTO vote (
|
|
|
|
id, voting, elector, choice
|
|
|
|
) VALUES (
|
|
|
|
?, ?, ?, ?
|
|
|
|
);
|
|
|
|
`); err != nil {
|
2024-05-13 08:45:38 +00:00
|
|
|
panic(err)
|
|
|
|
}
|
2024-05-12 22:47:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func initStmtVoteSelect(db *sql.DB) {
|
2024-05-13 08:45:38 +00:00
|
|
|
var err error
|
|
|
|
if voteSelect, err = db.Prepare(`
|
2024-05-12 22:47:24 +00:00
|
|
|
SELECT
|
|
|
|
elector,
|
|
|
|
choice,
|
|
|
|
timestamp
|
|
|
|
FROM vote
|
|
|
|
WHERE voting = ?;
|
|
|
|
`); err != nil {
|
2024-05-13 08:45:38 +00:00
|
|
|
panic(err)
|
|
|
|
}
|
2024-05-12 22:47:24 +00:00
|
|
|
}
|