DTNMA Reference Tools v2.1.0 - 19.gcd454d0
Delay-Tolerant Networking Management Architecture (DTNMA) Tool Suite
Loading...
Searching...
No Matches
nm_sql.c File Reference

This file is only included in the build when ::HAVE_POSTGRESQL is defined. More...

#include "nm_sql.h"
#include <cace/ari/cbor.h>
#include <cace/amm/typing.h>
#include <cace/amm/semtype.h>
#include <cace/util/logging.h>
#include <cace/ari/text.h>
#include <cace/ari/text_util.h>
#include <string.h>
#include <arpa/inet.h>
#include <m-bstring.h>
+ Include dependency graph for nm_sql.c:

Data Structures

struct  refdm_db_pool_t
 

Macros

#define checkConn(idx)   (idx < MGR_NUM_SQL_CONNECTIONS && dbpool[idx].conn != NULL)
 
#define getConn(idx)   pthread_mutex_lock(&dbpool[idx].lock)
 
#define giveConn(idx)   pthread_mutex_unlock(&dbpool[idx].lock)
 
#define dbprep_bind_param_bool(idx, var)
 
#define dbprep_bind_param_int(idx, var)
 
#define dbprep_bind_param_short(idx, var)
 
#define dbprep_bind_param_float(idx, var)
 
#define dbprep_bind_param_double(idx, var)
 
#define dbprep_bind_param_bigint(idx, var)
 
#define dbprep_bind_param_str(idx, var)
 
#define dbprep_bind_param_null(idx)
 
#define dbprep_bind_param_byte(idx, var, length)
 
#define dbprep_declare(dbidx, idx, params, cols)
 
#define dbexec_prepared
 
#define dbtest_result(expected)   ((PQresultStatus(res) == expected) ? 0 : 1)
 
#define DB_CHKVOID(status)
 
#define DB_CHKINT(status)
 
#define DB_CHKNULL(status)
 
#define DB_CHKUSR(status, usr)
 
#define query_log_err(status)    CACE_LOG_ERR("ERROR at %s %i: %s (errno: %d)", __FILE__, __LINE__, PQresultErrorMessage(res), status);
 

Enumerations

enum  db_con_t { DB_CTRL_CON , DB_RPT_CON , DB_REST_CON , MGR_NUM_SQL_CONNECTIONS }
 
enum  queries {
  ARI_RPTSET_INSERT , ARI_AGENT_INSERT , ARI_EXECSET_INSERT , REFDM_DB_LOG_MSG ,
  MGR_NUM_QUERIES
}
 

Functions

static char * db_mgr_sql_prepare (size_t idx, const char *query, char *stmtName, int nParams, const Oid *paramTypes)
 
cace_ari_ac_tdb_query_ac (size_t dbidx, int ac_id)
 
void refdm_db_log_msg (const char *file, int line, const char *fun, int level, size_t dbidx, const char *format,...)
 Utility function to insert debug or error informational messages into the database.
 
static void refdm_db_pool_init (refdm_db_pool_t *conn, const refdm_db_t *parms)
 Initialize struct state for a single connection in the pool.
 
static uint32_t refdm_db_pool_connect (refdm_db_pool_t *conn, size_t idx)
 Actually attempt the connection from parameters.
 
uint32_t refdm_db_mgt_init (const refdm_db_t *parms, uint32_t clear, uint32_t log)
 
void refdm_db_mgt_close (void)
 
void refdm__db_mgt_close_conn (size_t idx)
 
int refdm_db_mgt_connected (size_t idx)
 
int32_t refdm_db_mgt_query_fetch (int db_idx, PGresult **res, char *format,...)
 
int32_t refdm_db_mgt_query_insert (int db_idx, uint32_t *idx, char *format,...)
 
static int transform_cbor_str_to_cace_data (cace_ari_t *ari_item, char *cbor_str, char **errm)
 Takes a C string and returns the corresponding cace_ari_t.
 
