forked from team-limakilo/lardoon
-
Notifications
You must be signed in to change notification settings - Fork 1
/
database.go
142 lines (119 loc) · 3.41 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 lardoon
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
var db *sql.DB
const schema = `
CREATE TABLE IF NOT EXISTS replays (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT UNIQUE,
reference_time TEXT,
recording_time TEXT,
title TEXT,
data_source TEXT,
data_recorder TEXT,
duration INTEGER,
size INTEGER
);
CREATE TABLE IF NOT EXISTS replay_objects (
replay_id INTEGER,
object_id INTEGER,
types TEXT,
name TEXT,
pilot TEXT,
created_offset INTEGER,
deleted_offset INTEGER,
UNIQUE(replay_id, object_id),
FOREIGN KEY(replay_id) REFERENCES replays(id)
);
`
type Replay struct {
Id int `json:"id"`
Path string `json:"path"`
ReferenceTime string `json:"reference_time"`
RecordingTime string `json:"recording_time"`
Title string `json:"title"`
DataSource string `json:"data_source"`
DataRecorder string `json:"data_recorder"`
Duration *int `json:"duration"`
Size int `json:"size"`
}
type ReplayObject struct {
Id int `json:"id"`
ReplayId int `json:"replay_id"`
Types string `json:"types"`
Name string `json:"name"`
Pilot string `json:"pilot"`
CreatedOffset int `json:"created_offset"`
DeletedOffset int `json:"deleted_offset"`
}
type ReplayWithObjects struct {
Replay
Objects []*ReplayObject `json:"objects"`
}
func beginTransaction() (*sql.Tx, error) {
return db.Begin()
}
func createReplayObject(tx *sql.Tx, replayId int, objectId int, types string, name string, pilot string, createdOffset int, deletedOffset int) error {
_, err := tx.Exec(`
INSERT INTO replay_objects VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (replay_id, object_id) DO UPDATE
SET types = EXCLUDED.types, name = EXCLUDED.name, pilot = EXCLUDED.pilot, created_offset = EXCLUDED.created_offset, deleted_offset = EXCLUDED.deleted_offset
`, replayId, objectId, types, name, pilot, createdOffset, deletedOffset)
return err
}
func setReplayDuration(tx *sql.Tx, replayId, duration int) error {
_, err := tx.Exec(`UPDATE replays SET duration=? WHERE id=?`, duration, replayId)
return err
}
func createReplay(tx *sql.Tx, path string, referenceTime string, recordingTime string, title string, dataSource string, dataRecorder string, size int) (int, error) {
row, err := tx.Query(`SELECT id, duration, size FROM replays WHERE path=?`, path)
if err != nil {
return -1, err
}
if row.Next() {
var id int
var dur *int
var exSize int
err = row.Scan(&id, &dur, &exSize)
row.Close()
if err != nil {
return -1, err
}
if dur != nil && size == exSize {
return -1, nil
}
_, err = tx.Exec(
`UPDATE replays SET path=?, reference_time=?, recording_time=?, title=?, data_source=?, data_recorder=?, size=? WHERE id=?`,
path, referenceTime, recordingTime, title, dataSource, dataRecorder, size, id,
)
return id, err
} else {
row.Close()
}
row, err = tx.Query(`
INSERT INTO replays (path, reference_time, recording_time, title, data_source, data_recorder, size) VALUES (?, ?, ?, ?, ?, ?, ?)
RETURNING id
`, path, referenceTime, recordingTime, title, dataSource, dataRecorder, size)
if err != nil {
return -1, err
}
defer row.Close()
row.Next()
var id int
err = row.Scan(&id)
if err != nil {
return -1, err
}
return id, nil
}
func InitDatabase(dbPath string) error {
var err error
db, err = sql.Open("sqlite3", dbPath)
if err != nil {
return err
}
_, err = db.Exec(schema)
return err
}