/* Chrysalide - Outil d'analyse de fichiers binaires
* rlestr.c - encodage par plage unique d'une chaîne de caractères
*
* Copyright (C) 2014 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* Chrysalide is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Chrysalide is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see .
*/
#include "timestamp.h"
#include
#include
#include
#include
#include "../../../common/io.h"
/******************************************************************************
* *
* Paramètres : timestamp = horodatage à initialiser. [OUT] *
* *
* Description : Obtient un horodatage initialisé au moment même. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void init_timestamp(timestamp_t *timestamp)
{
struct timespec info; /* Détails sur l'époque */
clock_gettime(CLOCK_REALTIME, &info);
*timestamp = info.tv_sec * 1000000 + info.tv_nsec / 1000;
}
/******************************************************************************
* *
* Paramètres : stamp = horodatage d'un élément à tester. *
* limit = horodatage en limite d'activité (incluse). *
* *
* Description : Définit si un horodatage est plus récent qu'un autre ou non. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
bool timestamp_is_younger(timestamp_t stamp, timestamp_t limit)
{
if (limit == TIMESTAMP_ALL_ACTIVE)
return true;
if (limit == TIMESTAMP_ALL_INACTIVE)
return false;
return (stamp <= limit);
}
/******************************************************************************
* *
* Paramètres : t1 = première chaîne à comparer. *
* t2 = seconde chaîne à comparer. *
* *
* Description : Effectue la comparaison entre deux horodatages. *
* *
* Retour : Résultat de la comparaison : -1, 0 ou 1. *
* *
* Remarques : - *
* *
******************************************************************************/
int cmp_timestamp(const timestamp_t *t1, const timestamp_t *t2)
{
int result; /* Bilan à retourner */
if (*t1 < *t2)
result = -1;
else if (*t1 > *t2)
result = 1;
else
result = 0;
return result;
}
/******************************************************************************
* *
* Paramètres : timestamp = 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'un horodatage. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool recv_timestamp(timestamp_t *timestamp, int fd, int flags)
{
uint64_t val64; /* Valeur sur 64 bits */
bool status; /* Bilan d'une opération */
status = safe_recv(fd, &val64, sizeof(uint64_t), MSG_WAITALL | flags);
if (!status) return false;
*timestamp = be64toh(val64);
return true;
}
/******************************************************************************
* *
* Paramètres : timestamp = informations à sauvegarer. *
* fd = flux ouvert en écriture pour l'exportation. *
* flags = éventuelles options d'envoi supplémentaires. *
* *
* Description : Exporte la définition d'un horodatage. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool send_timestamp(const timestamp_t *timestamp, int fd, int flags)
{
bool status; /* Bilan d'une opération */
status = safe_send(fd, (uint64_t []) { htobe64(*timestamp) }, sizeof(uint64_t), flags);
if (!status) return false;
return true;
}
/* ---------------------------------------------------------------------------------- */
/* MANIPULATIONS AVEC UNE BASE DE DONNEES */
/* ---------------------------------------------------------------------------------- */
/******************************************************************************
* *
* Paramètres : timestamp = horodatage 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_timestamp(const timestamp_t *timestamp, 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->cname = name;
value->built_name = false;
value->type = SQLITE_INT64;
value->integer64 = *timestamp;
return true;
}
/******************************************************************************
* *
* Paramètres : timestamp = horodatage 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 : Décrit les colonnes utiles à un horodatage. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool setup_load_of_timestamp(const timestamp_t *timestamp, 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->cname = name;
value->built_name = false;
value->type = SQLITE_INT64;
return true;
}
/******************************************************************************
* *
* Paramètres : timestamp = horodatage à 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 : Charge les valeurs utiles pour un horodatage. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
bool load_timestamp(timestamp_t *timestamp, const char *name, const bound_value *values, size_t count)
{
const bound_value *value; /* Valeur à intégrer */
value = find_bound_value(values, count, name);
if (value == NULL) return false;
if (value->type != SQLITE_INT64) return false;
*timestamp = value->integer64;
return true;
}