int refdm_db_clear_rptset (int32_t agent_idx)
 Runs a clear request on the rptset database table.
 
int refdm_db_fetch_rptset_count (int32_t agent_idx, size_t *count)
 Runs a query on the database and retrieves the number of RPTSETs.
 
int refdm_db_fetch_rptset_list (int32_t agent_idx, cace_ari_list_t *rptsets)
 Runs a query on the database and retrieves the list of RPTSETs.
 
refdm_agent_trefdm_db_fetch_agent (int32_t id)
 
int32_t refdm_db_fetch_agent_idx (const char *eid)
 Get the index of an Agent from its endpoint name.
 
uint32_t refdm_db_insert_rptset (const cace_ari_t *val, const refdm_agent_t *agent)
 
uint32_t refdm_db_insert_agent (const m_string_t eid)
 
uint32_t refdm_db_insert_execset (const cace_ari_t *val, const refdm_agent_t *agent)
 

Variables

const char * TBL_NAME_RPTSET = "ari_rptset"
 
const char * COL_NAME_REFERENCE_TIME = "reference_time"
 
const char * COL_NAME_AGENT_ID = "agent_id"
 
const char * COL_NAME_ARI_RPTSET_ID = "ari_rptset_id"
 
const char * COL_NAME_REPORT_LIST = "report_list"
 
const char * COL_NAME_REPORT_LIST_CBOR = "report_list_cbor"
 
const char * COL_NAME_NONCE_INT = "nonce_int"
 
const char * COL_NAME_NONCE_BYTES = "nonce_bytes"
 
refdm_db_pool_t dbpool [MGR_NUM_SQL_CONNECTIONS]
 
static char * queries [MGR_NUM_SQL_CONNECTIONS][MGR_NUM_QUERIES]
 

Detailed Description

This file is only included in the build when ::HAVE_POSTGRESQL is defined.

Macro Definition Documentation

◆ checkConn

#define checkConn (   idx)    (idx < MGR_NUM_SQL_CONNECTIONS && dbpool[idx].conn != NULL)

◆ DB_CHKINT

#define DB_CHKINT (   status)
Value:
if (status != 0) \
{ \
query_log_err(status); \
PQclear(res); \
return 0; \
}

◆ DB_CHKNULL

#define DB_CHKNULL (   status)
Value:
if (status != 0) \
{ \
query_log_err(status); \
PQclear(res); \
return NULL; \
}

◆ DB_CHKUSR

#define DB_CHKUSR (   status,
  usr 
)
Value:
if (status != 0) \
{ \
query_log_err(status); \
PQclear(res); \
usr; \
}

◆ DB_CHKVOID

#define DB_CHKVOID (   status)
Value:
if (status != 0) \
{ \
query_log_err(status); \
PQclear(res); \
return; \
}

◆ dbexec_prepared

#define dbexec_prepared
Value:
res = PQexecPrepared(conn, stmtName, nParams, paramValues, paramLengths, paramFormats, resultFormat); \
CACE_LOG_DEBUG("dbexec_prepared result: %s", PQresStatus(PQresultStatus(res)));

◆ dbprep_bind_param_bigint

#define dbprep_bind_param_bigint (   idx,
  var 
)
Value:
vast_to_nbo(var, (uint64_t *)&net64Vals[idx]); \
paramValues[idx] = (char *)&net64Vals[idx]; \
paramLengths[idx] = sizeof(net64Vals[idx]); \
paramFormats[idx] = 1; /* binary */

◆ dbprep_bind_param_bool

#define dbprep_bind_param_bool (   idx,
  var 
)
Value:
net8Vals[idx] = (uint8_t)var; \
paramValues[idx] = (char *)&net8Vals[idx]; \
paramLengths[idx] = sizeof(net8Vals[idx]); \
paramFormats[idx] = 1; /* binary */

◆ dbprep_bind_param_byte

#define dbprep_bind_param_byte (   idx,
  var,
  length 
)
Value:
paramValues[idx] = (const char *)var; \
paramLengths[idx] = length; \
paramFormats[idx] = 1;

