267 lines
8.6 KiB
C
267 lines
8.6 KiB
C
//
|
|
// Copyright (c) 2014 Wind River Systems, Inc.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
#include "sm_service_domain_table.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "sm_limits.h"
|
|
#include "sm_types.h"
|
|
#include "sm_debug.h"
|
|
#include "sm_list.h"
|
|
#include "sm_db.h"
|
|
#include "sm_db_foreach.h"
|
|
#include "sm_db_service_domains.h"
|
|
|
|
static SmListT* _service_domains = NULL;
|
|
static SmDbHandleT* _sm_db_handle = NULL;
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - Read
|
|
// ===========================
|
|
SmServiceDomainT* sm_service_domain_table_read( char name[] )
|
|
{
|
|
SmListT* entry = NULL;
|
|
SmListEntryDataPtrT entry_data;
|
|
SmServiceDomainT* domain;
|
|
|
|
SM_LIST_FOREACH( _service_domains, entry, entry_data )
|
|
{
|
|
domain = (SmServiceDomainT*) entry_data;
|
|
|
|
if( 0 == strcmp( name, domain->name ) )
|
|
{
|
|
return( domain );
|
|
}
|
|
}
|
|
|
|
return( NULL );
|
|
}
|
|
// ****************************************************************************
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - Read By Identifier
|
|
// =========================================
|
|
SmServiceDomainT* sm_service_domain_table_read_by_id( int64_t id )
|
|
{
|
|
SmListT* entry = NULL;
|
|
SmListEntryDataPtrT entry_data;
|
|
SmServiceDomainT* domain;
|
|
|
|
SM_LIST_FOREACH( _service_domains, entry, entry_data )
|
|
{
|
|
domain = (SmServiceDomainT*) entry_data;
|
|
|
|
if( id == domain->id )
|
|
{
|
|
return( domain );
|
|
}
|
|
}
|
|
|
|
return( NULL );
|
|
}
|
|
// ****************************************************************************
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - For Each
|
|
// ===============================
|
|
void sm_service_domain_table_foreach( void* user_data[],
|
|
SmServiceDomainTableForEachCallbackT callback )
|
|
{
|
|
SmListT* entry = NULL;
|
|
SmListEntryDataPtrT entry_data;
|
|
|
|
SM_LIST_FOREACH( _service_domains, entry, entry_data )
|
|
{
|
|
callback( user_data, (SmServiceDomainT*) entry_data );
|
|
}
|
|
|
|
}
|
|
// ****************************************************************************
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - Add
|
|
// ==========================
|
|
static SmErrorT sm_service_domain_table_add( void* user_data[], void* record )
|
|
{
|
|
SmServiceDomainT* domain;
|
|
SmDbServiceDomainT* db_domain;
|
|
|
|
db_domain = (SmDbServiceDomainT*) record;
|
|
|
|
domain = sm_service_domain_table_read( db_domain->name );
|
|
if( NULL == domain )
|
|
{
|
|
domain = (SmServiceDomainT*) malloc( sizeof(SmServiceDomainT) );
|
|
if( NULL == domain )
|
|
{
|
|
DPRINTFE( "Failed to allocate service domain table entry." );
|
|
return( SM_FAILED );
|
|
}
|
|
|
|
memset( domain, 0, sizeof(SmServiceDomainT) );
|
|
|
|
domain->id = db_domain->id;
|
|
snprintf( domain->name, sizeof(domain->name), "%s", db_domain->name );
|
|
domain->orchestration = db_domain->orchestration;
|
|
domain->designation = db_domain->designation;
|
|
domain->preempt = db_domain->preempt;
|
|
domain->generation = db_domain->generation;
|
|
domain->priority = db_domain->priority;
|
|
domain->hello_interval = db_domain->hello_interval;
|
|
domain->dead_interval = db_domain->dead_interval;
|
|
domain->wait_interval = db_domain->wait_interval;
|
|
domain->exchange_interval = db_domain->exchange_interval;
|
|
domain->state = db_domain->state;
|
|
domain->split_brain_recovery = db_domain->split_brain_recovery;
|
|
snprintf( domain->leader, sizeof(domain->leader), "%s",
|
|
db_domain->leader );
|
|
domain->hello_timer_id = SM_TIMER_ID_INVALID;
|
|
domain->wait_timer_id = SM_TIMER_ID_INVALID;
|
|
|
|
SM_LIST_PREPEND( _service_domains, (SmListEntryDataPtrT) domain );
|
|
|
|
} else {
|
|
domain->id = db_domain->id;
|
|
domain->orchestration = db_domain->orchestration;
|
|
domain->designation = db_domain->designation;
|
|
domain->preempt = db_domain->preempt;
|
|
domain->generation = db_domain->generation;
|
|
domain->priority = db_domain->priority;
|
|
domain->hello_interval = db_domain->hello_interval;
|
|
domain->dead_interval = db_domain->dead_interval;
|
|
domain->wait_interval = db_domain->wait_interval;
|
|
domain->exchange_interval = db_domain->exchange_interval;
|
|
domain->state = db_domain->state;
|
|
domain->split_brain_recovery = db_domain->split_brain_recovery;
|
|
snprintf( domain->leader, sizeof(domain->leader), "%s",
|
|
db_domain->leader );
|
|
}
|
|
|
|
return( SM_OKAY );
|
|
}
|
|
// ****************************************************************************
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - Load
|
|
// ===========================
|
|
SmErrorT sm_service_domain_table_load( void )
|
|
{
|
|
char db_query[SM_DB_QUERY_STATEMENT_MAX_CHAR];
|
|
SmDbServiceDomainT domain;
|
|
SmErrorT error;
|
|
|
|
snprintf( db_query, sizeof(db_query), "%s = 'yes'",
|
|
SM_SERVICE_DOMAINS_TABLE_COLUMN_PROVISIONED );
|
|
|
|
error = sm_db_foreach( SM_DATABASE_NAME,
|
|
SM_SERVICE_DOMAINS_TABLE_NAME, db_query,
|
|
&domain, sm_db_service_domains_convert,
|
|
sm_service_domain_table_add, NULL );
|
|
if( SM_OKAY != error )
|
|
{
|
|
DPRINTFE( "Failed to loop over service domains in "
|
|
"database, error=%s.", sm_error_str( error ) );
|
|
return( error );
|
|
}
|
|
|
|
return( SM_OKAY );
|
|
}
|
|
// ****************************************************************************
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - Persist
|
|
// ==============================
|
|
SmErrorT sm_service_domain_table_persist( SmServiceDomainT* domain )
|
|
{
|
|
SmDbServiceDomainT db_domain;
|
|
SmErrorT error;
|
|
|
|
memset( &db_domain, 0, sizeof(db_domain) );
|
|
|
|
db_domain.id = domain->id;
|
|
snprintf( db_domain.name, sizeof(db_domain.name), "%s", domain->name );
|
|
db_domain.orchestration = domain->orchestration;
|
|
db_domain.designation = domain->designation;
|
|
db_domain.preempt = domain->preempt;
|
|
db_domain.generation = domain->generation;
|
|
db_domain.priority = domain->priority;
|
|
db_domain.hello_interval = domain->hello_interval;
|
|
db_domain.dead_interval = domain->dead_interval;
|
|
db_domain.wait_interval = domain->wait_interval;
|
|
db_domain.exchange_interval = domain->exchange_interval;
|
|
db_domain.state = domain->state;
|
|
db_domain.split_brain_recovery = domain->split_brain_recovery;
|
|
snprintf( db_domain.leader, sizeof(db_domain.leader), "%s",
|
|
domain->leader );
|
|
|
|
error = sm_db_service_domains_update( _sm_db_handle, &db_domain );
|
|
if( SM_OKAY != error )
|
|
{
|
|
DPRINTFE( "Failed to update database, error=%s.",
|
|
sm_error_str( error ) );
|
|
return( error );
|
|
}
|
|
|
|
return( SM_OKAY );
|
|
}
|
|
// ****************************************************************************
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - Initialize
|
|
// =================================
|
|
SmErrorT sm_service_domain_table_initialize( void )
|
|
{
|
|
SmErrorT error;
|
|
|
|
_service_domains = NULL;
|
|
|
|
error = sm_db_connect( SM_DATABASE_NAME, &_sm_db_handle );
|
|
if( SM_OKAY != error )
|
|
{
|
|
DPRINTFE( "Failed to connect to database (%s), error=%s.",
|
|
SM_DATABASE_NAME, sm_error_str( error ) );
|
|
return( error );
|
|
}
|
|
|
|
error = sm_service_domain_table_load();
|
|
if( SM_OKAY != error )
|
|
{
|
|
DPRINTFE( "Failed to load service domains from database, "
|
|
"error=%s.", sm_error_str( error ) );
|
|
return( error );
|
|
}
|
|
|
|
return( SM_OKAY );
|
|
}
|
|
// ****************************************************************************
|
|
|
|
// ****************************************************************************
|
|
// Service Domain Table - Finalize
|
|
// ===============================
|
|
SmErrorT sm_service_domain_table_finalize( void )
|
|
{
|
|
SmErrorT error;
|
|
|
|
SM_LIST_CLEANUP_ALL( _service_domains );
|
|
|
|
if( NULL != _sm_db_handle )
|
|
{
|
|
error = sm_db_disconnect( _sm_db_handle );
|
|
if( SM_OKAY != error )
|
|
{
|
|
DPRINTFE( "Failed to disconnect from database (%s), error=%s.",
|
|
SM_DATABASE_NAME, sm_error_str( error ) );
|
|
}
|
|
|
|
_sm_db_handle = NULL;
|
|
}
|
|
|
|
return( SM_OKAY );
|
|
}
|
|
// ****************************************************************************
|