-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDriver.h
257 lines (212 loc) · 7.55 KB
/
Driver.h
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
#ifndef DRIVER_H_
#define DRIVER_H_
#include "Tipos.h"
#include "aed2/Conj.h"
#include "aed2/TiposBasicos.h"
#include "Dato.h"
#include "Registro.h"
#include "Tabla.h"
#include "BaseDatos.h"
namespace aed2
{
class Driver
{
public:
/**
* Esta clase representa un dato, que puede tomar valores de String o de Nat.
*/
class Dato
{
public:
Dato(const aed2::Nat& x);
Dato(const aed2::String& x);
bool esNat() const;
bool esString() const;
TipoCampo tipo() const;
const aed2::Nat& dameNat() const;
const aed2::String& dameString() const;
bool operator == (const Dato& otro) const;
bool operator != (const Dato& otro) const;
private:
TipoCampo tipo_;
aed2::Nat nat_;
aed2::String str_;
};
/**
* Esta clase representa un registro, es decir, un mapeo de nombres de columna a valores.
*/
typedef aed2::Dicc<NombreCampo, Dato> Registro;
// Base de datos
/**
* inicializa una base de datos vacía.
*/
Driver();
/**
* destruye el contenido de la base de datos, liberando la memoria dinámica alocada.
*/
~Driver();
// Tabla
/**
* Crea una tabla nueva en la base de datos.
*
* PRE: 'nombre' no pertenece a las tablas de la base de datos.
* PRE: las 'claves' están incluídas en los nombres de las 'columnas'.
*/
void crearTabla(const NombreTabla& nombre, const aed2::Conj<Columna>& columnas, const aed2::Conj<NombreCampo>& claves);
/**
* Inserta un registro en una tabla de la base de datos.
*
* PRE: idem especificación TAD Driver :: insertarEntrada
*/
void insertarRegistro(const NombreTabla& tabla, const Driver::Registro& reg);
/**
* Borra una serie de registros de una tabla de la base de datos.
*
* PRE:
* - 'tabla' pertenece a las tablas de la base de datos.
* - 'columna' es una columna de dicha tabla.
* - el tipo de 'valor' coincide con el tipo de dicha columna.
*/
void borrarRegistro(const NombreTabla& tabla, const NombreCampo& columna, const Dato& valor);
/**
* Devuelve el conjunto de columnas de la tabla.
*
* PRE: 'tabla' pertenece a las tablas de la base de datos.
*/
aed2::Conj<Columna> columnasDeTabla(const NombreTabla& tabla) const;
/**
* Devuelve el conjunto de columnas clave de la tabla.
*
* PRE: 'tabla' pertenece a las tablas de la base de datos.
*/
aed2::Conj<NombreCampo> columnasClaveDeTabla(const NombreTabla& tabla) const;
/**
* Devuelve el conjunto de registros de la tabla.
*
* PRE: 'tabla' pertenece a las tablas de la base de datos.
*/
aed2::Conj<Registro> registrosDeTabla(const NombreTabla& tabla)const;
/**
* Devuelve la cantidad de accesos que se hicieron a la tabla.
*
* PRE: 'tabla' pertenece a las tablas de la base de datos.
*/
aed2::Nat cantidadDeAccesosDeTabla(const NombreTabla& tabla) const;
/**
* Devuelve el minimo valor de una columna de la tabla.
*
* PRE:
* - 'tabla' pertenece a las tablas de la base de datos.
* - idem especificación TAD Tabla :: minimo
*/
Dato minimo(const NombreTabla& tabla, const NombreCampo& columna) const;
/**
* Devuelve el maximo valor de una columna de la tabla.
*
* PRE:
* - 'tabla' pertenece a las tablas de la base de datos.
* - idem especificación TAD Tabla :: maximo
*/
Dato maximo(const NombreTabla& tabla, const NombreCampo& columna) const;
/**
* Devuelve el conjunto de registros de la tabla que sean iguales al criterio.
*
* PRE: 'tabla' pertenece a las tablas de la base de datos.
*/
aed2::Conj<Registro> buscar(const NombreTabla& tabla, const Registro& criterio) const;
/**
* Devuelve los nombres de todas las tablas de la base de datos.
*/
aed2::Conj<NombreTabla> tablas() const;
/**
* Devuelve el nombre de la tabla con la mayor cantidad de accesos.
*
* PRE: existe al menos una tabla en la base de datos.
*/
const NombreTabla tablaMaxima() const;
// Indices
/**
* Indica si una tabla tiene índice definido sobre un campo de tipo Nat.
*
* PRE: 'tabla' pertenece a las tablas de la base de datos.
*/
bool tieneIndiceNat(const NombreTabla& tabla) const;
/**
* Indica si una tabla tiene índice definido sobre un campo de tipo String.
*
* PRE: 'tabla' pertenece a las tablas de la base de datos.
*/
bool tieneIndiceString(const NombreTabla& tabla) const;
/**
* Devuelve el campo sobre el cuál está definido el índice de tipo Nat.
*
* PRE:
* - 'tabla' pertenece a las tablas de la base de datos.
* - existe un índice de tipo Nat en dicha tabla.
*/
const NombreCampo campoIndiceNat(const NombreTabla& tabla) const;
/**
* Devuelve el campo sobre el cuál está definido el índice de tipo String.
*
* PRE:
* - 'tabla' pertenece a las tablas de la base de datos.
* - existe un índice de tipo String en dicha tabla.
*/
const NombreCampo campoIndiceString(const NombreTabla& tabla) const;
/**
* Crea un índicede tipo Nat sobre un campo de la tabla.
*
* PRE:
* - 'tabla' pertenece a las tablas de la base de datos.
* - no existe un índice de tipo Nat en dicha tabla.
* - 'campo' pertenece a las columnas de dicha tabla, y la columna es de tipo Nat.
*/
void crearIndiceNat(const NombreTabla& tabla, const NombreCampo& campo);
/**
* Crea un índicede tipo String sobre un campo de la tabla.
*
* PRE:
* - 'tabla' pertenece a las tablas de la base de datos.
* - no existe un índice de tipo String en dicha tabla.
* - 'campo' pertenece a las columnas de dicha tabla, y la columna es de tipo String.
*/
void crearIndiceString(const NombreTabla& tabla, const NombreCampo& campo);
// Joins
/**
* Indica si existe un join entre 'tabla1' y 'tabla2'.
*/
bool hayJoin(const NombreTabla& tabla1, const NombreTabla& tabla2) const;
/**
* Devuelve el campo sobre el cuál se hace el join entre dos tablas.
*
* PRE: existe un Join entre las tablas 'tabla1' y 'tabla2'.
*/
const NombreCampo& campoJoin(const NombreTabla& tabla1, const NombreTabla& tabla2) const;
/**
* Genera un Join entre dos tablas de la base de datos, sobre el 'campo' especificado.
*
* PRE: idem especificación TAD Driver :: generarVistaJoin
*/
void generarVistaJoin(const NombreTabla& tabla1, const NombreTabla& tabla2, const NombreCampo& campo);
/**
* Borra un join de la base de datos.
*
* PRE: existe un Join entre las tablas 'tabla1' y 'tabla2'.
*/
void borrarVistaJoin(const NombreTabla& tabla1, const NombreTabla& tabla2);
/**
* Devuelve el resultado de un join.
*
* PRE: existe un Join entre las tablas 'tabla1' y 'tabla2'.
*/
aed2::Conj<Registro> vistaJoin(const NombreTabla& tabla1, const NombreTabla& tabla2);
private:
/************************************************************************
* TODO: Va a ser necesario instanciar privadamente el Modulo principal *
* con el cuál interactuar. Además, pueden declarar todas las *
* funciones auxiliares que les hagan falta. *
************************************************************************/
BaseDatos BD;
}; // class Driver
}; // namespace aed2
#endif // DRIVER_H_