◆ dbprep_bind_param_double

#define dbprep_bind_param_double (   idx,
  var 
)
Value:
double_to_nbo(var, (double *)&net64Vals[idx]); \
paramValues[idx] = (char *)&net64Vals[idx]; \
paramLengths[idx] = sizeof(net64Vals[idx]); \
paramFormats[idx] = 1; /* binary */

◆ dbprep_bind_param_float

#define dbprep_bind_param_float (   idx,
  var 
)
Value:
net32Vals[idx] = htonl(*((uint32_t *)&var)); \
paramValues[idx] = (char *)&net32Vals[idx]; \
paramLengths[idx] = sizeof(net32Vals[idx]); \
paramFormats[idx] = 1; /* binary */

◆ dbprep_bind_param_int

#define dbprep_bind_param_int (   idx,
  var 
)
Value:
net32Vals[idx] = htonl((uint32_t)var); \
paramValues[idx] = (char *)&net32Vals[idx]; \
paramLengths[idx] = sizeof(net32Vals[idx]); \
paramFormats[idx] = 1; /* binary */

◆ dbprep_bind_param_null

#define dbprep_bind_param_null (   idx)
Value:
paramValues[idx] = NULL; \
paramLengths[idx] = 0; \
paramFormats[idx] = 1;

◆ dbprep_bind_param_short

#define dbprep_bind_param_short (   idx,
  var 
)
Value:
net16Vals[idx] = htons((uint16_t)var); \
paramValues[idx] = (char *)&net16Vals[idx]; \
paramLengths[idx] = sizeof(net16Vals[idx]); \
paramFormats[idx] = 1; /* binary */

◆ dbprep_bind_param_str

#define dbprep_bind_param_str (   idx,
  var 
)
Value:
paramValues[idx] = var; \
paramLengths[idx] = 0; /* ignored for text format */ \
paramFormats[idx] = 0; /* text */

◆ dbprep_declare

#define dbprep_declare (   dbidx,
  idx,
  params,
  cols 
)
Value:
PGconn *conn = dbpool[dbidx].conn; \
char *stmtName = queries[dbidx][idx]; \
int nParams = params; \
const char *paramValues[nParams]; \
int paramLengths[nParams]; \
int paramFormats[nParams]; \
int resultFormat = 1; /* binary results */ \
PGresult *res; \
uint8_t net8Vals[nParams]; \
uint16_t net16Vals[nParams]; \
uint32_t net32Vals[nParams]; \
uint64_t net64Vals[nParams];
queries
Definition nm_sql.c:99
refdm_db_pool_t dbpool[MGR_NUM_SQL_CONNECTIONS]
Definition nm_sql.c:79
PGconn * conn
Connection handle.
Definition nm_sql.c:71

◆ dbtest_result

#define dbtest_result (   expected)    ((PQresultStatus(res) == expected) ? 0 : 1)

◆ getConn

#define getConn (   idx)    pthread_mutex_lock(&dbpool[idx].lock)

◆ giveConn

#define giveConn (   idx)    pthread_mutex_unlock(&dbpool[idx].lock)

◆ query_log_err

#define query_log_err (   status)     CACE_LOG_ERR("ERROR at %s %i: %s (errno: %d)", __FILE__, __LINE__, PQresultErrorMessage(res), status);

Enumeration Type Documentation

◆ db_con_t

enum db_con_t
Enumerator
DB_CTRL_CON 

Connection for receiving outgoing controls from database.

DB_RPT_CON 

Connection associated with DM RX thread.

All activities in this thread will execute within transactions.

DB_REST_CON 

Connection for REST API access.

MGR_NUM_SQL_CONNECTIONS 

Total number of connections.

◆ queries

enum queries
Enumerator
ARI_RPTSET_INSERT 
ARI_AGENT_INSERT 
ARI_EXECSET_INSERT 
REFDM_DB_LOG_MSG 
MGR_NUM_QUERIES 

Function Documentation

