Berkeley DB

50 views
Skip to first unread message

Joan Manuel

unread,
Apr 7, 2011, 11:58:06 PM4/7/11
to C Talks
Alguien sabe como instalar berkeley db en ubuntu y desp que tengo que
poner para compilar.

Joan Manuel

unread,
Apr 8, 2011, 12:31:48 AM4/8/11
to C Talks
listo lo pude solucionar.
Lo que si pido si alguien tiene algun tutorial o algo

Matías Dumrauf

unread,
Apr 8, 2011, 9:09:16 AM4/8/11
to c-t...@googlegroups.com
Joan Manuel, en la página oficial de Oracle tenés una guía con muy buenos ejemplos. El link que te paso es para la api de C puntualmente, que es la que vas a necesitar.



Cualquier cosa, consultá.

Saludos,

Matías Dumrauf


2011/4/8 Joan Manuel <joan.manu...@gmail.com>
--
Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a c-t...@googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
c-talks+u...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com.ar/group/c-talks?hl=es.

Joan Manuel

unread,
Apr 8, 2011, 2:10:19 PM4/8/11
to C Talks
Perfecto muchisimas gracias.

Estuve haciendo ejemplos pero tengo problemas con el borrado. La base
la creo lo mas bien y cargo y leo los registros.
Pero borro uno y desp quiero probar si esta bien borrado, y intento
leerlo y me lee otro.

que puede estar fallando?




On 8 abr, 10:09, Matías Dumrauf <matias.dumr...@gmail.com> wrote:
> Joan Manuel, en la página oficial de Oracle tenés una guía con muy buenos
> ejemplos. El link que te paso es para la api de C puntualmente, que es la
> que vas a necesitar.
>
> http://download.oracle.com/docs/cd/E17076_02/html/gsg/C/index.html
>
> Cualquier cosa, consultá.
>
> Saludos,
>
> Matías Dumrauf
>
> 2011/4/8 Joan Manuel <joan.manuel.doca...@gmail.com>

Matías Dumrauf

unread,
Apr 11, 2011, 12:22:18 PM4/11/11
to c-t...@googlegroups.com
Mmm, habría que ver el ejemplo puntal. Estás usando cursores? O directamente lo accedés por Key?

2011/4/8 Joan Manuel <joan.manu...@gmail.com>

Joan Manuel

unread,
Apr 11, 2011, 5:10:17 PM4/11/11
to C Talks
Estoy accediendo por key.

Mira lo tengo en una función el borrado.

La dbp esta declarada globalmente

void BorrarDato (long dni){

DBT key;
memset(&key, 0, sizeof(DBT));

key.data = &dni;
key.size = sizeof(long);

dbp->del(dbp,NULL,&key,0);

}



On 11 abr, 13:22, Matías Dumrauf <matias.dumr...@gmail.com> wrote:
> Mmm, habría que ver el ejemplo puntal. Estás usando cursores? O directamente
> lo accedés por Key?
>
> 2011/4/8 Joan Manuel <joan.manuel.doca...@gmail.com>

Matías Dumrauf

unread,
Apr 15, 2011, 8:59:13 AM4/15/11
to c-t...@googlegroups.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.manu...@gmail.com>

Matías Dumrauf

unread,
Apr 15, 2011, 9:03:46 AM4/15/11
to c-t...@googlegroups.com
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....@gmail.com>

Joan Manuel

unread,
Apr 15, 2011, 4:44:26 PM4/15/11
to C Talks
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>

Matías Dumrauf

unread,
Apr 20, 2011, 9:31:56 AM4/20/11
to c-t...@googlegroups.com
Hay algo que no me quedó claro de tu duda.


La secuencias serían:

1) Grabar -> Leer :-> OK.
2) Borrar -> Leer :-> EXPLOTA!

O sea, vos grabás un registro con la key X. Lo lee joya. Luego lo borrás (siempre refiriéndolo con la clave X). Finalmente lo querés volver a leer, referenciándolo por la clave X, como ya no existe cuando querés acceder a la estructura te rompe? O entendí mal.

De ser así, "estaría" bien que rompa. Justamente porque no existe un registro para esa clave. En ese caso, debería validar el db->get() para saber que retornó. Hacés un switch como antes y validás contra las macros detalladas acá: http://pybsddb.sourceforge.net/api_c/db_get.html


Mati
2011/4/15 Joan Manuel <joan.manu...@gmail.com>
Reply all
Reply to author
Forward
0 new messages