diff options
Diffstat (limited to 'src/analysis/db/misc')
-rw-r--r-- | src/analysis/db/misc/rlestr.c | 166 | ||||
-rw-r--r-- | src/analysis/db/misc/rlestr.h | 27 |
2 files changed, 102 insertions, 91 deletions
diff --git a/src/analysis/db/misc/rlestr.c b/src/analysis/db/misc/rlestr.c index 631b1e9..9986967 100644 --- a/src/analysis/db/misc/rlestr.c +++ b/src/analysis/db/misc/rlestr.c @@ -26,6 +26,7 @@ #include <endian.h> #include <malloc.h> +#include <sqlite3.h> #include <string.h> @@ -33,25 +34,6 @@ - -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> - -#include <time.h> -#include <unistd.h> - - - - - - - - - - - - /****************************************************************************** * * * Paramètres : str = représentation de chaîne à traiter. * @@ -180,8 +162,9 @@ int cmp_rle_string(const rle_string *s1, const rle_string *s2) /****************************************************************************** * * -* Paramètres : str = informations à constituer. [OUT] * -* fd = flux ouvert en lecture pour l'importation. * +* Paramètres : str = informations à constituer. [OUT] * +* fd = flux ouvert en lecture pour l'importation. * +* flags = éventuelles options de réception supplémentaires. * * * * Description : Importe la définition d'une chaîne de caractères. * * * @@ -191,23 +174,25 @@ int cmp_rle_string(const rle_string *s1, const rle_string *s2) * * ******************************************************************************/ -bool load_rle_string(rle_string *str, int fd) +bool recv_rle_string(rle_string *str, int fd, int flags) { -#if 0 uint32_t val32; /* Valeur sur 32 bits */ - ssize_t got; /* Quantité de données reçues */ + bool status; /* Bilan d'une opération */ - got = safe_recv(fd, &val32, sizeof(uint32_t), MSG_WAITALL); - if (got != sizeof(uint32_t)) return false; + str->data = NULL; + str->length = 0; + + status = safe_recv(fd, &val32, sizeof(uint32_t), MSG_WAITALL | flags); + if (!status) return false; - str->length = le32toh(val32); + str->length = be32toh(val32); if (str->length > 0) { str->data = (char *)malloc(str->length + 1); - got = safe_recv(fd, str->data, str->length + 1, MSG_WAITALL); - if (got != (str->length + 1)) + status = safe_recv(fd, str->data, str->length + 1, MSG_WAITALL | flags); + if (!status) { unset_rle_string(str); return false; @@ -216,7 +201,7 @@ bool load_rle_string(rle_string *str, int fd) str->data[str->length] = '\0'; } -#endif + return true; } @@ -224,8 +209,9 @@ bool load_rle_string(rle_string *str, int fd) /****************************************************************************** * * -* Paramètres : str = informations à sauvegarer. * -* fd = flux ouvert en écriture pour l'exportation. * +* Paramètres : str = informations à sauvegarer. * +* fd = flux ouvert en écriture pour l'exportation. * +* flags = éventuelles options d'envoi supplémentaires. * * * * Description : Exporte la définition d'une chaîne de caractères. * * * @@ -235,44 +221,70 @@ bool load_rle_string(rle_string *str, int fd) * * ******************************************************************************/ -bool store_rle_string(const rle_string *str, int fd) +bool send_rle_string(const rle_string *str, int fd, int flags) { -#if 0 - ssize_t got; /* Quantité de données reçues */ + bool status; /* Bilan d'une opération */ - got = safe_send(fd, (uint32_t []) { htole32(str->length) }, sizeof(uint32_t), MSG_WAITALL); - if (got != sizeof(uint32_t)) return false; + status = safe_send(fd, (uint32_t []) { htobe32(str->length) }, sizeof(uint32_t), MSG_MORE | flags); + if (!status) return false; if (str->length > 0) { - got = safe_send(fd, str->data, str->length + 1, MSG_WAITALL); - if (got != (str->length + 1)) return false; + status = safe_send(fd, str->data, str->length + 1, flags); + if (!status) return false; } -#endif + return true; } +/* ---------------------------------------------------------------------------------- */ +/* MANIPULATIONS AVEC UNE BASE DE DONNEES */ +/* ---------------------------------------------------------------------------------- */ +/****************************************************************************** +* * +* Paramètres : str = chaîne de caractères aux informations inutiles. * +* name = désignation personnalisée du champ dans la BD. * +* values = couples de champs et de valeurs à lier. [OUT] * +* count = nombre de ces couples. [OUT] * +* * +* Description : Constitue les champs destinés à une insertion / modification.* +* * +* Retour : Bilan de l'opération : succès ou non. * +* * +* Remarques : - * +* * +******************************************************************************/ +bool prepare_db_statement_for_rle_string(const rle_string *str, const char *name, bound_value **values, size_t *count) +{ + bound_value *value; /* Valeur à éditer / définir */ + *values = (bound_value *)realloc(*values, ++(*count) * sizeof(bound_value)); + value = &(*values)[*count - 1]; + value->name = name; + value->type = SQLITE_TEXT; + value->cstring = get_rle_string(str); + value->delete = SQLITE_STATIC; + return true; - - +} /****************************************************************************** * * -* Paramètres : str = informations à constituer. [OUT] * -* fd = flux ouvert en lecture pour l'importation. * -* flags = éventuelles options de réception supplémentaires. * +* Paramètres : str = chaîne de caractères aux informations inutiles. * +* name = désignation personnalisée du champ dans la BD. * +* values = tableau d'éléments à compléter. [OUT] * +* count = nombre de descriptions renseignées. [OUT] * * * -* Description : Importe la définition d'une chaîne de caractères. * +* Description : Décrit les colonnes utiles à une chaîne de caractères. * * * * Retour : Bilan de l'opération. * * * @@ -280,46 +292,26 @@ bool store_rle_string(const rle_string *str, int fd) * * ******************************************************************************/ -bool recv_rle_string(rle_string *str, int fd, int flags) +bool setup_load_of_rle_string(const rle_string *str, const char *name, bound_value **values, size_t *count) { - uint32_t val32; /* Valeur sur 32 bits */ - bool status; /* Bilan d'une opération */ - - str->data = NULL; - str->length = 0; - - status = safe_recv(fd, &val32, sizeof(uint32_t), flags); - if (!status) return false; - - str->length = be32toh(val32); - - if (str->length > 0) - { - str->data = (char *)malloc(str->length + 1); - - status = safe_recv(fd, str->data, str->length + 1, flags); - if (!status) - { - unset_rle_string(str); - return false; - } - - str->data[str->length] = '\0'; + *values = (bound_value *)realloc(*values, ++(*count) * sizeof(bound_value)); - } + (*values)[*count - 1].name = name; return true; + } /****************************************************************************** * * -* Paramètres : str = informations à sauvegarer. * -* fd = flux ouvert en écriture pour l'exportation. * -* flags = éventuelles options d'envoi supplémentaires. * +* Paramètres : str = chaîne de caractères à compléter. * +* name = désignation personnalisée du champ dans la BD. * +* values = tableau d'éléments à consulter. * +* count = nombre de descriptions renseignées. * * * -* Description : Exporte la définition d'une chaîne de caractères. * +* Description : Charge les valeurs utiles pour une chaîne de caractères. * * * * Retour : Bilan de l'opération. * * * @@ -327,17 +319,27 @@ bool recv_rle_string(rle_string *str, int fd, int flags) * * ******************************************************************************/ -bool send_rle_string(const rle_string *str, int fd, int flags) +bool load_rle_string(rle_string *str, const char *name, const bound_value *values, size_t count) { - bool status; /* Bilan d'une opération */ + const bound_value *value; /* Valeur à intégrer */ - status = safe_send(fd, (uint32_t []) { htobe32(str->length) }, sizeof(uint32_t), MSG_MORE | flags); - if (!status) return false; + value = find_bound_value(values, count, name); + if (value == NULL) return false; - if (str->length > 0) + switch (value->type) { - status = safe_send(fd, str->data, str->length + 1, flags); - if (!status) return false; + case SQLITE_TEXT: + set_rle_string(str, value->cstring); + break; + + case SQLITE_NULL: + set_rle_string(str, NULL); + break; + + default: + return false; + break; + } return true; diff --git a/src/analysis/db/misc/rlestr.h b/src/analysis/db/misc/rlestr.h index 2aa863f..7faafd0 100644 --- a/src/analysis/db/misc/rlestr.h +++ b/src/analysis/db/misc/rlestr.h @@ -30,6 +30,9 @@ #include <sys/types.h> +#include "../../../common/sqlite.h" + + /* Informations de base pour tout élément ajouté */ typedef struct _rle_string @@ -49,6 +52,8 @@ void init_rle_string(rle_string *, const char *); #define get_rle_string(rle) (rle)->data +#define is_rle_string_empty(rle) ((rle)->data == NULL) + /* Constitue une représentation de chaîne de caractères. */ void set_rle_string(rle_string *, const char *); @@ -58,25 +63,29 @@ void unset_rle_string(rle_string *); /* Effectue la comparaison entre deux chaînes de caractères. */ int cmp_rle_string(const rle_string *, const rle_string *); - - /* Importe la définition d'une chaîne de caractères. */ -bool load_rle_string(rle_string *, int); +bool recv_rle_string(rle_string *, int, int); /* Exporte la définition d'une chaîne de caractères. */ -bool store_rle_string(const rle_string *, int); +bool send_rle_string(const rle_string *, int, int); -#define is_rle_string_empty(rle) ((rle)->data == NULL) +/* --------------------- MANIPULATIONS AVEC UNE BASE DE DONNEES --------------------- */ +/* Définition du tronc commun pour les créations SQLite */ +#define SQLITE_RLESTR_CREATE(n) \ + n " TEXT" -/* Importe la définition d'une chaîne de caractères. */ -bool recv_rle_string(rle_string *, int, int); +/* Constitue les champs destinés à une insertion / modification. */ +bool prepare_db_statement_for_rle_string(const rle_string *, const char *, bound_value **, size_t *); -/* Exporte la définition d'une chaîne de caractères. */ -bool send_rle_string(const rle_string *, int, int); +/* Décrit les colonnes utiles à une chaîne de caractères. */ +bool setup_load_of_rle_string(const rle_string *, const char *, bound_value **, size_t *); + +/* Charge les valeurs utiles pour une chaîne de caractères. */ +bool load_rle_string(rle_string *, const char *, const bound_value *, size_t); |