◆ db_mgr_sql_prepare()

static char * db_mgr_sql_prepare ( size_t  idx,
const char *  query,
char *  stmtName,
int  nParams,
const Oid *  paramTypes 
)
static

References CACE_LOG_ERR, and dbpool.

Referenced by refdm_db_pool_connect().

◆ db_query_ac()

cace_ari_ac_t * db_query_ac ( size_t  dbidx,
int  ac_id 
)

◆ refdm__db_mgt_close_conn()

void refdm__db_mgt_close_conn ( size_t  idx)

◆ refdm_db_clear_rptset()

int refdm_db_clear_rptset ( int32_t  agent_idx)

Runs a clear request on the rptset database table.

All rows will be removed.

Returns
Returns RET_PASS on success otherwise RET_FAIL_* on failure.

References CACE_LOG_ERR, DB_REST_CON, refdm_db_mgt_query_fetch(), RET_FAIL_DATABASE, RET_PASS, and TBL_NAME_RPTSET.

Referenced by refdm_mgr_clear_reports().

◆ refdm_db_fetch_agent()

◆ refdm_db_fetch_agent_idx()

int32_t refdm_db_fetch_agent_idx ( const char *  eid)

Get the index of an Agent from its endpoint name.

Parameters
[in]senderThe agent EID.
Returns
The corresponding Index, or zero if unsuccessful

References CACE_FREE, CACE_LOG_ERR, CACE_LOG_INFO, CACE_MALLOC, DB_REST_CON, DB_RPT_CON, dbpool, refdm_db_mgt_query_fetch(), and RET_PASS.

Referenced by agentsGetHandler(), agentShowHexReports(), agentShowTextReports(), and refdm_mgr_clear_reports().

◆ refdm_db_fetch_rptset_count()

int refdm_db_fetch_rptset_count ( int32_t  agent_idx,
size_t *  count 
)

Runs a query on the database and retrieves the number of RPTSETs.

Parameters
agent_idxThe row index of the source Agent.
[out]countArgument used to return the number of RPTSETs.
Returns
Returns RET_PASS on success otherwise RET_FAIL_* on failure.

References CACE_LOG_ERR, DB_REST_CON, refdm_db_mgt_query_fetch(), RET_FAIL_DATABASE, RET_PASS, and TBL_NAME_RPTSET.

Referenced by agentsGetHandler().

◆ refdm_db_fetch_rptset_list()

int refdm_db_fetch_rptset_list ( int32_t  agent_idx,
cace_ari_list_t rptsets 
)

Runs a query on the database and retrieves the list of RPTSETs.

Parameters
agent_idxThe row index of the source Agent.
[out]rptsetsThe list used to hold the retrieved RPTSETs.
Returns
Returns RET_PASS on success otherwise RET_FAIL_* on failure.

References cace_ari_init(), CACE_FREE, CACE_LOG_ERR, CACE_LOG_INFO, COL_NAME_REPORT_LIST_CBOR, DB_REST_CON, errm, refdm_db_mgt_query_fetch(), RET_FAIL_DATABASE, RET_PASS, TBL_NAME_RPTSET, and transform_cbor_str_to_cace_data().

Referenced by agentShowHexReports(), and agentShowTextReports().

◆ refdm_db_insert_agent()

uint32_t refdm_db_insert_agent ( const m_string_t  eid)
Parameters
eidagent eid being added
statusSet to 0 if parsing fails, but not modified on success
Returns
Report Set ID, or 0 on error

References ARI_AGENT_INSERT, CACE_LOG_INFO, DB_RPT_CON, dbexec_prepared, dbprep_bind_param_str, dbprep_declare, getConn, and giveConn.

Referenced by refdm_mgr_agent_add().

◆ refdm_db_insert_execset()

◆ refdm_db_insert_rptset()

◆ refdm_db_log_msg()

void refdm_db_log_msg ( const char *  filename,
int  lineno,
const char *  funcname,
int  level,
size_t  dbidx,
const char *  format,
  ... 
)

