/
database.go
142 lines (126 loc) · 4.61 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package database
import (
"context"
"database/sql"
"log"
"os"
"time"
"github.com/ivab1/distribcalc/internal/authorization"
_ "github.com/lib/pq"
)
type MainExpression struct {
Id int
Expression string
Answer any
State int
UserID int
}
type Server struct {
ServerId int
NextPing string
State int
}
// Подключение к базе данных
func StartDB() *sql.DB {
connStr := os.Getenv("DATABASE_URL")
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}
return db
}
func MakeDB(db *sql.DB) {
// Создание таблицы expressions, если такой не существует
_, err := db.Exec("CREATE TABLE IF NOT EXISTS public.expressions (id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 ), expression text, answer real, state integer, userid integer, PRIMARY KEY (id));")
if err != nil {
log.Fatal(err)
}
// Создание таблицы timelimits, если такой не существует
_, err = db.Exec("CREATE TABLE IF NOT EXISTS public.timelimits (id integer DEFAULT 1, add integer DEFAULT 1, sub integer DEFAULT 1, mult integer DEFAULT 1, div integer DEFAULT 1, lifetime integer DEFAULT 1, PRIMARY KEY (id));")
if err != nil {
log.Fatal(err)
}
// Установка ограничий времени, если не установлены
_, err = db.Exec("INSERT INTO public.timelimits VALUES (1, 60, 60, 60, 60, 60) ON CONFLICT (id) DO NOTHING")
if err != nil {
log.Fatal(err)
}
// Создание таблицы simpleexpressions для хранения подвыражений, если такой не существует
_, err = db.Exec("CREATE TABLE IF NOT EXISTS public.simpleexpressions (id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 ), mainexpressionid integer, variable text, n1 text, n2 text, operation char, answer real, processing bool, last bool, PRIMARY KEY (id));")
if err != nil {
log.Fatal(err)
}
// Создание таблицы servers для отслеживания состояния серверов, если такой не существует
_, err = db.Exec("CREATE TABLE IF NOT EXISTS public.servers (serverid integer, nextping text, state integer, PRIMARY KEY (serverid));")
if err != nil {
log.Fatal(err)
}
_, err = db.Exec("INSERT INTO public.servers VALUES (1, $1, 1) ON CONFLICT (serverid) DO NOTHING", time.Now().Add(10*time.Second).Format("2006-01-02 15:04:05"))
if err != nil {
log.Fatal(err)
}
// Создание таблицы с пользователями
if _, err := db.Exec("CREATE TABLE IF NOT EXISTS public.users (id integer NOT NULL GENERATED ALWAYS AS IDENTITY( INCREMENT 1 START 1 MINVALUE 1 ), name text unique, password text, PRIMARY KEY (id));"); err != nil {
log.Fatal(err)
}
}
// Получение списка выражений
func GetExpressionData(db *sql.DB, userID int64) []MainExpression {
rows, err := db.Query("select * from expressions where userid = $1", userID)
if err != nil {
panic(err)
}
defer rows.Close()
mainExpressions := []MainExpression{}
for rows.Next() {
mainExpression := MainExpression{}
err := rows.Scan(&mainExpression.Id, &mainExpression.Expression, &mainExpression.Answer, &mainExpression.State, &mainExpression.UserID)
if err != nil {
log.Fatal(err)
continue
}
mainExpressions = append(mainExpressions, mainExpression)
}
return mainExpressions
}
// Получение информации о вычислителях
func GetSereverInfo(db *sql.DB) []Server {
rows, err := db.Query("select * from servers")
if err != nil {
panic(err)
}
defer rows.Close()
serverInfo := []Server{}
for rows.Next() {
server := Server{}
err := rows.Scan(&server.ServerId, &server.NextPing, &server.State)
if err != nil {
log.Fatal(err)
continue
}
serverInfo = append(serverInfo, server)
}
return serverInfo
}
// Добавление нового пользователя в таблицу
func InsertUser(ctx context.Context, db *sql.DB, user *authorization.User) (int64, error) {
var q = `
INSERT INTO users (name, password) values ($1, $2) RETURNING id
`
var id int64
err := db.QueryRow(q, user.Name, user.Password).Scan(&id)
if err != nil {
return 0, err
}
return id, nil
}
// Получение пользователя по имени
func SelectUser(ctx context.Context, db *sql.DB, name string) (authorization.User, error) {
var (
user authorization.User
err error
)
var q = "SELECT id, name, password FROM users WHERE name=$1"
err = db.QueryRowContext(ctx, q, name).Scan(&user.ID, &user.Name, &user.Password)
return user, err
}