aboutsummaryrefslogtreecommitdiff
path: root/db.go
diff options
context:
space:
mode:
authorJordan <me@jordan.im>2021-12-03 07:19:28 -0700
committerJordan <me@jordan.im>2021-12-03 07:19:28 -0700
commitb0835fc63877c63e88e75840c5d52d3167ad5e10 (patch)
tree9db697711cab98fa9c49f87d40d6f7212baae19c /db.go
downloadkeep-b0835fc63877c63e88e75840c5d52d3167ad5e10.tar.gz
keep-b0835fc63877c63e88e75840c5d52d3167ad5e10.zip
initial commit
Diffstat (limited to 'db.go')
-rw-r--r--db.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/db.go b/db.go
new file mode 100644
index 0000000..ddac17e
--- /dev/null
+++ b/db.go
@@ -0,0 +1,78 @@
+package main
+
+import (
+ "database/sql"
+ "errors"
+ "log"
+ "os"
+
+ _ "github.com/mattn/go-sqlite3"
+)
+
+func initDB(path string) *sql.DB {
+
+ if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) {
+ log.Printf("Creating %s...\n", path)
+ file, err := os.Create(path)
+ if err != nil {
+ log.Fatal(err)
+ }
+ file.Close()
+
+ db, _ := sql.Open("sqlite3", path)
+ initTables(db)
+ return db
+ } else {
+ db, err := sql.Open("sqlite3", path)
+ if err != nil {
+ log.Fatal(err)
+ }
+ return db
+ }
+}
+
+func initTables(db *sql.DB) {
+
+ q := `CREATE TABLE IF NOT EXISTS urls (
+ id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
+ url VARCHAR(500) NOT NULL,
+ author_id VARCHAR(18),
+ guild_id VARCHAR(18),
+ channel_id VARCHAR(18),
+ status_code INTEGER
+ );
+ CREATE UNIQUE INDEX idx_urls_url ON urls(url);`
+ s, err := db.Prepare(q)
+ if err != nil {
+ log.Fatal(err)
+ }
+ s.Exec()
+}
+
+func addArchived(db *sql.DB, m *Message, status_code int) {
+
+ q := `INSERT OR IGNORE INTO urls(url, author_id, guild_id, channel_id, status_code) VALUES (?, ?, ?, ?, ?)`
+ s, err := db.Prepare(q)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer s.Close()
+ _, err = s.Exec(m.URL, m.Author, m.Guild, m.Channel, status_code)
+ if err != nil {
+ log.Fatal(err)
+ }
+}
+
+func isCached(db *sql.DB, url string) (bool, int) {
+
+ var status_code int
+ err := db.QueryRow("SELECT status_code FROM urls WHERE url = ?",
+ url).Scan(&status_code)
+ switch {
+ case err == sql.ErrNoRows:
+ return false, status_code
+ case err != nil:
+ log.Fatal(err)
+ }
+ return true, status_code
+}