Utility function to insert debug or error informational messages into the database.

NOTE: If operating within a transaction, caller is responsible for committing transaction.

References checkConn, DB_CHKVOID, dbexec_prepared, dbprep_bind_param_int, dbprep_bind_param_str, dbprep_declare, dbtest_result, getConn, giveConn, and REFDM_DB_LOG_MSG.

◆ refdm_db_mgt_close()

void refdm_db_mgt_close ( void  )

◆ refdm_db_mgt_connected()

int refdm_db_mgt_connected ( size_t  idx)

◆ refdm_db_mgt_init()

uint32_t refdm_db_mgt_init ( const refdm_db_t *  parms,
uint32_t  clear,
uint32_t  log 
)

◆ refdm_db_mgt_query_fetch()

◆ refdm_db_mgt_query_insert()

int32_t refdm_db_mgt_query_insert ( int  db_idx,
uint32_t *  idx,
char *  format,
  ... 
)

◆ refdm_db_pool_connect()

static uint32_t refdm_db_pool_connect ( refdm_db_pool_t conn,
size_t  idx 
)
static

Actually attempt the connection from parameters.

This can occur multiple times for the same connection to re-connect. Prepared queries are connection specific. While we may not use all prepared statements for all connections, initializing the same sets everywhere simplifies management.

References ARI_AGENT_INSERT, ARI_EXECSET_INSERT, ARI_RPTSET_INSERT, CACE_LOG_INFO, CACE_LOG_WARNING, refdm_db_pool_t::conn, db_mgr_sql_prepare(), refdm_db_pool_t::parms, and REFDM_DB_LOG_MSG.

Referenced by refdm_db_mgt_connected(), and refdm_db_mgt_init().

◆ refdm_db_pool_init()

static void refdm_db_pool_init ( refdm_db_pool_t conn,
const refdm_db_t *  parms 
)
static

Initialize struct state for a single connection in the pool.

References refdm_db_pool_t::conn, refdm_db_pool_t::lock, and refdm_db_pool_t::parms.

Referenced by refdm_db_mgt_init().

◆ transform_cbor_str_to_cace_data()

static int transform_cbor_str_to_cace_data ( cace_ari_t ari_item,
char *  cbor_str,
char **  errm 
)
static

Takes a C string and returns the corresponding cace_ari_t.

Returns
Returns RET_PASS on success otherwise RET_FAIL_* on failure.
  • Parameters
    [out]ari_itemThe ARI to decode into.
  • Parameters
    [in]cbor_strThe string to decode from.
    [out]errmIf non-null, this will be set to a specific error message associated with any failure. When the return code is non-zero, if the pointed-to pointer is non-null it must be freed using CACE_FREE().

References cace_ari_cbor_decode(), cace_data_deinit(), cace_data_init_view(), errm, RET_FAIL_UNEXPECTED, and RET_PASS.

Referenced by refdm_db_fetch_rptset_list().

Variable Documentation

◆ COL_NAME_AGENT_ID

const char* COL_NAME_AGENT_ID = "agent_id"

◆ COL_NAME_ARI_RPTSET_ID

const char* COL_NAME_ARI_RPTSET_ID = "ari_rptset_id"

◆ COL_NAME_NONCE_BYTES

const char* COL_NAME_NONCE_BYTES = "nonce_bytes"

◆ COL_NAME_NONCE_INT

const char* COL_NAME_NONCE_INT = "nonce_int"

◆ COL_NAME_REFERENCE_TIME

const char* COL_NAME_REFERENCE_TIME = "reference_time"

◆ COL_NAME_REPORT_LIST

const char* COL_NAME_REPORT_LIST = "report_list"

◆ COL_NAME_REPORT_LIST_CBOR

const char* COL_NAME_REPORT_LIST_CBOR = "report_list_cbor"

◆ dbpool

◆ queries

◆ TBL_NAME_RPTSET

const char* TBL_NAME_RPTSET = "ari_rptset"