Ressources informatiques

Ressources informatiques

Ressources informatiques

Charger un fichier CSV

Installer le connecteur C - MariaDB

adminX@serveurWebX:~$ su - root
Mot de passe :
root@serveurWebX:~# apt install libmariadbd-dev

Exemple de fichier CSV

root@serveurWebX:~# cat /tmp/test.csv
2;table jaune;30.1;1
3;chaise jaune;20.5;1

Donner le doit de charger un fichier à un utilisateur MariaDB

root@serveurWebX:~# mysql -u root -p
Enter password:
MariaDB [(none)]>  SHOW GRANTS FOR 'adminBaseMeuble1'@'localhost';
+-------------------------------------------------------------------------------------------------------------------------+
| Grants for adminBaseMeuble1@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `adminBaseMeuble1`@`localhost` IDENTIFIED BY PASSWORD '*BD885142404C127AC29793EE3FBB1FDB01D2B25F' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `meubleFournisseur`.* TO `adminBaseMeuble1`@`localhost`                         |
+-------------------------------------------------------------------------------------------------------------------------+
MariaDB [(none)]> GRANT FILE ON *.* TO 'adminBaseMeuble1'@'localhost';
MariaDB [(none)]>  SHOW GRANTS FOR 'adminBaseMeuble1'@'localhost';
+------------------------------------------------------------------------------------------------------------------------+
| Grants for adminBaseMeuble1@localhost                                                                                  |
+------------------------------------------------------------------------------------------------------------------------+
| GRANT FILE ON *.* TO `adminBaseMeuble1`@`localhost` IDENTIFIED BY PASSWORD '*BD885142404C127AC29793EE3FBB1FDB01D2B25F' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `meubleFournisseur`.* TO `adminBaseMeuble1`@`localhost`                        |
+------------------------------------------------------------------------------------------------------------------------+
MariaDB [(none)]> exit
Bye

Charger le fichier CSV dans la table meubleFournisseur avec une requête SQL

root@serveurWebX:~# mysql -u adminBaseMeuble1 -p meubleFournisseur
MariaDB [meubleFournisseur]>
MariaDB [(none)]> LOAD DATA INFILE '/tmp/test.csv' INTO TABLE meubleFournisseur.meuble FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' (meu_id,  meu_designation, meu_prix,  meu_fouId);
MariaDB [meubleFournisseur]> SELECT * FROM meuble;
+--------+-----------------+----------+-----------+
| meu_id | meu_designation | meu_prix | meu_fouId |
+--------+-----------------+----------+-----------+
|      2 | table jaune     |    30.10 |         1 |
|      3 | chaise jaune    |    20.50 |         1 |
|    123 | chaise verte    |    40.10 |         1 |
|    456 | chaise bleue    |    40.90 |         1 |
|   4401 | chaise rouge    |    50.10 |         2 |
|   5003 | table verte     |   500.00 |         3 |
+--------+-----------------+----------+-----------+
MariaDB [meubleFournisseur]> exit

Charger le fichier CSV dans la table meubleFournisseur en langage C

adminX@serveurWebX:~$ mysql -u adminBaseMeuble1 -p meubleFournisseur
MariaDB [meubleFournisseur]> DELETE FROM meuble;
MariaDB [meubleFournisseur]> SELECT * FROM meuble;
MariaDB [meubleFournisseur]> exit
/**
 * @file loadEnCMysql.c
 * @brief
 * compilation: gcc -o loadEnCMysql loadEnCMysql.c `mariadb_config --cflags --libs`
 * exécution : ./loadEnCMysql -u  -p 
 * Ce programme insère des données dans la table fournisseur de la base de données meubleFournisseur.
 * Il utilise les fonctions de la bibliothèque MySQL C API pour se connecter à la base de données,
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <mysql.h>

#define HOTE "localhost"
#define NOM_BASE "meubleFournisseur"

/* Fonction pour afficher l'usage du programme */
void usage(const char *prog_name) {
    fprintf(stderr, "Usage: %s -u <user> -p <password> \n", prog_name);
    exit(1);
}

