/* Creamos un handler EMUFS, luego un Indice B+ y testing... */
EMUFS *emu = emufs_crear("fact",T1,512,0);
-emufs_agregar_indice(emu,"nrofact",IND_PRIMARIO,IND_B_PLUS,IDX_INT,16,tam_nodo);
+emufs_agregar_indice(emu,"nrofact",IND_PRIMARIO,IND_B_PLUS,IDX_INT,16,tam_nodo, 0);
printf("\nTam Nodo: %i Size Claves: %i Size_Hijos: %i\n",emu->indices->tam_bloque,emu->indices->size_claves,emu->indices->size_hijos);
for (i=1;i<34;i = i*2)
querydata.clave.i_clave = 4;
querydata.num_bloque = 0; /* al pedo */
exitcode = b_plus_existe_clave(emu->indices,&querydata,0);
-if (exitcode == 1) printf("El nodo hoja donde esta la clave %i es %i\n",querydata.clave.i_clave,querydata.num_bloque);
+if (exitcode == 1) printf("El nodo hoja donde esta la clave %i es %ld\n",querydata.clave.i_clave,querydata.num_bloque);
printf("Exit Code del Buscar Clave: %i\n",exitcode);
querydata.clave.i_clave = 4;
if ((exitcode = b_plus_buscar_prepost(emu->indices,querydata.clave,0,&postkey,1)) == -1)
printf("Busque una clave mayor o igual a la mas grande del arbol\n");
-printf("El Sucesor de la clave %i es %i cuyo hijo es %i\n",querydata.clave.i_clave,postkey.clave.i_clave,postkey.num_bloque);
+printf("El Sucesor de la clave %i es %i cuyo hijo es %ld\n",querydata.clave.i_clave,postkey.clave.i_clave,postkey.num_bloque);
if ((exitcode = b_plus_buscar_prepost(emu->indices,querydata.clave,0,&prekey,0)) == -1)
printf("Busque una clave menor o igual a la mas chica del arbol\n");
-printf("El Predecesor de la clave %i es %i cuyo hijo es %i\n",querydata.clave.i_clave,prekey.clave.i_clave,prekey.num_bloque);
+printf("El Predecesor de la clave %i es %i cuyo hijo es %ld\n",querydata.clave.i_clave,prekey.clave.i_clave,prekey.num_bloque);
/*exitcode = emufs_b_plus_reemplazar_clave(emu->indices,querydata.clave,prekey);*/
/*querydata.clave.i_clave = 32;
return 0;
}
-int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque)
+int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset)
{
INDICE *tmp;
int error=0;
/* Creo el nuevo indice */
PERR("Creando indice\n");
- tmp = emufs_indice_crear(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque);
+ tmp = emufs_indice_crear(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque, str_offset);
/* Guardo la info del indice para poder abrir despues el archivo */
guardar_indice(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque);
/** muestra estadisticas, para debug. */
int debug_ver_estadisticas(EMUFS *emu);
-int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque);
+int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset);
INDICE_DATO *emufs_buscar_registros(EMUFS *emu, char *indice, char *data, int *cant);
#include "indice_b.h"
#include "indice_bplus.h"
-INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque)
+INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset)
{
int len;
INDICE *tmp;
}
tmp->offset = offset;
+ tmp->str_offset = str_offset;
tmp->sig = NULL;
tmp->size_claves = 0;
tmp->size_hijos = 0;
{
CLAVE k;
int error;
+ int c;
+ char *ptr;
switch (idx->tipo_dato) {
case IDX_FLOAT:
k.i_clave = *((int *)(data+idx->offset));
break;
case IDX_STRING:
+ /* Tengo que buscar donde empieza el campo */
+ ptr = data + idx->offset;
+ c = idx->str_offset;
+
+ while (c) {
+ if ((*ptr) == '\0') c--;
+ ptr++;
+ }
error = 0;
- PERR(idx->nombre);
- PERR(data+idx->offset);
+ fprintf(stderr, "%s: ========> %s\n", idx->nombre, ptr);
k.i_clave = idx->emu_string->grabar_registro(idx->emu_string,
- data+idx->offset,
- strlen(data+idx->offset)+1,
+ ptr,
+ strlen(ptr)+1,
&error
);
}
case IDX_STRING:
error = 0;
sc1 = idx->emu_string->leer_registro(idx->emu_string, c1, &dummy, &error);
+ if (sc1 == NULL) return 0;
error = 0;
sc2 = idx->emu_string->leer_registro(idx->emu_string, c2, &dummy, &error);
+ if (sc2 == NULL) {
+ free(sc2);
+ return 0;
+ }
/* Salteo el caracter que indica si la clave en temporal */
a = b = 0;
if (*sc1 == '*') a=1;
INDICE_TIPO_DATO tipo_dato; /**< Tipo de dato a manejar */
INDICE_FUNCION funcion; /**< Funcion del indice */
int offset; /**< Offset desde el inicio del dato hasta el lugar donde esta la clave */
+ int str_offset; /**< Si el campo es de string, aca va el numero de \0 que me tengo que saltar */
unsigned int tam_bloque; /**< Tamaño del bloque (nodo). Deber set multiplo de 512! */
/******NICO********/
* \param offset Desplazamiento de la clave dentro del dato
* \param tam_bloque Tamaño del bloque (nodo) del arbol
*/
-INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned tam_bloque);
+INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned tam_bloque, int str_offset);
/** Destruye un indice
*
CLAVE clave;
int i;
memcpy(&clave, reg+off, sizeof(CLAVE));
- printf("CLAVE = %d\n", clave);
+ printf("CLAVE = %d\n", clave.i_clave);
printf("REGISTRO =");
for(i=0; i<len; i++) printf("%c",reg[i]);
printf("\n");
EMUFS *emu;
int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
EMUFS_REG_SIZE len;
- int err=0, i;
+ int err=0;
texto = "PARTE COSNSTANTE, clave =";
emu = emufs_crear("test",T1,512,0);
- emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo);
+ emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo, 0);
/*REGISTRO 1*/
CLAVE clave;
int i;
memcpy(&clave, reg+off, sizeof(CLAVE));
- printf("CLAVE = %d\n", clave);
+ printf("CLAVE = %d\n", clave.i_clave);
printf("REGISTRO =");
for(i=0; i<len; i++) printf("%c",reg[i]);
printf("\n");
texto2= "FIN DE REGISTRO DE LONG CONSTANTE LO HAGO MAS LARGO PARA PROBAR CUANDO SE PARTE UN BLOQUE";
printf("TAMANIO DE LOS REGISTROS = %d\n",strlen(texto)+sizeof(CLAVE)+strlen(texto2));
emu = emufs_crear("test",T3,512,strlen(texto)+sizeof(CLAVE)+strlen(texto2));
- emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo);
+ emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo, 0);
/*REGISTRO 1*/
tmp->fp = emufs_crear("articulos", param->tipo_arch_art, param->tam_bloque_art, sizeof(t_Articulo));
/* Agrego los indices */
PERR("Voy a agregar un indice");
- emufs_agregar_indice(tmp->fp, "presentacion", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, presentacion), 20480);
- emufs_agregar_indice(tmp->fp, "desc", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), 2048);
- emufs_agregar_indice(tmp->fp, "codigo", IND_PRIMARIO, IND_B, IDX_INT, 0, 512);
+ emufs_agregar_indice(tmp->fp, "presentacion", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), 512, 1);
+ emufs_agregar_indice(tmp->fp, "desc", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), 512, 0);
+ emufs_agregar_indice(tmp->fp, "codigo", IND_PRIMARIO, IND_B, IDX_INT, 0, 512, 0);
if (!tmp->fp) {
PERR("NO SE PUDO CREAR ARCHIVO ARTICULOS");
free(tmp);
form_agregar_widget(form, INPUT, "Desc. Articulo (nulo==Todos)", 50, "");
form_agregar_widget(form, INPUT, "Ingrese %", 8, "0");
+ werase(lista->win);
+ wrefresh(lista->win);
form_ejecutar(form, 2, 2);
por = form_obtener_valor_float(form, "Ingrese %");
* borrar sea capaz de eliminar solo el item que corresponde en las
* claves con repeticion
*/
+ PERR("=== MODIFICANDO ===");
+ fprintf(stderr, "Desc=%s , PVU=%s, Codigo=%d\n", articulo.desc, articulo.pvu, articulo.numero);
lst_articulos->fp->modificar_registro(lst_articulos->fp, k1, tmp, size, &error, datos[i]);
+ PERR("=== FIN ===");
}
}
if (datos) free(datos);
<emufs>
<articulos>
<fuente>articulos.xml</fuente>
- <datos tipo="3" bloque="512" />
+ <datos tipo="1" bloque="512" />
<indices>
<indice nombre="codigo" tipo="B" bloque="512" />
<indice nombre="desc" tipo="B" bloque="512" />
cant_items = 0;
}
tmp->fp = emufs_crear("facturas", param->tipo_arch_fact, param->tam_bloque_fact, sizeof(t_Factura)-sizeof(char *)-sizeof(t_Item*)+cant_items*sizeof(t_Item));
- emufs_agregar_indice(tmp->fp, "emision", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(factura, emision), 512);
- emufs_agregar_indice(tmp->fp, "numero", IND_PRIMARIO, IND_B, IDX_INT, 0, 512);
+ emufs_agregar_indice(tmp->fp, "emision", IND_EXAHUSTIVO, IND_B, IDX_STRING, STRUCT_OFFSET(factura, emision), 512, 0);
+ emufs_agregar_indice(tmp->fp, "numero", IND_PRIMARIO, IND_B, IDX_INT, 0, 512, 0);
tmp->fp_texto = emufs_crear("notas", param->tipo_arch_nota, param->tam_bloque_nota, 100);
for (node=inicio ; node ; node = node->next) {
if (node->type == XML_ELEMENT_NODE) {