if (idx->tipo_dato == IDX_STRING) {
/* Tengo que sacar el texto repetido del archivo de textos */
- PERR("Eliminando string duplicado");
idx->emu_string->borrar_registro(idx->emu_string, clave);
}
return 1;
B_NodoHeader header;
B_NodoEntry *claves;
char *nodo, *tmp;
+ int nodo_id;
/* Leo la raiz */
+ PERR("LEO LA RAIZ");
nodo = b_leer_nodo(idx, 0);
+ nodo_id = 0;
+ PERR("VAMOS");
while (nodo) {
b_leer_header(nodo, &header);
claves = b_leer_claves(nodo, &header);
while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, clave))) i++;
if ((i<header.cant) && (emufs_indice_es_igual(idx, claves[i].clave, clave))) {
ret = claves[i].dato;
+ b_grabar_nodo(idx, nodo_id, nodo);
free(nodo);
return ret;
} else {
tmp = nodo;
+ b_grabar_nodo(idx, nodo_id, nodo);
if (i == 0) {
nodo = b_leer_nodo(idx, header.hijo_izquierdo);
+ nodo_id = header.hijo_izquierdo;
} else {
nodo = b_leer_nodo(idx, claves[i-1].hijo_derecho);
+ nodo_id = claves[i-1].hijo_derecho;
}
free(tmp);
}
if (k.i_clave == -1) {
/* Creo uno nuevo */
error = 0;
- PERR("GRABADO REGISTRO NUEVO");
k.i_clave = idx->emu_mult->grabar_registro(idx->emu_mult,
leido,
cant*sizeof(INDICE_DATO)+sizeof(int),
if (k.i_clave == -1) PERR("ALGO NO GRABO BIEN!!");
} else {
/* Modifico el que ya existia! */
- PERR("MODIFICANDO REGISTRO EXISTENTE");
error = 0;
idx->emu_mult->modificar_registro(idx->emu_mult,
k.i_clave,
primera = (char *)idx->emu_string->leer_registro(idx->emu_string, array[0].clave, &size, &error);
for(i=1; i<header->cant; i++) {
actual = (char *)idx->emu_string->leer_registro(idx->emu_string, array[i].clave, &size, &error);
+ if (*actual == '*') {
+ free(actual);
+ continue;
+ }
resto = abreviar(primera, actual, &iguales);
/* Para que tenga sentido abreviar tengo que tener
* mas de 2 letras iguales, si no no gano nada y complica las cosas
primera = (char *)idx->emu_string->leer_registro(idx->emu_string, array[0].clave, &size, &error);
for(i=1; i<header->cant; i++) {
actual = (char *)idx->emu_string->leer_registro(idx->emu_string, array[i].clave, &size, &error);
+ if (*actual == '*') {
+ free(actual);
+ continue;
+ }
iguales = strtol(actual, &resto, 10);
if ((iguales > 0) && (*resto == '|')) {
fprintf(stderr, "%s %s %d\n", primera, actual, iguales);
{
int error;
CLAVE k;
+ char salvar[100];
if (idx == NULL) PERR("NULL INDEX!");
switch (idx->tipo_dato) {
* Ver de borrarla despues de usarla
*/
error = 0;
- PERR("VOY A GRABAR TEXTO EN ARCHIVO");
+ /* Le agrego un * para diferenciarla, porque no la tengo abreviada! */
+ /* Hack feo :-D */
+ sprintf(salvar, "*%s", data);
k.i_clave = idx->emu_string->grabar_registro(idx->emu_string,
- data,
- strlen(data)+1,
+ salvar,
+ strlen(salvar)+1,
&error
);
- fprintf(stderr, "GENERE CLAVE CON (%s) y estoy en ID=%d\n", data, k.i_clave);
}
return k;
{
char *sc1, *sc2; /* Si es IDX_STRING aca pongo los strings leidos */
EMUFS_REG_SIZE dummy; /* No me interesa el tamaño del string aca! */
- int error=0;
+ int error=0, a, b;
switch (idx->tipo_dato) {
case IDX_FLOAT:
case IDX_STRING:
sc1 = idx->emu_string->leer_registro(idx->emu_string, c1, &dummy, &error);
sc2 = idx->emu_string->leer_registro(idx->emu_string, c2, &dummy, &error);
- error = (strcmp(sc1, sc2) < 0);
+ /* Salteo el caracter que indica si la clave en temporal */
+ a = b = 0;
+ if (*sc1 == '*') a = 1;
+ if (*sc2 == '*') b = 1;
+ error = (strcmp(sc1+a, sc2+b) < 0);
free(sc1);
free(sc2);
return error;
{
char *sc1, *sc2; /* Si es IDX_STRING aca pongo los strings leidos */
EMUFS_REG_SIZE dummy; /* No me interesa el tamaño del string aca! */
- int error;
+ int error, a, b;
switch (idx->tipo_dato) {
case IDX_FLOAT:
sc1 = idx->emu_string->leer_registro(idx->emu_string, c1, &dummy, &error);
error = 0;
sc2 = idx->emu_string->leer_registro(idx->emu_string, c2, &dummy, &error);
- error = (strcmp(sc1, sc2) == 0);
- if (sc1) free(sc1);
- if (sc2) free(sc2);
+ /* Salteo el caracter que indica si la clave en temporal */
+ a = b = 0;
+ if (*sc1 == '*') a=1;
+ if (*sc2 == '*') b=1;
+ error = (strcmp(sc1+a, sc2+b) == 0);
+ free(sc1);
+ free(sc2);
return error;
}
return 0;
dato = emu->indices->existe_entrada(emu->indices, clave);
block = dato.bloque;
ID = dato.id;
+ PERR("Use indice");
} else {
/* Si no tengo claves, uso el campo entero para pasar un ID
* directamente.
*/
+ PERR("Use directo");
ID = clave.i_clave;
block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/
}
save = procesar_guardar_factura(&fact, lst_facturas, &size);
if (save != NULL) {
error = 0;
- id = tmp->fp->grabar_registro(tmp->fp, save, size, &error);
- if (fact.items) free(fact.items);
- if (fact.nota) free(fact.nota);
+ tmp->fp->grabar_registro(tmp->fp, save, size, &error);
+ if (fact.items) {
+ free(fact.items);
+ fact.items = NULL;
+ }
+ if (fact.nota) {
+ free(fact.nota);
+ fact.nota = NULL;
+ }
free(save);
}
}
fact = NULL;
k = emufs_indice_generar_clave_desde_valor(lst->fp->indices, (char*)&numero);
+ error = 0;
leo = lst->fp->leer_registro(lst->fp, k, &size, &error);
if (leo != NULL) {
fact = (t_Factura *)malloc(sizeof(t_Factura));
*/
free(leo);
k.i_clave = fact->reg_nota;
+ error = 0;
fact->nota = lst->fp_texto->leer_registro(lst->fp_texto, k, &size, &error);
}
char pvu[9];
} t_Item;
+/* Dejo los campos numericos al principio para mayor facilidad de parseo. */
typedef struct _facturas_ {
- /* Dejo los campos numericos al principio para mayor facilidad de parseo. */
int numero;
float procdoi;
int numero_remito;
char format[100];
t_Columna *col;
int y=0, i;
+ werase(lst->win);
while (fil) {
/* Si no entran mas filas salgo! */
if (y>lst->h) break;
typedef struct _fila_ {
t_Dato *datos; /**< Array de datos. Debe tener tantos items como columnas existan. */
struct _fila_ *sig; /**< Puntero a la siguiente fila */
- struct _file_ *ant; /**< Puntero a la fila anterior */
+ struct _fila_ *ant; /**< Puntero a la fila anterior */
} t_Fila;
/** Lista */