// // Copyright (c) 2014 Wind River Systems, Inc. // // SPDX-License-Identifier: Apache-2.0 // #include "sm_service_group_member_table.h" #include #include #include #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_group_members.h" static SmListT* _service_group_members = NULL; static SmDbHandleT* _sm_db_handle = NULL; // **************************************************************************** // Service Group Member Table - Read // ================================= SmServiceGroupMemberT* sm_service_group_member_table_read( char service_group_name[], char service_name[] ) { SmListT* entry = NULL; SmListEntryDataPtrT entry_data; SmServiceGroupMemberT* service_group_member; SM_LIST_FOREACH( _service_group_members, entry, entry_data ) { service_group_member = (SmServiceGroupMemberT*) entry_data; if(( 0 == strcmp( service_group_name, service_group_member->name ) )&& ( 0 == strcmp( service_name, service_group_member->service_name ) )) { return( service_group_member ); } } return( NULL ); } // **************************************************************************** // **************************************************************************** // Service Group Member Table - Read By Identifier // =============================================== SmServiceGroupMemberT* sm_service_group_member_table_read_by_id( int64_t service_group_member_id ) { SmListT* entry = NULL; SmListEntryDataPtrT entry_data; SmServiceGroupMemberT* service_group_member; SM_LIST_FOREACH( _service_group_members, entry, entry_data ) { service_group_member = (SmServiceGroupMemberT*) entry_data; if( service_group_member_id == service_group_member->id ) { return( service_group_member ); } } return( NULL ); } // **************************************************************************** // **************************************************************************** // Service Group Member Table - Read By Service // ============================================ SmServiceGroupMemberT* sm_service_group_member_table_read_by_service( char service_name[] ) { SmListT* entry = NULL; SmListEntryDataPtrT entry_data; SmServiceGroupMemberT* service_group_member; SM_LIST_FOREACH( _service_group_members, entry, entry_data ) { service_group_member = (SmServiceGroupMemberT*) entry_data; if( 0 == strcmp( service_name, service_group_member->service_name ) ) { return( service_group_member ); } } return( NULL ); } // **************************************************************************** // **************************************************************************** // Service Group Member Table - For Each // ===================================== void sm_service_group_member_table_foreach( void* user_data[], SmServiceGroupMemberTableForEachCallbackT callback ) { SmListT* entry = NULL; SmListEntryDataPtrT entry_data; SM_LIST_FOREACH( _service_group_members, entry, entry_data ) { callback( user_data, (SmServiceGroupMemberT*) entry_data ); } } // **************************************************************************** // **************************************************************************** // Service Group Member Table - For Each Member // ============================================ void sm_service_group_member_table_foreach_member( char service_group_name[], void* user_data[], SmServiceGroupMemberTableForEachCallbackT callback ) { SmListT* entry = NULL; SmListEntryDataPtrT entry_data; SmServiceGroupMemberT* service_group_member; SM_LIST_FOREACH( _service_group_members, entry, entry_data ) { service_group_member = (SmServiceGroupMemberT*) entry_data; if( 0 == strcmp( service_group_name, service_group_member->name ) ) { callback( user_data, service_group_member ); } } } // **************************************************************************** // **************************************************************************** // Service Group Member Table - Add // ================================ static SmErrorT sm_service_group_member_table_add( void* user_data[], void* record ) { SmServiceGroupMemberT* service_group_member; SmDbServiceGroupMemberT* db_service_group_member; db_service_group_member = (SmDbServiceGroupMemberT*) record; service_group_member = sm_service_group_member_table_read( db_service_group_member->name, db_service_group_member->service_name ); if( NULL == service_group_member ) { service_group_member = (SmServiceGroupMemberT*) malloc( sizeof(SmServiceGroupMemberT) ); if( NULL == service_group_member ) { DPRINTFE( "Failed to allocate service group member table entry." ); return( SM_FAILED ); } memset( service_group_member, 0, sizeof(SmServiceGroupMemberT) ); service_group_member->id = db_service_group_member->id; snprintf( service_group_member->name, sizeof(service_group_member->name), "%s", db_service_group_member->name ); snprintf( service_group_member->service_name, sizeof(service_group_member->service_name), "%s", db_service_group_member->service_name ); service_group_member->service_state = SM_SERVICE_STATE_INITIAL; service_group_member->service_status = SM_SERVICE_STATUS_NONE; service_group_member->service_condition = SM_SERVICE_CONDITION_NONE; service_group_member->service_failure_impact = db_service_group_member->service_failure_impact; service_group_member->service_failure_timestamp = 0; service_group_member->provisioned = db_service_group_member->provisioned; SM_LIST_PREPEND( _service_group_members, (SmListEntryDataPtrT) service_group_member ); } else { service_group_member->id = db_service_group_member->id; service_group_member->service_failure_impact = db_service_group_member->service_failure_impact; service_group_member->provisioned = db_service_group_member->provisioned; } return( SM_OKAY ); } // **************************************************************************** SmErrorT sm_service_group_member_provision(char service_group_name[], char service_name[]) { SmErrorT error; SmDbServiceGroupMemberT db_service_group_member; SmServiceGroupMemberT* service_group_member; service_group_member = sm_service_group_member_table_read(service_group_name, service_name); if(NULL != service_group_member) { return SM_OKAY; } error = sm_db_service_group_members_read( _sm_db_handle, service_group_name, service_name, &db_service_group_member ); if(SM_OKAY != error) { DPRINTFE("Service group member %s:%s was not found", service_group_name, service_name); return SM_FAILED; } error = sm_service_group_member_table_add(NULL, &db_service_group_member); if(SM_OKAY != error) { DPRINTFE("Failed to provision service group member %s:%s. Error %s", service_group_name, service_name, sm_error_str(error)); return SM_FAILED; } service_group_member = sm_service_group_member_table_read(service_group_name, service_name); if(NULL == service_group_member) { DPRINTFE("Service group member %s:%s not found", service_group_name, service_name); return SM_FAILED; } return error; } SmErrorT sm_service_group_member_deprovision(char service_group_name[], char service_name[]) { SmServiceGroupMemberT* service_group_member; service_group_member = sm_service_group_member_table_read(service_group_name, service_name); if(NULL == service_group_member) { DPRINTFI("Service group member %s:%s was not found, already deprovisioned?", service_group_name, service_name); return SM_OKAY; } SM_LIST_REMOVE( _service_group_members, (SmListEntryDataPtrT) service_group_member ); free(service_group_member); return SM_OKAY; } // **************************************************************************** // Service Group Member Table - Load // ================================= SmErrorT sm_service_group_member_table_load( void ) { char db_query[SM_DB_QUERY_STATEMENT_MAX_CHAR]; SmDbServiceGroupMemberT service_group_member; SmErrorT error; if( NULL != _service_group_members ) { SM_LIST_CLEANUP_ALL( _service_group_members ); _service_group_members = NULL; } snprintf( db_query, sizeof(db_query), "%s = 'yes'", SM_SERVICE_GROUP_MEMBERS_TABLE_COLUMN_PROVISIONED ); error = sm_db_foreach( SM_DATABASE_NAME, SM_SERVICE_GROUP_MEMBERS_TABLE_NAME, db_query, &service_group_member, sm_db_service_group_members_convert, sm_service_group_member_table_add, NULL ); if( SM_OKAY != error ) { DPRINTFE( "Failed to loop over service group memberss in database, " "error=%s.", sm_error_str( error ) ); return( error ); } return( SM_OKAY ); } // **************************************************************************** // **************************************************************************** // Service Group Member Table - Persist // ==================================== SmErrorT sm_service_group_member_table_persist( SmServiceGroupMemberT* service_group_member ) { SmDbServiceGroupMemberT db_service_group_member; SmErrorT error; memset( &db_service_group_member, 0, sizeof(db_service_group_member) ); db_service_group_member.id = service_group_member->id; db_service_group_member.provisioned = service_group_member->provisioned; snprintf( db_service_group_member.name, sizeof(db_service_group_member.name), "%s", service_group_member->name ); snprintf( db_service_group_member.service_name, sizeof(db_service_group_member.service_name), "%s", service_group_member->service_name ); db_service_group_member.service_failure_impact = service_group_member->service_failure_impact; error = sm_db_service_group_members_update( _sm_db_handle, &db_service_group_member ); if( SM_OKAY != error ) { DPRINTFE( "Failed to update database, error=%s.", sm_error_str( error ) ); return( error ); } return( SM_OKAY ); } // **************************************************************************** // **************************************************************************** // Service Group Member Table - Initialize // ======================================= SmErrorT sm_service_group_member_table_initialize( void ) { SmErrorT error; _service_group_members = 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_group_member_table_load(); if( SM_OKAY != error ) { DPRINTFE( "Failed to load service group members from database, " "error=%s.", sm_error_str( error ) ); return( error ); } return( SM_OKAY ); } // **************************************************************************** // **************************************************************************** // Service Group Member Table - Finalize // ===================================== SmErrorT sm_service_group_member_table_finalize( void ) { SmErrorT error; SM_LIST_CLEANUP_ALL( _service_group_members ); 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 ); } // ****************************************************************************