]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/tipo3_bplus_main.c
Fixeo bug en prepostkey, pero salto bug en insert_ordenado. Nico ahora lo mira, yo...
[z.facultad/75.06/emufs.git] / emufs / tipo3_bplus_main.c
1 #include <stdio.h>
2 #include <string.h>
3 #include "emufs.h"
4 #include "tipo3.h"
5 #include "indices.h"
6 #include "indice_bplus.h"
7
8         
9 int no_esta(int num, int* vec, int len)
10 {
11         int i, res;
12         res = -1;
13         for(i=0; i<len; i++)
14                 if ( vec[i] == num ) res = 0;
15         return res;
16 }
17                 
18
19 void ver_arbol(EMUFS *emu)
20 {
21         NODO_B_PLUS *nodo;
22         int num_nodo, num_nodo_ant,i, tecla;
23         num_nodo =0;
24         
25         while ( tecla != -1){
26                 nodo = b_plus_leer_nodo(emu->indices, num_nodo);
27                 printf("NODO: (hijo)clave\n");
28                 printf("Nivel: %d\n", nodo->nivel);
29                 for (i=0; i<nodo->cant_claves; i++)
30                         printf("(%d)%d", nodo->hijos[i], nodo->claves[i]);
31                 printf("(%d)",nodo->hijos[i]);
32                 printf("\n");
33                 printf("Ingrese proximo nodo a explorar, o -1 para salir: ");
34                 scanf("%d",&tecla);
35                 printf("%d\n",tecla);
36                 if (tecla == 0){ 
37                         num_nodo = 0;
38                         continue;
39                 }                       
40                 if ( tecla == nodo->hijos[nodo->cant_claves] && nodo->nivel == 0){
41                         num_nodo = nodo->hijos[nodo->cant_claves];
42                         continue;
43                 }
44                 if ( (no_esta(tecla, nodo->hijos, nodo->cant_claves+1) == -1)) {
45                         num_nodo = num_nodo_ant;
46                         printf("El nodo no existe o es nivel cero\n");
47                 }
48                 else num_nodo_ant = num_nodo = tecla;
49                 b_plus_destruir_nodo(nodo);
50         }
51 }       
52                 
53                 
54 char* cargar_registro(char* texto_ini,int len_ini, CLAVE clave, char *texto_fin, int len_fin)
55 {
56         char *reg;
57         reg = (char*)malloc(len_ini+sizeof(CLAVE)+len_fin+1); /* +1 para el \0 */
58         memcpy(reg, texto_ini, len_ini);
59         memcpy(reg+len_ini, &clave, sizeof(CLAVE));
60         strcpy(reg+len_ini+sizeof(CLAVE), texto_fin);
61         return reg;
62 }
63
64
65 void imprimir_reg(char* reg, int off, int len)
66 {
67         CLAVE clave;
68         int i;
69         memcpy(&clave, reg+off, sizeof(CLAVE));
70         printf("CLAVE = %d\n", clave.i_clave);
71         printf("REGISTRO =");
72         for(i=0; i<len; i++) printf("%c",reg[i]);
73                 printf("\n");
74         printf("TAMANIO REGISTRO = %d\n\n", len);
75 }
76
77
78
79 int main (int argc,char* argv[])
80 {
81         CLAVE clave;
82         char *texto, *texto2;
83         char *r;
84         EMUFS *emu;
85         int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
86         EMUFS_REG_SIZE len, size;
87         int err=0, i, res;
88         INDICE_DATO dato;
89         INDEX_DAT q,querydata,prekey,postkey;
90         B_PLUS_KEYBUCKET *v;
91         texto = "PARTE COSNSTANTE, clave =";
92         texto2= "FIN DE REGISTRO DE LONG CONSTANTE LO HAGO MAS LARGO PARA PROBAR CUANDO SE PARTE UN BLOQUE";
93         printf("TAMANIO DE LOS REGISTROS = %d\n",strlen(texto)+sizeof(CLAVE)+strlen(texto2));
94         emu = emufs_crear("test",T5,512,strlen(texto)+sizeof(CLAVE)+strlen(texto2));
95         if (emu == NULL) {
96                 printf("No se pudo crear EMUFS\n");
97                 return 1;
98         }
99         PERR("EMUFS CREADO");
100         if ( emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo, 0)!=1){
101                 PERR("INDICE ROTO");
102                 return 1;
103         }
104         
105 /*REGISTRO 1*/  
106         clave.i_clave = 77;     
107         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
108         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
109         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
110         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
111         PERR("REGISTRO 1 GRABADO");
112         free(r);
113
114 /*REGISTRO 2*/  
115         clave.i_clave = 90;     
116         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
117         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
118         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
119         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
120         PERR("REGISTRO 2 GRABADO");
121         free(r);
122
123 /*REGISTRO 3    */
124         clave.i_clave = 95;     
125         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
126         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
127         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
128         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
129         PERR("REGISTRO 3 GRABADO");
130         free(r);
131         
132 /*REGISTRO 4    */
133         clave.i_clave = 99;     
134         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
135         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
136         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
137         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
138         free(r);
139
140 /*REGISTRO 5    */
141         clave.i_clave = 102;    
142         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
143         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
144         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
145         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
146         PERR("REGISTRO 5 GRABADO");
147         free(r);
148
149 /*REGISTRO 6    */
150         clave.i_clave = 93;     
151         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
152         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
153         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
154         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
155         PERR("REGISTRO 6 GRABADO");
156         free(r);
157
158 /*REGISTRO 7    */
159         clave.i_clave = 80;     
160         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
161         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
162         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
163         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
164         PERR("REGISTRO 7 GRABADO");
165         free(r);
166
167 /*
168 clave.i_clave = 93;
169 emufs_tipo3_eliminar_ordenado(emu, clave, &err);
170 clave.i_clave = 99;
171 emufs_tipo3_eliminar_ordenado(emu, clave, &err);
172 */
173 printf("tam reg = %d\n", emu->tam_reg);
174 clave.i_clave = 77;
175 emufs_tipo3_eliminar_ordenado(emu, clave, dato);
176
177
178 clave.i_clave = 80;
179 emufs_tipo3_eliminar_ordenado(emu, clave, dato);
180
181 clave.i_clave = 102;
182 emufs_tipo3_eliminar_ordenado(emu, clave, dato);
183
184 clave.i_clave = 93;
185 emufs_tipo3_eliminar_ordenado(emu, clave, dato);
186
187 clave.i_clave = 95;
188 emufs_tipo3_eliminar_ordenado(emu, clave, dato);
189
190 clave.i_clave = 90;
191 emufs_tipo3_eliminar_ordenado(emu, clave, dato);
192
193         clave.i_clave = 80;     
194         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
195         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
196         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
197         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
198         PERR("REGISTRO 7 GRABADO");
199         free(r);
200 /*
201 q.clave.i_clave = 95;
202 q.num_bloque = 2;
203 res = emufs_b_plus_get_bloque(emu->indices, &q, 0);
204
205 printf("Num Bloque: %d\nResultado: %d\n", q.num_bloque, res);
206 */
207
208
209
210 /*
211 PERR("LEYENDO REGISTRO");
212 clave.i_clave = 80;
213 err = 0;
214 r = emufs_tipo3_leer_registro_plus(emu, clave, &size, &err);
215 if (err) PERR(" NO SE LEYO EL REGISTRO");
216
217 if (r)
218 imprimir_reg(r, strlen(texto), size);
219 */
220
221
222
223 for ( i=0; i<50; i++){
224         srandom(i);
225         clave.i_clave = random()%10000; 
226         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
227         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
228         emufs_tipo3_insertar_ordenado(emu, r, len, &err);
229         free(r);
230 }
231
232 /*v = emufs_tipo3_obtener_claves_raw(emu, 3);
233
234 printf("Las claves del bloque 3 son:\n");
235 for (i=0; i<v->cant_keys; i++)
236         printf("v[%d] = %d\n", i, v->claves[i]);*/
237
238
239
240
241 prekey.clave = emufs_b_plus_obtener_menor_clave(emu->indices);
242 postkey.clave = emufs_b_plus_obtener_mayor_clave(emu->indices);
243 querydata.clave = prekey.clave;
244 while (emufs_indice_es_menor(emu->indices,querydata.clave,postkey.clave))
245 {
246         q = querydata;
247         querydata.clave = emufs_b_plus_obtener_sig_clave(emu,querydata.clave);
248         printf("Sig de %i es %i\n",q.clave.i_clave,querydata.clave.i_clave);
249         /*printf("%i - ",querydata.clave.i_clave);*/
250 }
251 querydata.clave.i_clave = 533;  
252 b_plus_buscar_prepost(emu->indices,querydata.clave,0,&querydata,1);
253 printf("\nProx de 533 es %i\n",querydata.clave.i_clave);
254
255 ver_arbol(emu);
256
257 emufs_destruir(emu);
258
259         return 0;
260         
261 }