]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/tipo1_bplus_main.c
un poco mas de B+
[z.facultad/75.06/emufs.git] / emufs / tipo1_bplus_main.c
1 #include <stdio.h>
2 #include <string.h>
3 #include "emufs.h"
4 #include "tipo1.h"
5 #include "indices.h"
6 #include "indice_bplus.h"
7 int no_esta(int num, int* vec, int len)
8 {
9         int i, res;
10         res = -1;
11         for(i=0; i<len; i++)
12                 if ( vec[i] == num ) res = 0;
13         return res;
14 }
15                 
16
17 void ver_arbol(EMUFS *emu)
18 {
19         NODO_B_PLUS *nodo;
20         int num_nodo, num_nodo_ant,i, tecla;
21         num_nodo =0;
22         num_nodo_ant=0;
23         while ( tecla != -1){
24                 nodo = b_plus_leer_nodo(emu->indices, num_nodo);
25                 printf("NODO: (hijo)clave\n");
26                 printf("Nivel: %d\n", nodo->nivel);
27                 for (i=0; i<nodo->cant_claves; i++)
28                         printf("(%d)%d", nodo->hijos[i], nodo->claves[i]);
29                 printf("(%d)",nodo->hijos[i]);
30                 printf("\n");
31                 printf("Ingrese proximo nodo a explorar, o -1 para salir: ");
32                 scanf("%d",&tecla);
33                 printf("%d\n",tecla);
34                 if (tecla == 0){ 
35                         num_nodo = 0;
36                         continue;
37                 }                       
38                 if ( tecla == nodo->hijos[nodo->cant_claves] && nodo->nivel == 0){
39                         num_nodo = nodo->hijos[nodo->cant_claves];
40                         continue;
41                 }
42                 if ( (no_esta(tecla, nodo->hijos, nodo->cant_claves+1) == -1)|| nodo->nivel == 0) {
43                         num_nodo = num_nodo_ant;
44                         printf("El nodo no existe o es nivel cero\n");
45                 }
46                 else num_nodo_ant = num_nodo = tecla;
47                 b_plus_destruir_nodo(nodo);
48         }
49 }       
50
51
52 char* cargar_registro(char* texto_ini,int len_ini, CLAVE clave, char *texto_fin, int len_fin)
53 {
54         char *reg;
55         reg = (char*)malloc(len_ini+sizeof(CLAVE)+len_fin+1); /* +1 para el \0 */
56         memcpy(reg, texto_ini, len_ini);
57         memcpy(reg+len_ini, &clave, sizeof(CLAVE));
58         strcpy(reg+len_ini+sizeof(CLAVE), texto_fin);
59         return reg;
60 }
61
62
63 void imprimir_reg(char* reg, int off, int len)
64 {
65         CLAVE clave;
66         int i;
67         memcpy(&clave, reg+off, sizeof(CLAVE));
68         printf("CLAVE = %d\n", clave.i_clave);
69         printf("REGISTRO =");
70         for(i=0; i<len; i++) printf("%c",reg[i]);
71                 printf("\n");
72         printf("TAMANIO REGISTRO = %d\n\n", len);
73 }
74
75
76
77 int main (int argc,char* argv[])
78 {
79         CLAVE clave;
80         char *texto, *texto2;
81         char *r;
82         int tecla, j, cb;
83         EMUFS *emu;
84         int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
85         EMUFS_REG_SIZE len, size;
86         int err=0, i;
87         INDICE_DATO dato;
88         B_PLUS_KEYBUCKET *v;    
89         INDEX_DAT q,query,prekey,postkey;
90         
91         texto = "PARTE COSNSTANTE, clave =";
92         emu = emufs_crear("test",T4,512,0);
93         if (emu == NULL) {
94                 printf("No se pudo crear EMUFS\n");
95                 return 1;
96         }
97         if( emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo, 0) != 1){
98                 PERR("INDICE ROTO");
99                 emufs_destruir(emu);
100                 return 1;
101         }
102         
103         
104 /*REGISTRO 1*/  
105         clave.i_clave = 77;     
106         texto2="termina el texto re bonito 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_tipo1_insertar_ordenado(emu, r, len, &err);
111         PERR("REGISTRO 1 GRABADO");
112         free(r);
113
114 /*REGISTRO 2*/  
115         texto2="termina el texto re bonito pero mas largo CLAVE = 90";
116         clave.i_clave = 90;     
117         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
118         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
119         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
120         emufs_tipo1_insertar_ordenado(emu, r, len, &err);
121         PERR("REGISTRO 2 GRABADO");
122         free(r);
123
124 /*REGISTRO 3*/  
125         texto2="Este es el fin del registro tres, puse tres en numero para que sea mas largo el texto CLAVE = 95";
126         clave.i_clave = 95;     
127         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
128         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
129         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
130         emufs_tipo1_insertar_ordenado(emu, r, len, &err);
131         PERR("REGISTRO 3 GRABADO");
132         free(r);
133         
134 /*REGISTRO 4*/  
135         texto2="REGISTRO CUATRO CLAVE = 99";
136         clave.i_clave = 99;     
137         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
138         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
139         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
140         emufs_tipo1_insertar_ordenado(emu, r, len, &err);
141         PERR("REGISTRO 4 GRABADO");
142         free(r);
143
144 /*REGISTRO 5    */
145         texto2="el quinto registro tiene un largo promedio como para entrar en el bloque CLAVE = 102";
146         clave.i_clave = 102;    
147         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
148         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
149         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
150         emufs_tipo1_insertar_ordenado(emu, r, len, &err);
151         PERR("REGISTRO 5 GRABADO");
152         free(r);
153
154 /*REGISTRO 6   */       
155         texto2="El registro 6 no entra CLAVE = 93";
156         clave.i_clave = 93;     
157         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
158         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
159         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
160         emufs_tipo1_insertar_ordenado(emu, r, len, &err);
161         PERR("REGISTRO 6 GRABADO");
162         free(r);
163
164 /*REGISTRO 7    */
165         texto2="SETPTIMO REGISTRO, lo inserto donde entre carajo2ooooooooooooooooooCLAVE = 80";
166         clave.i_clave = 80;     
167         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
168         imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
169         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
170         emufs_tipo1_insertar_ordenado(emu, r, len, &err);
171         PERR("REGISTRO 7 GRABADO");
172         free(r);
173
174
175
176 clave.i_clave = 93;
177 emufs_tipo1_eliminar_ordenado(emu, clave, dato);
178 clave.i_clave = 99;
179 emufs_tipo1_eliminar_ordenado(emu, clave, dato);
180 clave.i_clave = 95;
181 emufs_tipo1_eliminar_ordenado(emu, clave, dato);
182 clave.i_clave = 77;
183 emufs_tipo1_eliminar_ordenado(emu, clave, dato);
184 clave.i_clave = 80;
185 emufs_tipo1_eliminar_ordenado(emu, clave, dato);
186
187 PERR("REGISTROS ELIMINADOS");
188
189 /*
190 PERR("LEYENDO REGISTRO");
191 clave.i_clave = 80;
192 r = emufs_tipo1_leer_registro_plus(emu, clave, &size, &err);
193
194 imprimir_reg(r, strlen(texto), size);
195 free(r);
196 */
197
198 PERR("INSERTANDO REGISTROS");
199 for ( i=0; i<100; i++){
200         texto2="SETPTIMO REGISTRO, lo inserto donde entre carajo2ooooooooooooooooooCLAVE = 80";
201         srandom(i);
202         clave.i_clave = random() % 32767;       
203         r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
204         len = strlen(texto)+strlen(texto2)+sizeof(CLAVE);
205         emufs_tipo1_insertar_ordenado(emu, r, len, &err);
206         free(r);
207 }
208 /*
209 query.clave.i_clave = 11171;
210 if (b_plus_buscar_prepost(emu->indices,query.clave,0,&postkey,1) == -1) PERR("DAMN!");
211 printf ("La siguiente clave al 11171 es %i\n",postkey.clave.i_clave);
212
213 prekey.clave = emu->indices->obtener_menor_clave(emu->indices);
214 postkey.clave = emu->indices->obtener_mayor_clave(emu->indices);
215 printf ("El mayor es %i\n",postkey.clave.i_clave);
216 query = prekey;
217 while (emufs_indice_es_menor(emu->indices,query.clave,postkey.clave) && query.clave.i_clave != -1)
218 {
219         q = query;
220         query.clave = emu->indices->obtener_sig_clave(emu->indices,query.clave);
221         printf("Sig de %i es %i\n",q.clave.i_clave,query.clave.i_clave);
222 }
223 */
224 PERR("OBTENIENDO CLAVES");
225 cb = emufs_get_new_block_number(emu);
226 printf("cantidad de bloques en el archivo: %d\n", cb-1);
227 for (i=0; i<cb; i++){
228         v = emufs_tipo1_obtener_claves_raw(emu, i);
229         printf("claves del bloque %d\n", i);
230         for(j=0; j<v->cant_keys;j++)
231                 printf("v[%d] = %d\n", j, v->claves[j]);
232         free(v);
233 }
234
235 /*printf("Buscar el POST de:\n");
236 scanf("%d", &tecla);
237 clave.i_clave = tecla;
238 PERR("BUSCANDO");
239 b_plus_buscar_prepost(emu->indices, clave, 0, &query, 1);
240
241 printf("el post de %d, es %d\n", clave, query.clave);*/
242
243 emufs_destruir(emu);
244
245         return 0;
246         
247 }