# -- # Copyright (C) 2001-2019 OTRS AG, https://otrs.com/ # -- # This software comes with ABSOLUTELY NO WARRANTY. For details, see # the enclosed file COPYING for license information (GPL). If you # did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt. # -- package Kernel::System::ProcessManagement::DB::Entity; use strict; use warnings; use Kernel::System::VariableCheck qw(:all); our @ObjectDependencies = ( 'Kernel::System::DB', 'Kernel::System::Log', 'Kernel::System::Main', ); =head1 NAME Kernel::System::ProcessManagement::DB::Entity =head1 DESCRIPTION Process Management DB Entity backend =head1 PUBLIC INTERFACE =head2 new() Don't use the constructor directly, use the ObjectManager instead: my $EntityObject = $Kernel::OM->Get('Kernel::System::ProcessManagement::DB::Entity'); =cut sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {}; bless( $Self, $Type ); $Self->{ValidEntities} = { 'Process' => 1, 'Activity' => 1, 'ActivityDialog' => 1, 'Transition' => 1, 'TransitionAction' => 1, }; return $Self; } =head2 EntityIDGenerate() generate unique Entity ID my $EntityID = $EntityObject->EntityIDGenerate( EntityType => 'Process', # mandatory, 'Process' || 'Activity' || 'ActivityDialog' # || 'Transition' || 'TransitionAction' UserID => 123, # mandatory ); Returns: $EntityID = 'P1'; =cut sub EntityIDGenerate { my ( $Self, %Param ) = @_; # check needed stuff for my $Key (qw(EntityType UserID)) { if ( !$Param{$Key} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Key!", ); return; } } # check entity type if ( !$Self->{ValidEntities}->{ $Param{EntityType} } ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "The EntityType:$Param{EntityType} is invalid!" ); return; } # this is not a 'proper' GUID as defined in RFC 4122 but it's close enough for # our purposes and we can replace it later if needed my $GUID = $Kernel::OM->Get('Kernel::System::Main')->GenerateRandomString( Length => 32, Dictionary => [ 0 .. 9, 'a' .. 'f' ], # hexadecimal ); my $EntityID = $Param{EntityType} . '-' . $GUID; return $EntityID; } =head2 EntitySyncStateSet() set sync state for an entity. my $Success = $EntityObject->EntitySyncStateSet( EntityType => 'Process', # 'Process' || 'Activity' || 'ActivityDialog' # || 'Transition' || 'TransitionAction', type of the # entity EntityID => 'P1', SyncState => 'not_sync', # the sync state to set UserID => 123, ); =cut sub EntitySyncStateSet { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(EntityType EntityID SyncState UserID)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!" ); return; } } # check entity type if ( !$Self->{ValidEntities}->{ $Param{EntityType} } ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "The EntityType:$Param{EntityType} is invalid!" ); return; } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # create new if ( !%{ $Self->EntitySyncStateGet(%Param) || {} } ) { return if !$DBObject->Do( SQL => ' INSERT INTO pm_entity_sync (entity_type, entity_id, sync_state, create_time, change_time) VALUES (?, ?, ?, current_timestamp, current_timestamp)', Bind => [ \$Param{EntityType}, \$Param{EntityID}, \$Param{SyncState}, ], ); } else { # update existing return if !$DBObject->Do( SQL => ' UPDATE pm_entity_sync SET sync_state = ?, change_time = current_timestamp WHERE entity_type = ? AND entity_id = ?', Bind => [ \$Param{SyncState}, \$Param{EntityType}, \$Param{EntityID}, ], ); } return 1; } =head2 EntitySyncStateGet() gets the sync state of an entity my $EntitySyncState = $EntityObject->EntitySyncStateGet( EntityType => 'Process', # 'Process' || 'Activity' || 'ActivityDialog' # || 'Transition' || 'TransitionAction', type of the # entity EntityID => 'P1', UserID => 123, ); If sync state was found, returns: $EntitySyncState = { EntityType => 'Process', EntityID => 'P1', SyncState => 'not_sync', CreateTime => '2011-02-08 15:08:00', ChangeTime => '2011-02-08 15:08:00', }; If no sync state was found, returns undef. =cut sub EntitySyncStateGet { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(EntityType EntityID UserID)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!" ); return; } } # check entity type if ( !$Self->{ValidEntities}->{ $Param{EntityType} } ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "The EntityType:$Param{EntityType} is invalid!" ); return; } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); return if !$DBObject->Prepare( SQL => ' SELECT entity_type, entity_id, sync_state, create_time, change_time FROM pm_entity_sync WHERE entity_type =? AND entity_id = ?', Bind => [ \$Param{EntityType}, \$Param{EntityID}, ], ); my %Result; while ( my @Data = $DBObject->FetchrowArray() ) { %Result = ( EntityType => $Data[0], EntityID => $Data[1], SyncState => $Data[2], CreateTime => $Data[3], ChangeTime => $Data[4], ); } return if !IsHashRefWithData( \%Result ); return \%Result; } =head2 EntitySyncStateDelete() deletes sync state of an entity. my $Success = $EntityObject->EntitySyncStateDelete( EntityType => 'Process', # 'Process' || 'Activity' || 'ActivityDialog' # || 'Transition' || 'TransitionAction', type of the # entity EntityID => 'P1', UserID => 123, ); =cut sub EntitySyncStateDelete { my ( $Self, %Param ) = @_; # check needed stuff for my $Key (qw(EntityType EntityID UserID)) { if ( !$Param{$Key} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Key!" ); return; } } # check entity type if ( !$Self->{ValidEntities}->{ $Param{EntityType} } ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "The EntityType:$Param{EntityType} is invalid!" ); return; } return if ( !%{ $Self->EntitySyncStateGet(%Param) || {} } ); return if !$Kernel::OM->Get('Kernel::System::DB')->Do( SQL => ' DELETE FROM pm_entity_sync WHERE entity_type = ? AND entity_id = ?', Bind => [ \$Param{EntityType}, \$Param{EntityID}, ], ); return 1; } =head2 EntitySyncStatePurge() deletes all entries . my $Success = $EntityObject->EntitySyncStatePurge( UserID => 123, ); =cut sub EntitySyncStatePurge { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(UserID)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!" ); return; } } return if !$Kernel::OM->Get('Kernel::System::DB')->Do( SQL => ' DELETE FROM pm_entity_sync', Bind => [], ); return 1; } =head2 EntitySyncStateList() gets a list of sync states. my $EntitySyncStateList = $EntityObject->EntitySyncStateList( EntityType => 'Process', # optional, 'Process' || 'Activity' || 'ActivityDialog' # || 'Transition' || 'TransitionAction', type of the # entity SyncState => 'not_sync', # optional, only entries with this sync state UserID => 123, ); Returns: $EntitySyncStateList = [ { EntityType => 'Process', EntityID => 'P1', SyncState => 'sync_started', CreateTime => '2011-02-08 15:08:00', ChangeTime => '2011-02-08 15:08:00', }, ... ]; =cut sub EntitySyncStateList { my ( $Self, %Param ) = @_; # check needed stuff for my $Needed (qw(UserID)) { if ( !$Param{$Needed} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $Needed!" ); return; } } if ( $Param{EntityType} ) { # check entity type if ( !$Self->{ValidEntities}->{ $Param{EntityType} } ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "The EntityType:$Param{EntityType} is invalid!" ); return; } } my $SQL = ' SELECT entity_type, entity_id, sync_state, create_time, change_time FROM pm_entity_sync'; my @Bind; if ( $Param{EntityType} ) { $SQL .= ' WHERE entity_type = ?'; push @Bind, \$Param{EntityType}; if ( $Param{SyncState} ) { $SQL .= ' AND sync_state = ?'; push @Bind, \$Param{SyncState}; } } elsif ( $Param{SyncState} ) { $SQL .= ' WHERE sync_state = ?'; push @Bind, \$Param{SyncState}; } $SQL .= ' ORDER BY entity_id ASC'; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); return if !$DBObject->Prepare( SQL => $SQL, Bind => \@Bind, ); my @Result; while ( my @Data = $DBObject->FetchrowArray() ) { push @Result, { EntityType => $Data[0], EntityID => $Data[1], SyncState => $Data[2], CreateTime => $Data[3], ChangeTime => $Data[4], }; } return \@Result; } 1; =head1 TERMS AND CONDITIONS This software is part of the OTRS project (L). This software comes with ABSOLUTELY NO WARRANTY. For details, see the enclosed file COPYING for license information (GPL). If you did not receive this file, see L. =cut