Muchas gracias por la respuesta y por tu dedicación. Igual no me salto
ningun problema ahi asique el problema debe estar en otro lugar.
Si tenes tiempo mira aca esta el codigo de las funciones.
Estoy declarando la db globalmente, nose si eso tendra algo que ver.
Esa es la biblioteca que hice de berkeley. tiene para crear grabar
leer y borrar.
Funciona todo menos cuando borro y quiero leer algo ahi se caga todo.
Ponele que borro un registro y pongo para leerlo y me lee otro.
Si no tenes tiempo no te hagas drama ya me fijare si encuentro el
problema.
saludos
#define NOMBRE_SIZE 199
DB *dbp;
void CreaAbreBaseDeDatos (void)
{
u_int32_t flags;
int ret;
ret = db_create(&dbp, NULL, 0);
if (ret != 0) return;
flags = DB_CREATE;
ret = dbp->open(dbp, NULL, "my_db.db", NULL, DB_BTREE, flags, 0);
if (ret != 0 )
{
if (dbp != NULL) dbp->close(dbp, 0);
}
}
int GrabarBaseDeDatos(long dni,char* nombre)
{
DBT key, data;
int ret;
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = &dni;
key.size = sizeof(long);
data.data = nombre;
data.size = strlen(nombre) + 1;
ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE);
if (ret == DB_KEYEXIST) {
printf("\n Key ya existente");
return(0);
}
return(1);
}
void LeerBaseDeDatos (long dni)
{
DBT key, data;
char nombre[NOMBRE_SIZE +1];
int ret;
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = &dni;
key.size = sizeof(long);
data.data = nombre;
data.ulen = NOMBRE_SIZE + 1;
data.flags = DB_DBT_USERMEM;
ret=dbp->get(dbp, NULL, &key, &data, 0);
printf("%s\n",nombre);
}
void BorrarDato (long dni){
int errcode;
DBT key;
memset(&key, 0, sizeof(DBT));
key.data = &dni;
key.size = sizeof(long);
if (errcode = dbp->del(dbp,NULL,&key,0)){
switch (errcode) {
case DB_LOCK_DEADLOCK:
puts("The operation was selected to resolve a deadlock.");
case DB_SECONDARY_BAD:
puts("A secondary index references a nonexistent primary
key.");
case EACCES:
puts("An attempt was made to modify a read-only
database.");
case EINVAL:
puts("An invalid flag value or parameter was specified.");
case DB_RUNRECOVERY:
puts("Catastrophic error has occurred.");
}
}
}
On 15 abr, 10:03, Matías Dumrauf <
matias.dumr...@gmail.com> wrote:
> *Referencia:*
http://pybsddb.sourceforge.net/api_c/db_del.html
>
> Validalo de la siguiente manera para corroborar si hubo un success en la
> operación:
>
> int errcode;
>
> if (errcode = dbp->del(dbp,NULL,&key,0)){
>
> switch (errcode) {
>
> case DB_LOCK_DEADLOCK:
>
> puts("The operation was selected to resolve a deadlock.");
>
> case DB_SECONDARY_BAD:
>
> puts("A secondary index references a nonexistent primary key.");
>
> case EACCES:
>
> puts("An attempt was made to modify a read-only database.");
>
> case EINVAL:
>
> puts("An invalid flag value or parameter was specified.");
>
> case DB_RUNRECOVERY:
>
> puts("Catastrophic error has occurred.");
>
> }
> }
>
> Como todas las operaciones retornan 0 (cero) en caso de éxito, y el if
> pregunta por distinto de cero, te asegurás de hacer el switch *sólamente* si
> ocurrió un error.
>
> Mati
>
> 2011/4/15 Matías Dumrauf <
matias.dumr...@gmail.com>
>
>
>
>
>
>
>
> > Estuve algo complicado de tiempos en el laburo, perdona la tardanza.
>
> > Que raro. Doy por sentado que estás abriendo bien la DB.
>
> > Joan, acostumbrate a validar los códigos de error devueltos. De esta
> > manera, te es más simple detectar bugs y debuggear una aplicación. En tu
> > ejemplo, sabés que el error está en db->del, pero es una aplicación muy
> > grande (como ser, un tp de operativos) podrías perder tiempo ;).
>
> > Vamos a ver que error code te devuelve la operación. Hace lo siguiente:
>
> > int errcode = dbp->del(dbp,NULL,&key,0);
>
> > switch (errcode) {
>
> > case DB_LOCK_DEADLOCK:
> > puts("The operation was selected to resolve a deadlock.");
> > case DB_SECONDARY_BAD:
> > puts("A secondary index references a nonexistent primary key.");
> > case EACCES:
> > puts("An attempt was made to modify a read-only database.");
> > case EINVAL:
> > puts("An invalid flag value or parameter was specified.");
>
> > }
>
> > Decime por donde salió.
>
> > Mati
>
> > 2011/4/11 Joan Manuel <
joan.manuel.doca...@gmail.com>