- Compilador GCC/Clang
- MySQL/MariaDB
- MySQL-C API
- Sólo en Linux - mysql-common
Si están en Windows
, la instalación de la base de datos agregará las librerías necesarias para el manejo a bajo nivel con el que nosotros trabajaremos. Además, se ocupará instalar el compilador.
Primero, debemos crear un archivo sql.c
o con algún nombre de su preferencia. Además agregamos librerías importantes.
#include <mysql/mysql.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
Crearemos una estructura de datos o struct
como es mejor conocido. De esta forma, podemos invocar el modelo de datos desde cualquier función teniendo así los datos asignados o asignar nuevos datos.
struct connection_details
{
char *server;
char *user;
char *password;
char *database;
};
Lo que haremos es crear una función separada que nos creará una conexión a la base de datos, y esta devolverá un pointer
o puntero
. Ahora, esto es básicamente una variable apuntando
al espacio o registro dentro de nuestro proceso que tiene la conexión a la base de datos. Con esto, nos evitamos tener que estar agregando el código de conexión constantemente.
MYSQL* mysql_connection_setup(struct connection_details mysql_details)
{
/* creating new instance */
MYSQL *conn = mysql_init(NULL);
/* connect to the database with the details */
if (!mysql_real_connect(conn, mysql_details.server, mysql_details.user,
mysql_details.password, mysql_details.database, 0, NULL, 0))
{
printf("Conection error : %s\n", mysql_error(conn));
exit(1);
}
return conn;
};
Ahora, para también evitarnos seguir agregando código para nuestras consultas, vamos a crear una función que se encarga solamente de eso. Lo que haremos, es pasarle como parámetros el puntero donde se ubica nuestra conexión y la consulta. Esta devolverá nuestro resultado exitoso.
MYSQL_RES* mysql_perform_query(MYSQL *conn, char *query)
{
if (mysql_query(conn, query))
{
printf("MySQL query error : %s\n", mysql_error(conn));
exit(1);
}
return mysql_use_result(conn);
};
Ya que tenemos lo anterior, podemos empezar con nuestro bloque principal de lógica. Creamos una función main()
y retornamos un 0.
int main()
{
return 0;
}
Ahora, debemos agregar lo esencial de la librería C API
. Básicamente son punteros que después se les asignará la posición de nuestra creación de instancias.
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
Tenemos que asignar valores a nuestras propiedas de la struct
para la información de la base de datos. Así podemos invocar las variables y sus valores en otras funciones.
// assign details to database
struct connection_details mysql_conn_string;
mysql_conn_string.server = "localhost";
mysql_conn_string.user = "operaciones";
mysql_conn_string.password = "prueba";
mysql_conn_string.database = "crud";
Procedemos a crear nuestra conexión invocando la función que hemos creado anteriormente, la cual devolverá el puntero y lo asignamos a nuestra instancia local de la función. La cual ahora estará apuntando a ese espacio de memoria.
// connecting to database with details
conn = mysql_connection_setup(mysql_conn_string);
Ahora sí, podemos realizar nuestra consulta. Como vemos a continuación, invocamos la función que creamos para realizar una consulta que tomará todos los nombres de nuestra tabla. Este se conoce como resultset
o una serie de resultados. De la misma forma, hemos creado un puntero que ahora apunta a esa serie de resultados retornados.
res = mysql_perform_query(conn, "select nombre from usuarios;");
Necesitamos ahora ver esa serie de resultados. Por lo que pasamos a recorrer todos los valores e imprimirlos a consola.
// display query
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) !=NULL)
{
printf("%s\n", row[0]);
}
Antes de terminar nuestra función, debemos ahora limpiar los punteros para después hacer otra consulta nueva.
// reset objects
mysql_free_result(res);
mysql_close(conn);
Ejecución del código
Información desde la base de datos