? ../ircu2.10.06/patch.dbh13 ? ../ircu2.10.06/patch.xmode2 ? ../ircu2.10.06/patch.dbh14 ? ../ircu2.10.06/patch.db31 ? ../ircu2.10.06/patch.db32 ? ../ircu2.10.06/patch.indent ? ../ircu2.10.06/patch.p9hispano ? ../ircu2.10.06/patch.db33 ? ../ircu2.10.06/patch.db34 ? ../ircu2.10.06/patch.db35 Index: ../ircu2.10.06/todo.jcea =================================================================== RCS file: /cvsroot/ircd/todo.jcea,v retrieving revision 1.13 diff -c -r1.13 todo.jcea *** ../ircu2.10.06/todo.jcea 1999/10/14 12:31:39 1.13 --- ../ircu2.10.06/todo.jcea 1999/10/15 14:30:13 *************** *** 1,7 **** ! 14/Oct/99 ! A la hora de buscar el registro que debemos ! enviar a un vecino, aprovechar el mmap() ! para buscarlo por subdivision. 14/Oct/99 Ahora que leer las BDD de disco es rapido (map()), --- 1,10 ---- ! 15/Oct/99 ! Poner los HASHES con mmap(), para no tener ! que hacer tantas operaciones cuando se reciben ! registros nuevos. ! ! ?Que ocurre si alguien borra el fichero o reduce ! su taman~o mientras tenemos el mmap? 14/Oct/99 Ahora que leer las BDD de disco es rapido (map()), Index: ../ircu2.10.06/ircd/s_debug.c =================================================================== RCS file: /cvsroot/ircd/ircd/s_debug.c,v retrieving revision 1.57 diff -c -r1.57 s_debug.c *** ../ircu2.10.06/ircd/s_debug.c 1999/10/15 13:24:27 1.57 --- ../ircu2.10.06/ircd/s_debug.c 1999/10/15 14:30:25 *************** *** 191,197 **** '-', #endif #endif ! 'D','B','3','4', #ifdef DB_ESNET '+', #else --- 191,197 ---- '-', #endif #endif ! 'D','B','3','5', #ifdef DB_ESNET '+', #else Index: ../ircu2.10.06/ircd/s_serv.c =================================================================== RCS file: /cvsroot/ircd/ircd/s_serv.c,v retrieving revision 1.39 diff -c -r1.39 s_serv.c *** ../ircu2.10.06/ircd/s_serv.c 1999/10/15 13:24:27 1.39 --- ../ircu2.10.06/ircd/s_serv.c 1999/10/15 14:30:27 *************** *** 1537,1542 **** --- 1537,1594 ---- } /* + ** Seek por bidivision + */ + int seek_db(struct tabla_en_memoria *mapeo, char *buf, unsigned long registro) + { + char *p, *p2, *plo, *phi; + unsigned long v; + + /* + ** Este caso especial es lo bastante + ** comun como para que se tenga en cuenta. + */ + if (!registro) + { + mapeo->puntero_r = mapeo->posicion; + return leer_db(mapeo, buf); + } + + plo = mapeo->posicion; + phi = plo + mapeo->len; + while (plo != phi) + { + /* + ** p apunta al principio del registro + ** p2 apunta al registro siguiente + */ + p2 = p = plo + (phi - plo) / 2; + while ((p >= plo) && (*p != '\n')) + p--; + if (p < plo) + p = plo; + if (*p == '\n') + p++; + while ((p2 < phi) && (*p2++ != '\n')); + /* + ** Estamos al principio de un registro + */ + v = atol(p); + if (v > registro) + phi = p; + else if (v < registro) + plo = p2; + else + { + plo = phi = p; /* Encontrado */ + break; + } + } + mapeo->puntero_r = plo; + return leer_db(mapeo, buf); + } + + /* * abrir_db * * Se mueve hasta un registro de la base de datos *************** *** 1563,1578 **** mapeo->puntero_r = mapeo->puntero_w = mapeo->posicion; if ((handle == -1) || (mapeo->posicion == MAP_FAILED)) return -1; ! do { ! cont = leer_db(mapeo, buf); ! if (cont == -1) ! { ! *buf = '\0'; ! return -1; ! } } - while (atol(buf) <= registro); return handle; } --- 1615,1626 ---- mapeo->puntero_r = mapeo->puntero_w = mapeo->posicion; if ((handle == -1) || (mapeo->posicion == MAP_FAILED)) return -1; ! cont = seek_db(mapeo, buf, registro); ! if (cont == -1) { ! *buf = '\0'; ! return -1; } return handle; } *************** *** 1820,1826 **** } ! static void corta_si_multiples_hubs(aClient *cptr, char que_bdd) { char buf[1024]; Dlink *lp; --- 1868,1874 ---- } ! static void corta_si_multiples_hubs(aClient *cptr, char que_bdd, char *mensaje) { char buf[1024]; Dlink *lp; *************** *** 1853,1860 **** if ((acptr != cptr) && find_conf_host(acptr->confs, acptr->name, CONF_HUB) != NULL) { ! sprintf_irc(buf, ! "BDD '%c' inconsistente. Resincronizando...", que_bdd); exit_client(acptr, acptr, &me, buf); goto corta; } --- 1901,1907 ---- if ((acptr != cptr) && find_conf_host(acptr->confs, acptr->name, CONF_HUB) != NULL) { ! sprintf_irc(buf, "BDD '%c' %s. Resincronizando...", que_bdd, mensaje); exit_client(acptr, acptr, &me, buf); goto corta; } *************** *** 1930,1936 **** ** Fin solucion temporal */ ! corta_si_multiples_hubs(NULL, que_bdd); sendto_ops("Solicitando actualizacion BDD '%c' " "a los nodos vecinos.", que_bdd); --- 1977,1983 ---- ** Fin solucion temporal */ ! corta_si_multiples_hubs(NULL, que_bdd, "inconsistente"); sendto_ops("Solicitando actualizacion BDD '%c' " "a los nodos vecinos.", que_bdd); *************** *** 2090,2096 **** db = 0; /* Nos curamos en salud; se la enviamos entera */ } ! db_file = abrir_db(db, db_buf, que_bdd, &mapeo); if (db_file == -1) return 0; /* Problemas con la DB */ do --- 2137,2143 ---- db = 0; /* Nos curamos en salud; se la enviamos entera */ } ! db_file = abrir_db(db + 1, db_buf, que_bdd, &mapeo); if (db_file == -1) return 0; /* Problemas con la DB */ do *************** *** 2147,2153 **** close(db_file); alarm(0); borrar_db(que_bdd); ! corta_si_multiples_hubs(cptr, que_bdd); /* ** Podemos enviar a 'sptr' tranquilos, porque el ** corte afectaria a todos los HUBs menos a --- 2194,2201 ---- close(db_file); alarm(0); borrar_db(que_bdd); ! sprintf_irc(db_buf, "borrada (%s)", sptr->name); ! corta_si_multiples_hubs(cptr, que_bdd, db_buf); /* ** Podemos enviar a 'sptr' tranquilos, porque el ** corte afectaria a todos los HUBs menos a