1 Conectar y desconectar

Siempre, cada vez que queramos usar MySQL en una de nuestras aplicaciones, deberemos realizar algunas tareas antes y después de acceder al servidor. Esto es bastante corriente cuando se trabaja con "motores", ya sean gráficos, de bases de datos, o de lo que sea.

Primero hay que verificar que el motor está presente y en ejecución. Después hay que establecer una conexión o canal que sirva para mantener un diálogo con el servidor. A partir de ahí podremos entablar comunicación con ese servidor, y cuando hayamos terminado, cerrar la conexión.

Iniciar y conectar con el servidor MySQL

Lo primero es iniciar un objeto del tipo MYSQL. Este objeto se usa por el API para mantener las variables de la conexión con el motor de MySQL.

Para iniciar uno de estos objetos usamos la función mysql_init(). Esta función sólo necesita un parámetro, que es un puntero a un objeto de tipo MYSQL. Si ya disponemos de un objeto de ese tipo podemos pasar su dirección como parámetro, y la función lo iniciará. Si no disponemos de tal objeto, pasaremos un puntero nulo y la función lo creará dinámicamente y nos devolverá un puntero al objeto.

Por ejemplo, usando un objeto dinámico:

MYSQL *myData;

// Intentar iniciar MySQL:
if(!(myData = mysql_init(0))) {
   // Imposible crear el objeto myData
   return 1;
}

Y usando un objeto estático:

MYSQL myData;

 // Iniciar MySQL:
 mysql_init((MYSQL*)&myData));

Generalmente trabajaremos con un objeto MYSQL dinámico, al menos en los ejemplos de este curso.

Establecer una conexión

Una vez hemos inicializado el objeto MYSQL, intentaremos establecer una conexión con el servidor. Para ello usaremos la función mysql_real_connect().

Esta función necesita muchos parámetros, concretamente ocho. Veamos qué significa cada uno de ellos:

  1. Un puntero a un objeto MYSQL, que previamente tendremos que haber iniciado con la función mysql_init().
  2. El nombre del ordenador donde se está ejecutando el servidor. Puede ser también una dirección IP. Si el servidor está ejecutándose en la misma máquina que la aplicación, este nombre puede ser "localhost", o simplemente, un puntero nulo.
  3. El nombre del usuario. En sistemas Unix puede ser un puntero nulo, para indicar el usuario actual. En Windows ODBC debe especificarse.
  4. La contraseña del usuario seleccionado.
  5. Base de datos por defecto. Puede ser NULL si no queremos usar una base de datos determinada.
  6. Número de puerto. Generalmente usaremos la constante MYSQL_PORT.
  7. Socket Unix. Usaremos NULL para conexiones locales.
  8. Opciones de cliente, normalmente 0, pero se puede usar una combinación de ciertos valores para activar algunas opciones. Ver sintaxis de mysql_real_connect().

Si no se puede establecer una conexión, mysql_real_connect() devuelve el valor NULL.

Al menos al principio usaremos conexiones locales para acceder a las bases de datos, aunque más tarde veremos que no hay problema para hacer conexiones a través de una red local o a través de Internet.

Crearemos un usuario para nuestros experimentos, que sólo tenga acceso total a la base de datos "prueba":

mysql> GRANT ALL ON prueba.* TO curso IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.16 sec)

Esto hace que los parámetros a usar sean más sencillos. Una llamada típica para acceso local puede ser:

   if(!mysql_real_connect(myData, NULL, "curso", "clave", "prueba", MYSQL_PORT, NULL, 0)) {
      // No se puede conectar con el servidor en el puerto especificado.
      cout << "Imposible conectar con servidor mysql en el puerto "
           << MYSQL_PORT << endl;
      mysql_close(myData);
      return 1;
   }

Cerrar

Cuando hayamos terminado de trabajar con las bases de datos cerramos la conexión con el motor de bases de datos, para eso usamos la función mysql_close().

 // Cerrar la conexión
 mysql_close(myData);

Cerrar la conexión tiene un doble propósito. Por una parte, se cierra la conexión abierta con el servidor mediante la función mysql_real_connect(). Por otra, se libera la memoria correspondiente al objeto MYSQL, si la función mysql_init() fue invocada con un puntero nulo.

Ahora ya estamos en condiciones de empezar a trabajar con bases de datos.

Reconexiones

Un problema frecuente cuando se trabaja con MySQL es que las conexiones abiertas que permanecen mucho tiempo inactivas pueden cerrarse de forma automática. Esto no es un defecto, sino algo habitual con conexiones de red. Las conexiones "débiles" (con poco tráfico) se cierran de forma automática pasado un tiempo determinado, para ahorrar recursos.

Esto pasa también con la consola de MySQL, pero al intentar nuevas consultas se realiza una reconexión automática. Esto no será así con nuestras aplicaciones, ya que si la conexión se cierra recibiremos un mensaje de error, y la conexión no se restablecerá.

En el API existe una función para verificar si la conexión sigue abierta y reconectar en caso necesario.

La función es mysql_ping(), y devuelve un valor cero si la conexión está activa.

   if(mysql_ping(&myData)) {
      cout << "Error: conexión imposible" << endl;
      mysql_close(&myData);
   }

Es recomendable hacer uso de esta función si existe la posibilidad de que la conexión haya estado inactiva durante mucho tiempo, por ejemplo, en aplicaciones Windows que pueden estar en segundo plano durante un tiempo indeterminado.