Foro de elhacker.net

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: joe2011 en 1 Marzo 2014, 13:16 pm



Título: Berkeley BD - Programación Linux
Publicado por: joe2011 en 1 Marzo 2014, 13:16 pm
Estimados amigos,

Estoy siguiendo el Manual de Programación en Linux de Kurt Wall y en su capítulo 10 muestra como trabajar con la base de datos de Berkeley. El caso es que el código que pongo a continuación no compila bien. Los fallos de compilación del código adjunto están en db_open y DB->close aunque linke a  
gcc abrir_db2.c -o abrir_db2 -lbd

abrir_db2.c: In function ‘main’:
abrir_db2.c:37:5: error: expected identifier or ‘(’ before ‘->’ token


Tampoco se cómo buscar por paginas mán de la Berkeley (si las tiene) sobre todo por averiguarr que versión tengo instalada y así intentar buscar algo de documentación para interaccionar desde C con ella. Al menos lo más básico, abrir, cerrar, añadir registros, etc.

Código
  1.  
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <errno.h>
  5. #include <fcntl.h>
  6. #include <db.h>
  7.  
  8. int main (void)
  9. {
  10. DB puntero_db; /* descriptor de base de datos */
  11. int valor_retornado;
  12.  
  13. valor_retornado = db_open("test.db", DB_BTREE, DB_CREATE, 0600, NULL, NULL, &puntero_db);
  14.  
  15. if (valor_retornado) {
  16. perror ("db_open");
  17. exit(EXIT_FAILURE);
  18. }
  19.  
  20. DB->close(puntero_db,0);
  21. exit(EXIT_SUCCESS);
  22.  
  23. return EXIT_SUCCESS;
  24. }
  25.  

Respecto a la Berkeley DB encontré esta página:http://docs.oracle.com/cd/E17076_02/html/api_reference/C/frame_main.html (http://docs.oracle.com/cd/E17076_02/html/api_reference/C/frame_main.html) pero tampoco funciona el código tomando estas funciones. Y esta otra https://bbs.archlinux.org/viewtopic.php?id=78032 (https://bbs.archlinux.org/viewtopic.php?id=78032) pero tampoco consigo nada, ya digo creo que necesitaría saber que Berkeley tengo instalada.

Me da la sensación que el libro en general es demasiado antiguo porque en capítulos anteriores, por ejemplo en el que habla de archivos, toca el sistema ext-2 y Debian 7, ya monta ext-4. El caso es que me da que en los próximos capítulos a los que estoy deseando llegar donde toca la manipulación de pantalla con ncurses, redes y demás me pueda encontrar con los mismos problemas. Quisiera que me dieras vuestra opinión al respecto y, si existe algún manual más moderno me lo comentéis.

Un saludo.


Título: Re: Berkeley BD - Programación Linux
Publicado por: do-while en 1 Marzo 2014, 21:10 pm
¡Buenas!

Tu no tienes un problema con GNU-Linux. El  problema lo tienes con la programación. Y el error te lo describe muy bien el compilador:
abrir_db2.c:37:5: error: expected identifier or ‘(’ before ‘->’ token

Eso mismo. Se espera un identificador antes de '->', y no miente, has puesto un tipo de dato, no el identificador de una variable.

Lee bien los mensajes de error.

¡Saludos!


Título: Re: Berkeley BD - Programación Linux
Publicado por: joe2011 en 1 Marzo 2014, 21:19 pm
Gracias por la respuesta tan escueta. Ya me di cuenta de eso pero falla aunque ponga puntero_db.

No obstante siguiendo http://docs.oracle.com/cd/E17076_02/html/index.html (http://docs.oracle.com/cd/E17076_02/html/index.html)

He modificado el código a lo siguiente:
Código
  1. #include <db.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <errno.h>
  5.  
  6.  
  7.  
  8. int main ( void )
  9. {
  10.  
  11. DB *dbp;           /* DB structure handle */
  12. u_int32_t flags;   /* database open flags */
  13. int ret;           /* function return value */
  14.  
  15. /* Initialize the structure. This
  16. * database is not opened in an environment,
  17. * so the environment pointer is NULL. */
  18. ret = db_create(&dbp, NULL, 0);
  19. if (ret != 0) {
  20. /* Error handling goes here */
  21. perror("db_create");
  22. exit(EXIT_FAILURE);
  23. }
  24.  
  25. /* Database open flags */
  26. flags = DB_CREATE;    /* If the database does not exist,
  27.                        * create it.*/
  28.  
  29. /* open the database */
  30. ret = dbp->open(dbp,        /* DB structure pointer */
  31.                NULL,       /* Transaction pointer */
  32.                "test.db", /* On-disk file that holds the database. */
  33.                NULL,       /* Optional logical database name */
  34.                DB_BTREE,   /* Database access method */
  35.                flags,      /* Open flags */
  36.                0600);         /* File mode (using defaults) */
  37. if (ret != 0) {
  38. /* Error handling goes here */
  39. perror ("db_open");
  40. exit(EXIT_FAILURE);
  41. }
  42.  
  43. dbp->close(dbp,0);
  44. return EXIT_SUCCESS;
  45. } /* ----------  end of function main  ---------- */
  46.  

En fin, gracias por la respuesta.


Título: Re: Berkeley BD - Programación Linux
Publicado por: do-while en 2 Marzo 2014, 21:05 pm
Gracias por la respuesta tan escueta. Ya me di cuenta de eso pero falla aunque ponga puntero_db.

 :D puntero_db no era un dato de tipo puntero (a no se que DB sea un typedef de un puntero de algun tipo de dato), asi que para acceder a la función de puntero_db no puedes utilizar el operador flecha, tienes que utilizar el operador punto.

¡Saludos!


Título: Re: Berkeley BD - Programación Linux
Publicado por: joe2011 en 3 Marzo 2014, 21:11 pm
Gracias, ya hice previamente la definicion
Código
  1. DB *puntero_db
  2.  

Pero bueno, ya comenté que encontre la solución en  http://docs.oracle.com/cd/E17076_02/html/index.html (http://docs.oracle.com/cd/E17076_02/html/index.html)
y estoy siguiendo ese tutorial junto con el Manual de Kurt Wall.

Por cierto, que me puedes decir respecto a la antigüedad de los libros y la existencia de manuales del estilo más actualizados.

Muchas gracias.


Título: Re: Berkeley BD - Programación Linux
Publicado por: do-while en 5 Marzo 2014, 11:01 am
Por cierto, que me puedes decir respecto a la antigüedad de los libros y la existencia de manuales del estilo más actualizados.

Sobre la antigüedad, ni idea, nunca los he usado ni los conozco. Y manuales de estilo tampoco ni idea. Aplica sentido comun. Indenta los bloques de codigo, los cuerpos de los bucles, cuerpos de las funciones, los campos de los struct o miembros de clases... da nombres coherentes a las variables y funciones. Vamos, que mas que llamarlo estilo se debería de llamar sentido comun para que tu código se pueda leer y entender tanto por ti como por otros.

¡Saludos!


Título: Re: Berkeley BD - Programación Linux
Publicado por: joe2011 en 6 Marzo 2014, 21:46 pm
Gracias.