Foros del Web » Programación para mayores de 30 ;) » C/C++ »

c y postgres

Estas en el tema de c y postgres en el foro de C/C++ en Foros del Web. Hola Estoy empezando con postgres y quiero crear algunas funciones en C que se conecten a la base de datos. El problema es que si ...
  #1 (permalink)  
Antiguo 22/04/2015, 09:16
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 22 años, 2 meses
Puntos: 0
c y postgres

Hola
Estoy empezando con postgres y quiero crear algunas funciones en C que se conecten a la base de datos.
El problema es que si lo pongo todo en la misma función, funciona correctamente, pero al querer crear funciones independientes, no lo logro. Me lío con los punteros y demás.
Este es el código por separado
Código:
PGconn *conexion;
PGresult *resultado;
int i,j;
printf("\nantes de la conexion\n");
conexion = PQsetdbLogin("192.168.1.120","5432",NULL,NULL,"postgres","postgres","clave");

if (PQstatus(conexion) != CONNECTION_BAD)
{
	resultado = PQexec(conexion, "select id from ejemplo");

	if (resultado != NULL && PGRES_TUPLES_OK == PQresultStatus(resultado))
		{
			for (i = PQntuples(resultado)-1; i >= 0; i--)
			{
				for (j = PQnfields(resultado)-1; j >= 0; j--)
						printf("%s\t",PQgetvalue(resultado,i,j));
				printf("\n");
			}
			PQclear(resultado);
		}
}

PQfinish(conexion);
return 0;
Lo que intento es una función que conecte y devuelva si la conexión ha sido ok o no, el valor de la conexión como parámetro y en el resto utilizar esa conexión, para luego crear funciones independientes de lectura, actualizacion y borrado.
Gracias
Un saludo
  #2 (permalink)  
Antiguo 22/04/2015, 09:38
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: c y postgres

¿Cómo estás intentando crear las funciones? Pon el código que te falla
  #3 (permalink)  
Antiguo 23/04/2015, 05:32
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 22 años, 2 meses
Puntos: 0
Respuesta: c y postgres

Gracias Eferion por tu atención. El código es el siguiente

Código:
int  Conexion_BD (char *dirIp, char *nombre_bd, char *usuario, char *password, PGconn *conexion )
{
	
  PGresult *res;
   int vvuelta;
   conexion = PQsetdbLogin(dirIp,"5432",NULL,NULL,nombre_bd,usuario,password);

	if (PQstatus(conexion) != CONNECTION_BAD)
      return 1;
  else {
  	PQfinish(conexion);
  	return 0;
  }

}
La llamada a la función sería:
Código:
error=Conexion_BD("192.168.1.120", "postgres", "postgres", pwd,conn );
Esto no me devuelve ningún error pero al ejecutar la siguiente ejecución, tarda un rato y luego da un core
Código:
resultado = PQexec(conn, "select id from ejemplo");
  #4 (permalink)  
Antiguo 23/04/2015, 05:43
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: c y postgres

Tienes un pequeño fallo de concepto.

"conexion", es un puntero. Esto quiere decir que cualquier cambio que hagas en la posición de memoria "apuntada" por esta variable se va a ver reflejado fuera de la función. PERO si dentro de la función haces que el puntero apunte a otra dirección de memoria... lo siento, este cambio no se va a ver reflejado fuera de la función.

Un ejemplo:

Código C:
Ver original
  1. void SiCambia( int* numero )
  2. {
  3.   *numero = 2;
  4. }
  5.  
  6. void NoCambia( int* numero );
  7. {
  8.   int temp;
  9.   numero = &temp;
  10.   *numero = 4;
  11. }
  12.  
  13. int main( )
  14. {
  15.   int numero = 0;
  16.   printf( "%d\n", numero );
  17.   SiCambia( &numero );
  18.   printf( "%d\n", numero );
  19.   NoCambia( &numero );
  20.   printf( "%d\n", numero );
  21. }

Como puedes ver, en la función "NoCambia" estoy cambiando la dirección del puntero y este cambio no se va a ver reflejado fuera. Este cambio es local y pertenece únicamente a la función.

Si quieres modificar una variable dentro de una función pasándola como argumento lo que haces es usar un puntero simple, luego si lo que buscas es modificar un puntero... tienes que preparar la función para que reciba un puntero doble. Si quieres modificar un puntero doble ... necesitarás un puntero triple... y te puedes imaginar el resto de la secuencia.

Con esto, tu función tendría que quedar tal que:

Código C:
Ver original
  1. int  Conexion_BD (char *dirIp, char *nombre_bd, char *usuario, char *password, PGconn **conexion )
  2. {
  3.   PGresult *res;
  4.   int vvuelta;
  5.   *conexion = PQsetdbLogin(dirIp,"5432",NULL,NULL,nombre_bd,usuario,password);
  6.  
  7.   if (PQstatus(*conexion) != CONNECTION_BAD)
  8.     return 1;
  9.   else {
  10.     PQfinish(*conexion);
  11.     return 0;
  12.   }
  13. }

El resto de argumentos no neces
Obviamente tienes que modificar también el código que llama a la función, pero de esta forma consigues que los cambios en el puntero se vean reflejados fuera de la función.
  #5 (permalink)  
Antiguo 23/04/2015, 06:46
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 22 años, 2 meses
Puntos: 0
Respuesta: c y postgres

Muchas gracias
Así funciona como yo quiero.
Me fallaba lo del puntero doble.
Muchas gracias de nuevo.
Un saludo

Etiquetas: funcion, int, postgres
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:48.