-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdatabase.js
155 lines (139 loc) · 3.97 KB
/
database.js
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
143
144
145
146
147
148
149
150
151
152
153
154
155
const sqlite3 = require('sqlite3');
class Database {
db;
constructor(dbFilePath) {
this.db = new sqlite3.Database(dbFilePath, (err) => {
if (err) {
console.log('Could not connect to database', err);
} else {
console.log('Connected to database');
/*
this.db.get("SELECT value FROM info WHERE key='syncRound'", (err, row) => {
if (err || !row) {
console.log('Database does not exist.');
}
});
*/
}
});
this.db.configure('busyTimeout', 10000);
}
run(query, params = []) {
return new Promise((resolve, reject) => {
this.db.run(query, params, function (err) {
if (err) {
console.log('Error running sql ' + query);
console.log(err);
reject(err);
} else {
resolve(this);
//resolve({ id: this.lastID });
}
});
});
}
get(query, params = []) {
return new Promise((resolve, reject) => {
this.db.get(query, params, (err, result) => {
if (err) {
console.log('Error running sql: ' + query);
console.log(err);
reject(err);
} else {
resolve(result);
}
});
});
}
all(query, params = []) {
return new Promise((resolve, reject) => {
this.db.all(query, params, (err, rows) => {
if (err) {
console.log('Error running sql: ' + query);
console.log(err);
reject(err);
} else {
resolve(rows);
}
});
});
}
close() {
return new Promise((resolve, reject) => {
this.db.close((err) => {
if (err) {
console.log('error during database connection close', err);
reject(err);
} else {
console.log('Database connection closed');
resolve();
}
});
});
}
async getInfo(key) {
return await this.get(
`
SELECT value FROM info WHERE key = ?
`,
[key]
);
}
async searchInfo(key) {
return await this.all(
`
SELECT * FROM info WHERE key LIKE ?
`,
[`%${key}%`]
);
}
async setInfo(key, value) {
return await this.run(
`
INSERT OR REPLACE INTO info (key, value) VALUES (?, ?)
`,
[key, value]
);
}
// quest score methods
async getScores() {
return await this.all(
`
WITH regular_scores AS (
SELECT
SUBSTR(key, INSTR(key, ':') + 1) AS address,
COUNT(key) AS score,
MAX(value) AS last_activity
FROM info
WHERE key NOT LIKE '%_daily'
GROUP BY address
),
daily_scores AS (
SELECT
SUBSTR(key, INSTR(key, ':') + 1) AS address,
SUM(CAST(value AS INTEGER)) AS score
FROM info
WHERE key LIKE '%_daily:%'
GROUP BY address
)
SELECT
r.address,
(IFNULL(r.score, 0) + IFNULL(d.score, 0)) AS total_score,
r.last_activity
FROM regular_scores r
LEFT JOIN daily_scores d ON r.address = d.address
UNION ALL
SELECT
d.address,
d.score AS score,
NULL AS last_activity
FROM daily_scores d
LEFT JOIN regular_scores r ON d.address = r.address
WHERE r.address IS NULL
`
);
}
}
module.exports = {
Database
}