aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan <me@jordan.im>2021-12-19 16:11:37 -0700
committerJordan <me@jordan.im>2021-12-19 16:11:37 -0700
commite75d842f662d9d6a95da6e2ac7a6ee2afdde2115 (patch)
tree74f05d0b60484163bea6a2e9fbdacae88534bc0a
parent742993249d98550cce3059fac9a81792c5f53bed (diff)
downloadkeep-e75d842f662d9d6a95da6e2ac7a6ee2afdde2115.tar.gz
keep-e75d842f662d9d6a95da6e2ac7a6ee2afdde2115.zip
db: supplant query permutations
-rw-r--r--db.go150
1 files changed, 48 insertions, 102 deletions
diff --git a/db.go b/db.go
index d10f4ba..6aa53a5 100644
--- a/db.go
+++ b/db.go
@@ -3,6 +3,7 @@ package main
import (
"database/sql"
"errors"
+ "fmt"
"log"
"os"
@@ -157,116 +158,61 @@ func (db *SqliteDB) Stats() (*Stats, error) {
func (db *SqliteDB) ListEntries(limit int, offset int, user string,
guild string, channel string) (*[]Entry, error) {
- var rows *sql.Rows
- var err error
- if user == "" && guild == "" && channel == "" {
- rows, err = db.db.Query(`
- SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
- FROM urls
- INNER JOIN users ON users.id = urls.user_string_id
- INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
- ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, limit, offset)
- if err != nil {
- return nil, err
- }
- } else if user != "" && guild == "" && channel == "" {
- rows, err = db.db.Query(`
- SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
- FROM urls
- INNER JOIN users ON users.id = urls.user_string_id
- INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
- WHERE user_string_id = (SELECT id FROM users WHERE user_id = ?)
- ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, user, limit, offset)
- if err != nil {
- return nil, err
- }
- } else if user != "" && guild != "" && channel == "" {
- rows, err = db.db.Query(`
- SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
- FROM urls
- INNER JOIN users ON users.id = urls.user_string_id
- INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
- WHERE user_string_id = (SELECT id FROM users WHERE user_id = ?)
- AND guild_string_id = (SELECT id FROM guilds WHERE guild_id = ?)
- ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, user, guild, limit, offset)
- if err != nil {
- return nil, err
- }
- } else if user != "" && guild == "" && channel != "" {
- rows, err = db.db.Query(`
+ query := `
SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
FROM urls
INNER JOIN users ON users.id = urls.user_string_id
INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
- WHERE user_string_id = (SELECT id FROM users WHERE user_id = ?)
- AND channel_string_id = (SELECT id FROM channels WHERE channel_id = ?)
- ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, user, channel, limit, offset)
- if err != nil {
- return nil, err
- }
- } else if user != "" && guild != "" && channel != "" {
- rows, err = db.db.Query(`
- SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
- FROM urls
- INNER JOIN users ON users.id = urls.user_string_id
- INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
+ INNER JOIN channels ON channels.id = urls.channel_string_id`
+
+ hasWhere := false
+ args := []interface{}{}
+ if user != "" {
+ query = fmt.Sprintf(`%s
WHERE user_string_id = (SELECT id FROM users WHERE user_id = ?)
- AND guild_string_id = (SELECT id FROM guilds WHERE guild_id = ?)
- AND channel_string_id = (SELECT id FROM channels WHERE channel_id = ?)
- ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, user, guild, channel, limit, offset)
- if err != nil {
- return nil, err
- }
- } else if user == "" && guild != "" && channel != "" {
- rows, err = db.db.Query(`
- SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
- FROM urls
- INNER JOIN users ON users.id = urls.user_string_id
- INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
- WHERE guild_string_id = (SELECT id FROM guilds WHERE guild_id = ?)
- AND channel_string_id = (SELECT id FROM channels WHERE channel_id = ?)
- ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, guild, channel, limit, offset)
- if err != nil {
- return nil, err
+ `, query)
+ args = append(args, user)
+ hasWhere = true
+ }
+ if guild != "" {
+ if !hasWhere {
+ query = fmt.Sprintf(`%s
+ WHERE guild_string_id = (SELECT id FROM guilds WHERE guild_id = ?)
+ `, query)
+ args = append(args, guild)
+ hasWhere = true
+ } else {
+ query = fmt.Sprintf(`%s
+ AND guild_string_id = (SELECT id FROM guilds WHERE guild_id = ?)
+ `, query)
+ args = append(args, guild)
}
- } else if user == "" && guild == "" && channel != "" {
- rows, err = db.db.Query(`
- SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
- FROM urls
- INNER JOIN users ON users.id = urls.user_string_id
- INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
- WHERE channel_string_id = (SELECT id FROM channels WHERE channel_id = ?)
- ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, channel, limit, offset)
- if err != nil {
- return nil, err
+ }
+ if channel != "" {
+ if !hasWhere {
+ query = fmt.Sprintf(`%s
+ WHERE channel_string_id = (SELECT id FROM channels WHERE channel_id = ?)
+ `, query)
+ args = append(args, channel)
+ hasWhere = true
+ } else {
+ query = fmt.Sprintf(`%s
+ AND channel_string_id = (SELECT id FROM channels WHERE channel_id = ?)
+ `, query)
+ args = append(args, channel)
}
- } else if user == "" && guild != "" && channel == "" {
- rows, err = db.db.Query(`
- SELECT urls.id, urls.url, users.user_id, guilds.guild_id, channels.channel_id, status_code
- FROM urls
- INNER JOIN users ON users.id = urls.user_string_id
- INNER JOIN guilds ON guilds.id = urls.guild_string_id
- INNER JOIN channels ON channels.id = urls.channel_string_id
- WHERE guild_string_id = (SELECT id FROM guilds WHERE guild_id = ?)
+ }
+ query = fmt.Sprintf(`%s
ORDER BY urls.id DESC
- LIMIT ? OFFSET ?;`, guild, limit, offset)
- if err != nil {
- return nil, err
- }
+ LIMIT ? OFFSET ?;`, query)
+ args = append(args, limit)
+ args = append(args, offset)
+
+ var rows *sql.Rows
+ var err error
+ rows, err = db.db.Query(query, args...)
+ if err != nil {
+ return nil, err
}
defer rows.Close()