-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcodiceC++.cpp
More file actions
222 lines (206 loc) · 9.34 KB
/
codiceC++.cpp
File metadata and controls
222 lines (206 loc) · 9.34 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
#include <iostream>
#include <iomanip>
#include <string>
#include "dependencies/include/libpq-fe.h"
using namespace std;
#define PG_HOST "127.0.0.1"
#define PG_USER "postgres"
#define PG_PORT 5432
#define PG_DB "TheArtGallery"
bool controllaStato(PGconn* conn,PGresult * result){
if (PQresultStatus(result) != PGRES_TUPLES_OK)
{
cout << "\nRisultati inconsistenti in esecuzione!" << PQerrorMessage(conn) << endl;
PQclear(result);
result = 0;
return false;
}
return true;
}
void controlloPreparazione(PGconn* conn,PGresult * stmt){
if (PQresultStatus(stmt) != 1)
{
cout << "Risultati inconsistenti in preparazione!" << PQerrorMessage(conn) << endl;
PQclear(stmt);
stmt = 0;
PQfinish(conn);
system("pause");
exit(1);
}
}
void stampaQuery(PGresult* risultato){
int nrRighe = PQntuples(risultato);
if(nrRighe != 0){
int nrColonne = PQnfields(risultato);
string ris[nrRighe +1][nrColonne];
int lunghezzaMax[nrColonne];
// popolamento della matrice ris con i risultati e i titoli delle colonne e calcolo lunghezza massima campi per ogni colonna
for(int i = 0; i<nrColonne; i++){
ris[0][i] = PQfname(risultato, i);
lunghezzaMax[i] = ris[0][i].length();
};
// controllo lugnhezza dei risultati della query per colonna
for(int i=1; i<nrRighe +1; i++){
for(int j = 0; j<nrColonne; j++) {
ris[i][j] = PQgetvalue(risultato, i-1, j);
int lunghezza = ris[i][j].length();
if(lunghezza > lunghezzaMax[j]) lunghezzaMax[j] = lunghezza;
}
}
cout<<endl<<endl;
// stampa risultati in colonna
for(int i=0; i<nrRighe +1; i++){
for(int j = 0; j<nrColonne; j++){
cout << setw(lunghezzaMax[j]) <<ris[i][j] <<"\t";
}
cout << "\n";
}
cout<<endl<<endl;
}
else{
cout<< "\n\nIl risultato di questa query e' composto da 0 tuple. Nel database non sono presenti tuple corrispondenti a questa query.\n\n";
}
PQclear(risultato);
};
int main(int argc, char** argv) {
cout<< " inserire la password del database:";
char pass[50];
cin >> pass;
char conninfo[250];
sprintf(conninfo , "user=%s password=%s dbname=%s hostaddr=%s port=%d", PG_USER , pass , PG_DB , PG_HOST , PG_PORT);
PGconn* conn;
conn = PQconnectdb(conninfo);
if(PQstatus(conn) != CONNECTION_OK) { // verifica connessione riuscita
cout << "Errore di connessione \n\n" << PQerrorMessage(conn);
PQfinish(conn);
system("pause");
exit(1);
} else {
cout << "Connessione avvenuta correttamente! \n\n";
}
PGresult *stmt0 = PQprepare(conn,
"Query 0", // Visualizzare tutte le Mostre aperte nel periodo corrente o che apriranno in futuro
"SELECT m.ID, m.DataInizio, m.DataFine, m.Nome, m.Tema \
FROM Mostra m \
WHERE m.DataFine >= CURRENT_DATE; ",
0,
NULL);
controlloPreparazione(conn, stmt0);
PGresult *stmt1 = PQprepare(conn,
"Query 1", //Visualizzare tutte le opere esposte in una mostra
"SELECT o.Artista, o.Titolo, o.Descrizione, o.Materiali, o.AnnoCreazione \
FROM Opera o \
JOIN SpazioEsposizione s \
ON o.ID = s.IDOpera \
JOIN Mostra m \
ON s.IDMostra = m.ID \
WHERE m.ID = $1::int;",
1,
NULL);
controlloPreparazione(conn, stmt1);
PGresult *stmt2 = PQprepare(conn,
"Query 2", //Calcolare il Totale delle entrate dovute all’acquisto di opere di una mostra
"SELECT SUM(Entrata.Importo) as Totale_Entrate \
FROM Entrata \
JOIN Opera \
ON Entrata.ID = Opera.IDBonifico \
WHERE IDMostra = $1::int;",
1,
NULL);
controlloPreparazione(conn, stmt2);
PGresult *stmt3 = PQprepare(conn,
"Query 3", // Stampare il numero di visitatori totale per ogni giorno di apertura di una data Mostra
"SELECT COUNT(IDVisitatore) as NrVisitatori ,DataIngresso \
FROM Entrata \
JOIN Mostra \
ON Entrata.IDMostra = $1::int AND Mostra.ID = $1::int \
WHERE DataIngresso IS NOT NULL \
GROUP BY DataIngresso \
ORDER BY DataIngresso;",
1,
NULL);
controlloPreparazione(conn, stmt3);
PGresult *stmt4 = PQprepare(conn,
"Query 4", // Visualizzare i 5 proprietari che hanno speso di più comprando opere e il totale degli introiti a loro dovuti
"SELECT p.ID, p.Nome, p.Cognome, p.Telefono, p.Email, SUM( e.Importo) as TotaleAcquisti \
FROM Proprietario p \
JOIN Opera o \
ON o.IDAcquirente = p.ID \
JOIN Entrata e \
ON e.ID = o.IDBonifico \
GROUP BY p.ID \
ORDER BY TotaleAcquisti DESC \
LIMIT 5;",
0,
NULL);
controlloPreparazione(conn, stmt4);
PGresult *stmt5 = PQprepare(conn,
"Query 5",//Visualizzare i proprietari che hanno comprato più di un’opera e il numero di opere da loro comprate
"SELECT p.ID, p.Nome, p.Cognome, p.Telefono, p.Email, COUNT(Opera.ID) AS TotaleAcquisti \
FROM Opera \
JOIN Proprietario p ON Opera.IDAcquirente = p.ID \
GROUP BY p.ID \
HAVING COUNT(Opera.ID) > 1 \
ORDER BY COUNT(Opera.ID) DESC;",
0,
NULL);
controlloPreparazione(conn, stmt5);
bool continua = true;
while (continua){
cout << "Vuoi eseguire una delle query disponibili? \ndigita il numero corrispondente per scegliere una query ed eseguirla: (qualsiasi altro tasto per uscire)\n\n"
<<"0 - Visualizzare tutte le Mostre aperte nel periodo corrente o che apriranno in futuro.\n"
<<"1 - Visualizzare tutte le opere esposte in una mostra, parametri esempio: 1, 2, 3\n"
<<"2 - Calcolare il Totale delle entrate dovute all'acquisto di opere di una mostra, parametri esempio: 1, 2, 3 \n"
<<"3 - Stampare il numero di visitatori totale per ogni giorno di apertura di una data Mostra, parametri esempio: 1, 2, 3\n" // è uguale a 2!
<<"4 - Visualizzare i 5 proprietari che hanno speso di piu comprando opere e il totale degli introiti a loro dovuti\n"
<<"5 - Visualizzare i proprietari che hanno comprato piu di un'opera e il numero di opere da loro comprate\n\n";
int a;
cin>> a;
const char* parametri[5];
PGresult* risultato = NULL;
bool successo = false;
string id;
switch(a){
case 0:
risultato = PQexecPrepared(conn, "Query 0", 0, NULL, NULL, 0, 0);
successo = controllaStato(conn, risultato);
break;
case 1:
cout<<"inserisci l'ID della mostra: ";
cin >> id;
parametri[0] = id.c_str();
risultato = PQexecPrepared(conn, "Query 1", 1, parametri, NULL, 0, 0);
successo = controllaStato(conn, risultato);
break;
case 2:
cout<<"inserisci l'ID della mostra: ";
cin >> id;
parametri[0] = id.c_str();
risultato = PQexecPrepared(conn, "Query 2", 1, parametri, NULL, 0, 0);
successo = controllaStato(conn, risultato);
break;
case 3:
cout<<"inserisci l'ID della mostra: ";
cin >> id;
parametri[0] = id.c_str();
risultato = PQexecPrepared(conn, "Query 3", 1, parametri, NULL, 0, 0);
successo = controllaStato(conn, risultato);
break;
case 4:
risultato = PQexecPrepared(conn, "Query 4", 0, parametri, NULL, 0, 0);
successo = controllaStato(conn, risultato);
break;
case 5:
risultato = PQexecPrepared(conn, "Query 5", 0, NULL, NULL, 0, 0);
successo = controllaStato(conn, risultato);
break;
default:
continua = false;
}
if(successo){
stampaQuery(risultato);
}
}
PQfinish(conn);
return 0;
}