-
Notifications
You must be signed in to change notification settings - Fork 0
/
database.go
83 lines (68 loc) · 1.56 KB
/
database.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package database
import (
"database/sql"
"errors"
"fmt"
// Importing Sqlite3 lib
_ "github.com/mattn/go-sqlite3"
)
// Item is a model for fact item
type Item struct {
ID int `json:"id"`
Fact string `json:"fact"`
}
// GetItem returns item from database
func GetItem(db *sql.DB, id int) (*Item, error) {
res := Item{}
sql := "SELECT * FROM facts WHERE id = ?"
stmt, err := db.Prepare(sql)
if err != nil {
e := fmt.Sprintf("Error, preparing statement : %v", err)
return nil, errors.New(e)
}
defer stmt.Close()
err = stmt.QueryRow(id).Scan(&res.ID, &res.Fact)
if err != nil {
e := fmt.Sprintf("Error, getting item in DB : %v", err)
return nil, errors.New(e)
}
return &res, nil
}
// PutItem puts item in database
func PutItem(db *sql.DB, id int, fact string) error {
sql := "INSERT INTO facts(id, fact) VALUES(?, ?)"
stmt, err := db.Prepare(sql)
if err != nil {
e := fmt.Sprintf("Error, preparing statement : %v", err)
return errors.New(e)
}
defer stmt.Close()
_, err = stmt.Exec(id, fact)
if err != nil {
e := fmt.Sprintf("Error, putting item in DB : %v", err)
return errors.New(e)
}
return nil
}
// Open opens database specified in 'p'
func Open(p string) (*sql.DB, error) {
db, err := sql.Open("sqlite3", p)
if err != nil {
return db, err
}
return db, nil
}
// CreateTable creates a table in 'db' if table doesn't exits
func CreateTable(db *sql.DB) error {
sql := `
CREATE TABLE IF NOT EXISTS facts (
id INTEGER NOT NULL PRIMARY KEY,
fact TEXT
);
`
_, err := db.Exec(sql)
if err != nil {
return err
}
return nil
}