int main(int argc, char *argv[]) {
    MYSQL *pMysql;
    MYSQL_STMT *stmt;
    MYSQL_BIND param[2];
    const char *sql = "LOAD DATA INFILE '/tmp/test.csv' INTO TABLE meubleFournisseur.meuble FIELDS TERMINATED BY ';' LINES TERMINATED BY '\\n' (meu_id,  meu_designation, meu_prix,  meu_fouId);";

    char *user = NULL, *password = NULL;
    int opt;

    // Analyser les arguments avec getopt
    while ((opt = getopt(argc, argv, "u:p:")) != -1) {
        switch (opt) {
            case 'u':
                user = optarg;  // Utilisateur de la base de données
                break;
            case 'p':
                password = optarg;  // Mot de passe
                break;
            default:
                usage(argv[0]);  // Afficher l'usage si un argument invalide est passé
        }
    }

    // Vérifier que tous les arguments nécessaires sont fournis
    if (user == NULL || password == NULL ) {
        usage(argv[0]);
    }

    /* Initialiser la structure MySQL */
    if ((pMysql = mysql_init(NULL)) == NULL) {
        fprintf(stderr, "mysql_init() échoué : %s\n", mysql_error(pMysql));
        return -1;
    }

    /* Se connecter à la base de données */
    if (mysql_real_connect(pMysql, HOTE, user, password, NOM_BASE, 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() échoué : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    /* Préparer la requête SQL */
    stmt = mysql_stmt_init(pMysql);
    if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) {
        fprintf(stderr, "mysql_stmt_prepare() échoué : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

       /* Exécuter la requête */
    if (mysql_stmt_execute(stmt) != 0) {
        fprintf(stderr, "mysql_stmt_execute() échoué : %s\n", mysql_error(pMysql));
        mysql_stmt_close(stmt);
        mysql_close(pMysql);
        return -1;
    }

    /* Fermer la requête préparée et la connexion à la base */
    mysql_stmt_close(stmt);
    mysql_close(pMysql);

    printf("Chargement réussie dans la base de données.\n");
    return 0;
}
            
adminX@serveurWebX:~$ adminX@serveurWebX:~$ gcc -o loadEnCMysql loadEnCMysql.c `mariadb_config --cflags --libs`
adminX@serveurWebX:~$ ./loadEnCMysql -u adminBaseMeuble1 -p bonjour
Chargement réussie dans la base de données.
adminX@serveurWebX:~$ mysql -u adminBaseMeuble1 -p meubleFournisseur
MariaDB [meubleFournisseur]> SELECT * FROM meuble;
+--------+-----------------+----------+-----------+
| meu_id | meu_designation | meu_prix | meu_fouId |
+--------+-----------------+----------+-----------+
|      2 | table jaune     |    30.10 |         1 |
|      3 | chaise jaune    |    20.50 |         1 |
+--------+-----------------+----------+-----------+
MariaDB [meubleFournisseur]> exit

Charger le fichier CSV dans la table meubleFournisseur avec une requête SQL sur un serveur distant

Sur le serveur distant hébergeant la base de données

Autoziser l'accès distant à la base de données

Remarque : modifiez si besoin l'adresse IP et le nom d'utilisateur. Dans l'exemple ci-après le serveur à pir adresse IP 192.168.56.51 et la machine client à pour adresse IP 192.168.56.11.

Créez un utilisateur distant avec une clé RSA pour le téléchargement du fichier .csv
Créez l'utilisateur
adminX@serveurWebX:~$ su - root
root@serveurWebX:~# useradd -m -s /bin/bash x2
root@serveurWebX:~# passwd x2 
Créer de la clé RSA
C:\Users\johnDoe>ssh x2@192.168.56.51
x2@serveurWebX:~$ ssh-keygen -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/x2/.ssh/id_rsa):
Created directory '/home/x2/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/x2/.ssh/id_rsa
Your public key has been saved in /home/x2/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:HDdcmz5kqXMtnuntVd4VLUAJi5kJAFwmdJ9gDDn7ugw x2@serveurWebX
The key's randomart image is:
+---[RSA 4096]----+
| o=*B..   .o+.   |
|  +=.o o * o.=  .|
|   o  o * = * ...|
|  .    . o * . ..|
|   .    S o = . o|
|    .      + = .+|
|E  .        +   +|
| o.        . . . |
|  o.        ..o  |
+----[SHA256]-----+
x2@serveurWebX:~$  mv .ssh/id_rsa.pub  .ssh/authorized_keys

Sur la machine contenant le fichier .csv

Télécharger la clé privée

Remaque l'utilisateur local se nomme x et l'utilisateur distant se nomme x2. Modifiez si besoin les noms d'utilisateur et l'adresse IP.

scp x2@192.168.56.11:/home/x/.ssh/id_rsa ~/.ssh/
Modifier le programme

Remarque le fichier se nomme test.csv> et doit être présent dans le répertoire /tmp

/**
 * @file loadEnCMysqlDistance.c
 * @brief
 * compilation: gcc -o loadEnCMysqlDistance loadEnCMysqlDistance.c `mariadb_config --cflags --libs`
 * exécution : ./loadEnCMysqlDistance -u  -p 
 * Ce programme insère des données dans la table fournisseur de la base de données meubleFournisseur.
 * Il utilise les fonctions de la bibliothèque MySQL C API pour se connecter à la base de données,
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <mysql.h>

#define HOTE "192.168.56.51"
#define NOM_BASE "meubleFournisseur"

/* Fonction pour afficher l'usage du programme */
void usage(const char *prog_name) {
    fprintf(stderr, "Usage: %s -u  -p  \n", prog_name);
    exit(1);
}

int main(int argc, char *argv[]) {
    MYSQL *pMysql;
    MYSQL_STMT *stmt;
    MYSQL_BIND param[2];
    const char *sql = "LOAD DATA INFILE '/tmp/test.csv' INTO TABLE meubleFournisseur.meuble FIELDS TERMINATED BY ';' LINES TERMINATED BY '\\n' (meu_designation, meu_prix,  meu_fouId);";

    char *user = NULL, *password = NULL;
    int opt;

    // Analyser les arguments avec getopt
    while ((opt = getopt(argc, argv, "u:p:")) != -1) {
        switch (opt) {
            case 'u':
                user = optarg;  // Utilisateur de la base de données
                break;
            case 'p':
                password = optarg;  // Mot de passe
                break;
            default:
                usage(argv[0]);  // Afficher l'usage si un argument invalide est passé
        }
    }

    // Vérifier que tous les arguments nécessaires sont fournis
    if (user == NULL || password == NULL ) {
        usage(argv[0]);
    }

    /* Initialiser la structure MySQL */
    if ((pMysql = mysql_init(NULL)) == NULL) {
        fprintf(stderr, "mysql_init() échoué : %s\n", mysql_error(pMysql));
        return -1;
    }

    /* Se connecter à la base de données */
    if (mysql_real_connect(pMysql, HOTE, user, password, NOM_BASE, 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() échoué : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    /* Préparer la requête SQL */
    stmt = mysql_stmt_init(pMysql);
    if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) {
        fprintf(stderr, "mysql_stmt_prepare() échoué : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    system("scp /tmp/test.csv x2@192.168.56.51:/tmp/");

       /* Exécuter la requête */
    if (mysql_stmt_execute(stmt) != 0) {
        fprintf(stderr, "mysql_stmt_execute() échoué : %s\n", mysql_error(pMysql));
        mysql_stmt_close(stmt);
        mysql_close(pMysql);
        return -1;
    }

    /* Fermer la requête préparée et la connexion à la base */
    mysql_stmt_close(stmt);
    mysql_close(pMysql);

    printf("Chargement réussie dans la base de données.\n");
    return 0;
}
Compiler le programme
x@serveurX:~$ gcc -o loadEnCMysqlDistance loadEnCMysqlDistance.c `mariadb_config --cflags --libs`
Exécuter le programme
x@serveurX:~$ ./loadEnCMysqlDistance -u adminBaseMeuble2 -p bonjour
test.csv                                           100%   43    22.1KB/s   00:00
Chargement réussie dans la base de données.