-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsql_test.cpp
More file actions
327 lines (289 loc) · 10.8 KB
/
sql_test.cpp
File metadata and controls
327 lines (289 loc) · 10.8 KB
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
///////////////////////////////////////////////
/// TRABALHO FINAL FUNDAMENTOS DE B.D. ///
/// ///
/// Acessando a Base através de um programa.///
/// Método de acesso: API - libpqxx ///
/// Linguagem escolhida: C++ ///
///////////////////////////////////////////////
#include <iostream>
#include <pqxx/pqxx> // Biblioteca API
using namespace std;
using namespace pqxx;
// Prototypes
string truncate(string str, size_t width, bool show_ellipsis=true);
void printResult(result);
void Consulta_1(string);
void Consulta_2(string);
void Consulta_3(string);
void Consulta_4(string);
void Consulta_5(string);
void Consulta_6(string);
void Consulta_7(string);
void Consulta_8(string);
void Consulta_9(string);
void Consulta_0(string);
int main()
{
string conn = "user=postgres hostaddr=127.0.0.1 password=123qwe dbname=trabalho_fbd"; //Dados para conexão ao BD
char oper = ' ';
while(oper != 's' && oper != 'S'){ //Loop menu
try{
connection C(conn);
system("clear");
cout << "-------------------------------------------------------------------------------\n";
cout << setw(57) << right << "M E N U D E C O N S U L T A S\n";
cout << "-------------------------------------------------------------------------------\n";
cout << "1. Apelido dos usuários que ultrapassaram R$ 100 somando todas suas compras.\n\n";
cout << "2. O número de jogos com uma determinada tag na biblioteca de cada usuário.\n\n";
cout << "3. Titulo dos jogos de um determinado gênero que possuem DLCs.\n\n";
cout << "4. Apelido dos amigos de um usuário que não possuem jogos em comum com ele.\n\n";
cout << "5. Jogos de um determinado gênero e mais duas tags à sua escolha.\n\n";
cout << "6. Empresas que desenvolveram softwares com a tag relacionada à sua busca.\n\n";
cout << "7. Empresas desenvolvedoras cujos jogos ultrapassaram a marca de 100h de uso.\n\n";
cout << "8. Empresas distribuidoras em ordem decrescente de faturamento.\n\n";
cout << "9. Valor da maior compra de cada usuário que já realizou compras na plataforma.\n\n";
cout << "0. Jogos de 2 ou mais jogadores em comum entre um usuário e seus amigos.\n\n";
cout << "Selecione uma opção (0-9)(S:Sair): ";
cin.get(oper);
system("clear");
switch(oper){
case '1':
Consulta_1(conn);
break;
case '2':
Consulta_2(conn);
break;
case '3':
Consulta_3(conn);
break;
case '4':
Consulta_4(conn);
break;
case '5':
Consulta_5(conn);
break;
case '6':
Consulta_6(conn);
break;
case '7':
Consulta_7(conn);
break;
case '8':
Consulta_8(conn);
break;
case '9':
Consulta_9(conn);
break;
case '0':
Consulta_0(conn);
break;
case 'S':
case 's':
break;
}
}
catch(std::exception const &e){
cerr << e.what() << '\n';
return 1;
}
}
return 0;
}
void Consulta_1(string conn){
connection C(conn); // Conexão C, que utiliza os parâmetros da string conn. Objeto da classe 'connection', definida pela API.
work W{C}; // Operação W, que utiliza a conexão como parâmetro. Objeto da classe 'work', definida pela API.
cout << "1. Apelido dos usuários que ultrapassaram R$ 100 somando todas suas compras.\n";
result R{W.exec( // Resultado R, um objeto da classe 'result'. Dentro do bloco, a string de operações sql é executada através do método 'exec', da classe work.
"select nickname \
from Usr \
where steam_id in(select buyer_steam_id \
from Finished_Order natural join Digital_Copy natural join Product \
group by buyer_steam_id \
having sum(price)>100)"
)};
printResult(R); // Chamada da função printResult, que recebe o resultado dos comandos sql, armazenado em R.
cin.ignore(); // Limpa o buffer de input do usuário.
}
void Consulta_2(string conn){
connection C(conn);
work W{C};
string query_buffer; // Buffer para o input do usuário, que recebe uma Tag para consulta.
cout << "2. O número de jogos com uma determinada tag na biblioteca de cada usuário.\n";
cout << "Informe a tag desejada para a busca: ";
cin.ignore();
getline(cin, query_buffer);
query_buffer = "select nickname, count (*) \
from Bibliotecas \
where product_id in(select product_id \
from Categorization natural join Tag \
where tag_name = '" + query_buffer + "') \
group by steam_id, nickname"; // O buffer é concatenado com as instruções da consulta em sql.
result R{W.exec(query_buffer)};
printResult(R);
}
void Consulta_3(string conn){
connection C(conn);
work W{C};
string query_buffer;
cout << "3. Titulo dos jogos de um determinado gênero que possuem DLCs.\n";
cout << "Informe o gênero desejado para a busca: ";
cin.ignore();
getline(cin, query_buffer);
query_buffer = "select product_name \
from Product natural join Game \
where product_id in (select game_product_id \
from Downloadable_Content) and game_genre = '" + query_buffer + "'";
result R{W.exec(query_buffer)};
printResult(R);
}
void Consulta_4(string conn){
connection C(conn);
work W{C};
string query_buffer;
cout << "4. Apelido dos amigos de um usuário que não possuem jogos em comum com ele.\n";
cout << "Informe o SteamID do usuário para a busca: ";
cin.ignore();
getline(cin, query_buffer);
query_buffer = "select distinct nickname \
from ((select friend_steam_id \
from Usr natural join Friendship \
where steam_id = "+query_buffer+" \
union \
select steam_id \
from Usr natural join Friendship \
where friend_steam_id = "+query_buffer+") as User_friends left join Usr on User_friends.friend_steam_id=Usr.steam_id) as EXT \
where not exists(select product_id \
from Bibliotecas \
where steam_id = "+query_buffer+" and product_id in(select distinct product_id \
from Bibliotecas \
where steam_id = EXT.steam_id))";
result R{W.exec(query_buffer)};
printResult(R);
}
void Consulta_5(string conn){
connection C(conn);
work W{C};
string query_buffer, genre, tag1, tag2;
cout << "5. Jogos de um determinado gênero e mais duas tags à sua escolha.\n";
cout << "Informe o gênero do jogo: ";
cin.ignore();
getline(cin, genre);
cout << "Informe a tag #1: ";
getline(cin, tag1);
cout << "Informe a tag #2: ";
getline(cin, tag2);
query_buffer = "select product_name \
from Product natural join Game \
where game_genre = '"+ genre +"' and product_id in(select product_id \
from Categorization natural join Tag \
where tag_name = '"+ tag1 +"' \
intersect \
select product_id \
from Categorization natural join Tag \
where tag_name = '"+ tag2 +"')";
result R{W.exec(query_buffer)};
printResult(R);
}
void Consulta_6(string conn){
connection C(conn);
work W{C};
string query_buffer;
cout << "6. Empresas que desenvolveram softwares com a tag relacionada à sua busca.\n";
cout << "Informe a tag desejada para a busca: ";
cin.ignore();
getline(cin, query_buffer);
query_buffer = "select cpny_name \
from Company natural join Development natural join Software \
where product_id in (select product_id \
from Tag natural join Categorization natural join Software \
where tag_name = '"+ query_buffer +"')";
result R{W.exec(query_buffer)};
printResult(R);
}
void Consulta_7(string conn){
connection C(conn);
work W{C};
string query_buffer;
cout << "7. Empresas desenvolvedoras cujos jogos ultrapassaram a marca de 100h de uso.\n";
query_buffer = "select cpny_name \
from Company natural join Development natural join Game \
where cpny_id in (select cpny_id \
from Bibliotecas natural join Development natural join Company \
group by cpny_id \
having sum(time_played)>'100h')";
result R{W.exec(query_buffer)};
printResult(R);
cin.ignore();
}
void Consulta_8(string conn){
connection C(conn);
work W{C};
string query_buffer;
cout << "8. Empresas distribuidoras em ordem decrescente de faturamento.\n";
query_buffer = "select cpny_name, sum(price) \
from Distribution natural join Company natural join Bibliotecas natural join Product \
group by cpny_id, cpny_name \
order by sum(price) desc";
result R{W.exec(query_buffer)};
printResult(R);
cin.ignore();
}
void Consulta_9(string conn){
connection C(conn);
work W{C};
string query_buffer;
cout << "9. Valor da maior compra de cada usuário que já realizou compras na plataforma.\n";
query_buffer = "select nickname, max(purchases) as top_purchase \
from (select nickname, sum(price) as purchases \
from Finished_Order natural join Digital_Copy natural join Product natural join Usr \
group by buyer_steam_id, nickname, pchse_id \
order by purchases desc) as purchases \
group by nickname \
order by top_purchase desc";
result R{W.exec(query_buffer)};
printResult(R);
cin.ignore();
}
void Consulta_0(string conn){
connection C(conn);
work W{C};
string query_buffer;
cout << "0. Jogos de 2 ou mais jogadores em comum entre um usuário e seus amigos.\n";
cout << "Informe o SteamID do usuário para a busca: ";
cin.ignore();
getline(cin, query_buffer);
query_buffer = "select distinct nickname, product_name \
from (select friend_steam_id \
from Usr natural join Friendship \
where steam_id = "+query_buffer+" \
union \
select steam_id \
from Usr natural join Friendship \
where friend_steam_id = "+query_buffer+")as U left join Bibliotecas B on (U.friend_steam_id=B.steam_id) \
where product_id in (select distinct product_id \
from Bibliotecas natural join Game \
where steam_id = "+query_buffer+" and num_of_players <> 1) and \
steam_id <>"+query_buffer;
result R{W.exec(query_buffer)};
printResult(R);
}
void printResult(result R){ // Função printResult, executa um laço sobre toda a matriz de resultados.
std::cout << R.size() << " resultado(s) encontrado(s).\n";
for (auto row = R.begin(); row != R.end(); row++)
{
for (auto field = row.begin(); field != row.end(); field++)
std::cout << setw(20) << left << truncate(field->c_str(), 20) << "| ";
std::cout << std::endl;
}
cout << "\nPressione qualquer tecla para continuar...";
cin.get();
}
std::string truncate(std::string str, size_t width, bool show_ellipsis) // Função de truncamento das strings que contém os resultados,
{ // para melhor visualização da tabela.
if (str.length() > width)
if (show_ellipsis)
return str.substr(0, width-3) + "...";
else
return str.substr(0, width);
return str;
}