<?php
///////////////////////////////////////////////////////////////////////////////
//
// NagiosQL
//
///////////////////////////////////////////////////////////////////////////////
//
// (c) 2005-2018 by Martin Willisegger
//
// Project   : NagiosQL
// Component : Import Class
// Website   : https://sourceforge.net/projects/nagiosql/
// Version   : 3.4.0
// GIT Repo  : https://gitlab.com/wizonet/NagiosQL
//
///////////////////////////////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////////////////////////
//
// Class: Data import class
//
///////////////////////////////////////////////////////////////////////////////////////////////
//
// Includes any functions to import data from config files
//
// Name: nagimport
//
///////////////////////////////////////////////////////////////////////////////////////////////
namespace functions;

class NagImportClass
{
    // Define class variables
    private $arrSettings         = array();     // Array includes all global settings
    public $intDomainId          = 0;           // Configuration domain ID
    public $strErrorMessage      = '';          // String including error messages
    public $strInfoMessage       = '';          // String including information messages
    private $strList1            = '';
    private $strList2            = '';

    // Class includes
    /** @var MysqliDbClass */
    public $myDBClass;                          // Database class reference
    /** @var NagDataClass */
    public $myDataClass;                        // Data processing class reference
    /** @var NagConfigClass */
    public $myConfigClass;                      // Configuration class reference

    /**
     * NagImportClass constructor.
     * @param array $arrSession                 PHP Session array
     */
    public function __construct($arrSession)
    {
        if (isset($arrSession['SETS'])) {
            // Read global settings
            $this->arrSettings = $arrSession['SETS'];
        }
        if (isset($arrSession['domain'])) {
            $this->intDomainId = $arrSession['domain'];
        }
    }

    /**
     * Import a config file and writes the values to the database
     * @param string $strFileNameRaw            Import file name
     * @param int $intConfigId                  Configuration set id
     * @param int $intOverwrite                 0 = Do not replace existing data
     *                                          1 = Replace existing data in tables
     * @return int                              0 = successful / 1 = error
     *                                          Status messages are stored in class variables
     */
    public function fileImport($strFileNameRaw, $intConfigId, $intOverwrite = 0)
    {
        // Define variables
        $intBlock        = 0;
        $intRemoveTmp    = 0;
        $strImportFile   = '';
        $strConfLineTemp = '';
        $strBlockKey     = '';
        $arrData         = array();
        $strFileName     = trim($strFileNameRaw);
        // Get file
        $intReturn = $this->getImportFile($intConfigId, $strFileName, $strImportFile, $intRemoveTmp);
        // Open and read config file
        if ($intReturn == 0) {
            $resFile     = fopen($strImportFile, 'rb');
            $intMultiple = 0;
            while ($resFile && !feof($resFile)) {
                // Read line and remove blank chars
                $strConfLine = trim(fgets($resFile));
                // Process multi-line configuration instructions
                if (substr($strConfLine, -1) == '\\') {
                    if ($intMultiple == 0) {
                        $strConfLineTemp = str_replace("\\", ',', $strConfLine);
                        $intMultiple     = 1;
                    } else {
                        $strConfLineTemp .= str_replace("\\", ',', $strConfLine);
                    }
                    continue;
                }
                if ($intMultiple == 1) {
                    $strConfLine = $strConfLineTemp.$strConfLine;
                    $intMultiple = 0;
                }
                // Find NAGIOSQL variable
                if (substr_count($strConfLine, '#NAGIOSQL_') != 0) {
                    $strConfLine = str_replace('#NAGIOSQL_CONFIG_NAME', '_NAGIOSQL_CONFIG_NAME', $strConfLine);
                }
                // Pass comments and empty lines
                if (0 === strpos($strConfLine, '#')) {
                    continue;
                }
                if ($strConfLine == '') {
                    continue;
                }
                if (($intBlock == 1) && ($strConfLine == '{')) {
                    continue;
                }
                // Process line (remove blanks and cut comments)
                $strLineTmp  = str_replace("\;", ':semi:', $strConfLine);
                $arrLine     = preg_split("/[\s]+/", $strLineTmp);
                $arrTemp     = explode(';', implode(' ', $arrLine));
                $strNewLine  = str_replace(':semi:', "\;", trim($arrTemp[0]));
                // Find block begin
                if ($arrLine[0] == 'define') {
                    $intBlock    = 1;
                    $strBlockKey = str_replace('{', '', $arrLine[1]);
                    $arrData     = array();
                    continue;
                }
                // Store the block data to an array
                if (($intBlock == 1) && ($arrLine[0] != '}')) {
                    $strExclude = 'template_name,alias,name,use';
                    if (($strBlockKey == 'timeperiod') && (!\in_array($arrLine[0], explode(',', $strExclude), true))) {
                        $arrNewLine = explode(' ', $strNewLine);
                        $strTPKey   = str_replace(' ' .$arrNewLine[\count($arrNewLine)-1], '', $strNewLine);
                        $strTPValue = $arrNewLine[\count($arrNewLine)-1];
                        $arrData[$strTPKey] = array('key' => $strTPKey,
                            'value' => $strTPValue);
                    } else {
                        $key   = $arrLine[0];
                        $value = str_replace($arrLine[0]. ' ', '', $strNewLine);
                        // Special retry_check_interval, normal_check_interval
                        if ($key == 'retry_check_interval') {
                            $key = 'retry_interval';
                        }
                        if ($key == 'normal_check_interval') {
                            $key = 'check_interval';
                        }
                        $arrData[$arrLine[0]] = array('key' => $key, 'value' => $value);
                    }
                }
                // Process data at end of block
                if ((substr_count($strConfLine, '}') == 1) && ($arrData !== null) && \is_array($arrData)) {
                    $intBlock  = 0;
                    $intRetVal = $this->importTable($strBlockKey, $arrData, $intOverwrite);
                    if ($intRetVal != 0) {
                        $intReturn = 1;
                    }
                } elseif ($arrData === null) {
                    $this->strErrorMessage .= translate('No valid configuration found:'). ' ' .$strFileName. '::';
                    $intReturn = 1;
                }
            }
            if ($intRemoveTmp == 1) {
                unlink($strImportFile);
            }
        } else {
            $this->strErrorMessage .= translate('Import file does not exist or is not readable:'). ' ' .$strFileName
                . '::';
            $intReturn = 1;
        }
        return $intReturn;
    }

    // PRIVATE functions

    /**
     * @param int $intConfigId                  Configuration set id
     * @param string $strFileName               Configuration file name
     * @param string|bool $strImportFile        Temporary file for data import (by reference)
     * @param int $intRemoveTmp                 Remove temporary file (1 = yes / 0 = no) (by reference)
     * @return int                              0 = successful / 1 = error
     *                                          Status messages are stored in class variables
     */
    private function getImportFile($intConfigId, $strFileName, &$strImportFile, &$intRemoveTmp)
    {
        $intMethod        = 1;
        $intReturn        = 0;
        $intRemoveTmp     = 0;
        $strImportFile    = '';
        $strImportFileTmp = '';
        // File transfer method
        if (substr_count($strFileName, 'nagiosql_local_imp') == 1) {
            $intMethod = 1;
            $intRetVal = 0;
        } else {
            $intRetVal = $this->myConfigClass->getConfigData($intConfigId, 'method', $intMethod);
        }
        if ($intRetVal != 0) {
            $this->strErrorMessage .= translate('Unable to get configuration data:'). ' method::';
            $intReturn = 1;
        }
        if ($intReturn == 0) {
            // Read import file
            if ($intMethod == 1) { // Local file system
                if (!is_readable($strFileName)) {
                    $this->strErrorMessage .= translate('Cannot open the data file (check the permissions)!'). ' ' .
                        $strFileName. '::';
                    $intReturn = 1;
                } else {
                    $strImportFileTmp = $strFileName;
                }
            } elseif ($intMethod == 2) { // FTP access
                // Open ftp connection
                $intRetVal = $this->myConfigClass->getFTPConnection($intConfigId);
                if ($intRetVal != 0) {
                    $this->strErrorMessage .= $this->myConfigClass->strErrorMessage;
                    $intReturn = 1;
                } else {
                    // Transfer file from remote server to a local temp file
                    if (isset($this->arrSettings['path']) && isset($this->arrSettings['path']['tempdir'])) {
                        $strConfigFile = tempnam($this->arrSettings['path']['tempdir'], 'nagiosql_imp');
                    } else {
                        $strConfigFile = tempnam(sys_get_temp_dir(), 'nagiosql_imp');
                    }
                    if (!ftp_get($this->myConfigClass->resConnectId, $strConfigFile, $strFileName, FTP_ASCII)) {
                        $this->strErrorMessage .= translate('Cannot receive the configuration file (FTP connection)!').
                            '::';
                        ftp_close($this->myConfigClass->resConnectId);
                        $intReturn = 1;
                    } else {
                        $intRemoveTmp     = 1;
                        $strImportFileTmp = $strConfigFile;
                    }
                }
            } elseif ($intMethod == 3) { // SSH Access
                // Open ssh connection
                $intRetVal = $this->myConfigClass->getSSHConnection($intConfigId);
                if ($intRetVal != 0) {
                    $this->strErrorMessage .= $this->myConfigClass->strErrorMessage;
                    $intReturn = 1;
                } else {
                    // Transfer file from remote server to a local temp file
                    if (isset($this->arrSettings['path']) && isset($this->arrSettings['path']['tempdir'])) {
                        $strConfigFile = tempnam($this->arrSettings['path']['tempdir'], 'nagiosql_imp');
                    } else {
                        $strConfigFile = tempnam(sys_get_temp_dir(), 'nagiosql_imp');
                    }
                    if (!ssh2_scp_recv($this->myConfigClass->resConnectId, $strFileName, $strConfigFile)) {
                        $this->strErrorMessage .= translate('Cannot receive the configuration file (SSH connection)!').
                            '::';
                        $intReturn = 1;
                    } else {
                        $intRemoveTmp     = 1;
                        $strImportFileTmp = $strConfigFile;
                    }
                }
            }
            // Open and read config file
            if (file_exists($strImportFileTmp) && is_readable($strImportFileTmp)) {
                $strImportFile = $strImportFileTmp;
            } else {
                $intReturn    = 1;
                $intRemoveTmp = 0;
            }
        }
        return $intReturn;
    }

    /**
     * Writes the block data to the database
     * @param string $strBlockKey               Config key (from define)
     * @param array $arrImportData              Imported block data
     * @param int $intOverwrite                 0 = Do not replace existing data
     *                                          1 = Replace existing data in tables
     * @return int                              0 = successful / 1 = error
     *                                          Status messages are stored in class variables
     */
    private function importTable($strBlockKey, $arrImportData, $intOverwrite)
    {
        // Define variables
        $intIsTemplate      = 0;
        $intExists          = 0;
        $intInsertRelations = 0;
        $intInsertVariables = 0;
        $strHash            = '';
        $strConfigName      = '';
        $arrImportRelations = array();
        $arrFreeVariables   = array();
        $arrRelations       = array();
        // Block data from template or real configuration?
        if (array_key_exists('name', $arrImportData) && (isset($arrImportData['register']) &&
                ($arrImportData['register']['value'] == 0))) {
            $intIsTemplate = 1;
        }
        // Get table name and key for import
        $intReturn = $this->getTableData($strBlockKey, $intIsTemplate, $strTable, $strKeyField);
        if ($intReturn == 0) {
            // Create an import hash if no key field is available
            if ($strKeyField == '') {
                $this->createHash($strTable, $arrImportData, $strHash, $strConfigName);
                $arrImportData['config_name']['key']    = 'config_name';
                $arrImportData['config_name']['value']  = $strConfigName;
                $strKeyField = 'config_name';
            } else {
                $strHash = '';
            }
            // Get relation data
            $intRelation = $this->myDataClass->tableRelations($strTable, $arrRelations);
            // Does this entry already exist?
            if (($intIsTemplate == 0) && ($strKeyField != '') && isset($arrImportData[$strKeyField])) {
                if ($strHash == '') {
                    // Special key field values
                    if ($strBlockKey == 'hostextinfo') {
                        $strSQL  = 'SELECT `id`FROM `tbl_host` ' .
                            "WHERE `host_name`='".$arrImportData[$strKeyField]['value']."'";
                        $intHost = (int)$this->myDBClass->getFieldData($strSQL);
                        $strSQL  = 'SELECT `id` FROM `' .$strTable. '` ' .
                            'WHERE `config_id`=' .$this->intDomainId. ' AND `' .$strKeyField."`='".$intHost."'";
                    } else {
                        $strSQL  = 'SELECT `id` FROM `' .$strTable. '` ' .
                            'WHERE `config_id`=' .$this->intDomainId. ' AND ' .
                            '`' .$strKeyField."`='".$arrImportData[$strKeyField]['value']."'";
                    }
                } else {
                    $strSQL = 'SELECT `id` FROM `' .$strTable. '` ' .
                        'WHERE `config_id`=' .$this->intDomainId." AND `import_hash`='".$strHash."'";
                }
                $intExists = $this->myDBClass->getFieldData($strSQL);
                if ($intExists == false) {
                    $intExists = 0;
                }
            } elseif (($intIsTemplate == 1) && ($strKeyField != '') && isset($arrImportData['name'])) {
                $strSQL = 'SELECT `id` FROM `' .$strTable. '` ' .
                    'WHERE `config_id`=' .$this->intDomainId. ' AND ' .
                    "`template_name`='".$arrImportData['name']['value']."'";
                $intExists = $this->myDBClass->getFieldData($strSQL);
                if ($intExists == false) {
                    $intExists = 0;
                }
            }
            // Entry exsists but should not be overwritten
            if (($intExists != 0) && ($intOverwrite == 0)) {
                if ($strKeyField == 'config_name') {
                    $strSQLConfig  = 'SELECT `config_name` FROM `' .$strTable. '` WHERE `id`=' .$intExists;
                    $arrImportData[$strKeyField]['value'] = $this->myDBClass->getFieldData($strSQLConfig);
                }
                $this->strInfoMessage .= translate('Entry'). ' <b class="blackmessage">' .$strKeyField. ' -> ' .
                    $arrImportData[$strKeyField]['value']. '</b> ' .translate('inside'). ' <b class="blackmessage">' .
                    $strTable. '</b> ' .translate('exists and were not overwritten'). '::';
            } elseif (isset($arrImportData[$strKeyField]) && ($arrImportData[$strKeyField] == '*')) {
                // Do not write "*" values
                $this->strInfoMessage .= translate('Entry'). ' <b class="blackmessage">' .$strKeyField. ' -> ' .
                    $arrImportData[$strKeyField]['value']. '</b> ' .translate('inside'). ' <b class="blackmessage">' .
                    $strTable. '</b> ' .translate('were not written'). '::';
            } else {
                // Define SQL statement - part 1
                $this->getSQLPart1(
                    $arrImportData,
                    $strHash,
                    $intExists,
                    $strTable,
                    $strKeyField,
                    $intRelation,
                    $arrRelations,
                    $strSQL1,
                    $strSQL2
                );
                // Read command configurations
                list($strVCValues, $intWriteConfig, $strVIValues, $strRLValues, $strVWValues) =
                    $this->getImportValues($arrImportData, $strKeyField, $strSQL1, $strTable);


                // Build value statemets
                foreach ($arrImportData as $elem) {
                    // Write text values
                    $intCheckVC  = $this->writeTextValues(
                        $elem,
                        $strVCValues,
                        $strSQL1,
                        $intIsTemplate,
                        $intExists,
                        $strTable
                    );
                    // Write status values
                    $intCheckVI  = $this->writeStatusValues($elem, $strVIValues, $strSQL1);
                    // Write integer values
                    $intCheckVW  = $this->writeIntegerValues($elem, $strVWValues, $strSQL1);
                    // Write relations
                    $intCheckRel = $this->writeRelations($elem, $strRLValues, $arrImportRelations, $intInsertRelations);
                    // Write free variables
                    $intCheck = $intCheckVC+$intCheckVI+$intCheckVW+$intCheckRel;
                    if ($intCheck == 0) {
                        $arrTemp            = array();
                        $arrTemp['key']     = $elem['key'];
                        $arrTemp['value']   = $elem['value'];
                        $arrFreeVariables[] = $arrTemp;
                        $intInsertVariables = 1;
                    }
                }
                $strTemp1 = '';
                $strTemp2 = '';
                // Update database
                if ($intWriteConfig == 1) {
                    $booResult = $this->myDBClass->insertData($strSQL1.$strSQL2);
                } else {
                    $booResult = false;
                }
                if ($strKeyField == '') {
                    $strKey = $strConfigName;
                } else {
                    $strKey = $strKeyField;
                }
                if ($booResult != true) {
                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    if ($strKeyField != '') {
                        $this->strErrorMessage .= translate('Entry'). ' <b class="blackmessage">' .$strKey. ' -> ' .
                            $arrImportData[$strKeyField]['value']. '</b> ' .translate('inside').
                            ' <b class="blackmessage">' .$strTable. '</b> ' .translate('could not be inserted:'). ' ' .
                            $this->myDBClass->strErrorMessage. '::';
                    }
                    if ($strKeyField == '') {
                        $this->strErrorMessage .= translate('Entry'). ' <b class="blackmessage">' .$strTemp1. ' -> ' .
                            $strTemp2.translate('inside'). '</b> ' .$strTable. ' <b class="blackmessage">' .$strTable.
                            '</b> ' .translate('could not be inserted:'). ' ' .$this->myDBClass->strErrorMessage. '::';
                    }
                    return 1;
                }
                if ($strKeyField != '') {
                    $this->strInfoMessage .= translate('Entry'). ' <b class="blackmessage">' .$strKey. ' -> ' .
                        $arrImportData[$strKeyField]['value']. '</b> ' .translate('inside').
                        ' <b class="blackmessage">' .$strTable. '</b> ' .translate('successfully inserted'). '::';
                }
                if ($strKeyField == '') {
                    $this->strInfoMessage .= translate('Entry'). ' <b class="blackmessage">' .$strTemp1. ' -> ' .
                        $strTemp2. '</b> ' .translate('inside'). ' <b class="blackmessage">' .$strTable.
                        '</b> ' .translate('successfully inserted'). '::';
                }
                // Define data ID
                if ($intExists != 0) {
                    $intDataId = $intExists;
                } else {
                    $intDataId = $this->myDBClass->intLastId;
                }
                // Are there any relations to be filled in?
                if ($intInsertRelations == 1) {
                    foreach ($arrImportRelations as $elem) {
                        foreach ($arrRelations as $reldata) {
                            if ($reldata['fieldName'] == $elem['key']) {
                                $strValue = $elem['value'];
                                $strKey   = $elem['key'];
                                if ($elem['key'] == 'check_command') {
                                    $this->writeRelation5($strValue, $intDataId, $strTable, $reldata);
                                } elseif ($reldata['type'] == 1) {
                                    $this->writeRelation1(
                                        $strKey,
                                        $strValue,
                                        $intDataId,
                                        $strTable,
                                        $reldata,
                                        $arrImportData
                                    );
                                } elseif ($reldata['type'] == 2) {
                                    $this->writeRelation2($strKey, $strValue, $intDataId, $strTable, $reldata);
                                } elseif ($reldata['type'] == 3) {
                                    $this->writeRelation3($strValue, $intDataId, $strTable, $reldata);
                                } elseif ($reldata['type'] == 4) {
                                    $this->writeRelation4($strKey, $strValue, $intDataId, $strTable, $reldata);
                                } elseif ($reldata['type'] == 5) {
                                    $this->writeRelation6($strValue, $intDataId, $strTable, $reldata);
                                } elseif ($reldata['type'] == 6) {
                                    $this->writeRelation7($strValue, $intDataId, $strTable, $reldata);
                                } elseif ($reldata['type'] == 7) {
                                    $this->writeRelation8($strValue, $intDataId, $strTable, $reldata);
                                }
                            }
                        }
                    }
                }
                // Are there any free variables ore time definitions to be filled in?
                if ($intInsertVariables == 1) {
                    if ($strTable == 'tbl_timeperiod') {
                        // Remove old values
                        $strSQL    = "DELETE FROM `tbl_timedefinition` WHERE `tipId` = $intDataId";
                        $booResult = $this->myDBClass->insertData($strSQL);
                        if ($booResult == false) {
                            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                        }
                        foreach ($arrFreeVariables as $elem) {
                            $strSQL    = "INSERT INTO `tbl_timedefinition` SET `tipId` = $intDataId, ".
                                "`definition` = '".addslashes($elem['key'])."', ".
                                "`range` = '".addslashes($elem['value'])."'";
                            $booResult = $this->myDBClass->insertData($strSQL);
                            if ($booResult == false) {
                                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                            }
                        }
                    } else {
                        foreach ($arrFreeVariables as $elem) {
                            foreach ($arrRelations as $reldata) {
                                if ($reldata['type'] == 4) {
                                    $this->writeRelation4(
                                        $elem['key'],
                                        $elem['value'],
                                        $intDataId,
                                        $strTable,
                                        $reldata
                                    );
                                }
                            }
                        }
                    }
                }
                // Update Table times
                $this->myDataClass->updateStatusTable($strTable);
            }
        }
        return $intReturn;
    }

    /**
     * Get table name and key for import
     * @param string $strBlockKey               Block data key
     * @param int $intIsTemplate                Template data 1 = yes / 0 - no
     * @param string $strTable                  Template name
     * @param string $strKeyField               Table key name
     * @return int                              0 = successful / 1 = error
     */
    private function getTableData($strBlockKey, $intIsTemplate, &$strTable, &$strKeyField)
    {
        // Define variables
        $intReturn = 0;
        $arrTableData['command']            = array('tbl_command', 'command_name');
        $arrTableData['contactgroup']       = array('tbl_contactgroup', 'contactgroup_name');
        $arrTableData['contact']            = array('tbl_contact', 'contact_name');
        $arrTableData['timeperiod']         = array('tbl_timeperiod', 'timeperiod_name');
        $arrTableData['host']               = array('tbl_host', 'host_name');
        $arrTableData['service']            = array('tbl_service', '');
        $arrTableData['hostgroup']          = array('tbl_hostgroup', 'hostgroup_name');
        $arrTableData['servicegroup']       = array('tbl_servicegroup', 'servicegroup_name');
        $arrTableData['hostescalation']     = array('tbl_hostescalation', '');
        $arrTableData['serviceescalation']  = array('tbl_serviceescalation', '');
        $arrTableData['hostdependency']     = array('tbl_hostdependency', '');
        $arrTableData['servicedependency']  = array('tbl_servicedependency', '');
        $arrTableData['hostextinfo']        = array('tbl_hostextinfo', 'host_name');
        $arrTableData['serviceextinfo']     = array('tbl_serviceextinfo', '');
        $arrTableData['contactgroup']       = array('tbl_contactgroup', 'contactgroup_name');
        $arrTableDataTpl['contact']         = array('tbl_contacttemplate', 'name');
        $arrTableDataTpl['host']            = array('tbl_hosttemplate', 'name');
        $arrTableDataTpl['service']         = array('tbl_servicetemplate', 'name');

        // Define table name and key
        if (($intIsTemplate == 0) && isset($arrTableData[$strBlockKey])) {
            $strTable    = $arrTableData[$strBlockKey][0];
            /** @noinspection MultiAssignmentUsageInspection */
            $strKeyField = $arrTableData[$strBlockKey][1];
        } elseif (($intIsTemplate == 1) && isset($arrTableDataTpl[$strBlockKey])) {
            $strTable    =  $arrTableDataTpl[$strBlockKey][0];
            /** @noinspection MultiAssignmentUsageInspection */
            $strKeyField =  $arrTableDataTpl[$strBlockKey][1];
        } else {
            $this->strErrorMessage .= translate('Table for import definition').$strBlockKey.
                translate('is not available!') . '::';
            $intReturn = 1;
        }
        return $intReturn;
    }

    /**
     * Create a unique data hash from table data
     * @param $strTable
     * @param $arrBlockData
     * @param $strHash
     * @param $strConfigName
     */
    public function createHash($strTable, $arrBlockData, &$strHash, &$strConfigName)
    {
        $strRawString  = '';
        $strConfigName = 'imp_temporary';
        if ($strTable == 'tbl_service') {
            // HASH from any host, any hostgroup and service description - step 1
            if (isset($arrBlockData['host_name'])) {
                $strRawString .= $arrBlockData['host_name']['value']. ',';
            }
            if (isset($arrBlockData['hostgroup_name'])) {
                $strRawString .= $arrBlockData['hostgroup_name']['value']. ',';
            }
            // Replace *, + and ! in HASH raw string
            $strRawString = str_replace(array('*,', '!', '+'), array('any,', 'not_', ''), $strRawString);
            // Create configuration name from NagiosQL variable if exists
            if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) {
                $strConfigName  = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value'];
            } else {
                // Create configuration name from first two hosts / hostgroups
                $arrConfig    = explode(',', $strRawString);
                if (isset($arrConfig[0]) && ($arrConfig[0] != '')) {
                    $strConfigName  = 'imp_' .$arrConfig[0];
                }
                if (isset($arrConfig[1]) && ($arrConfig[1] != '')) {
                    $strConfigName .= '_' .$arrConfig[1];
                }
            }
            // HASH from any host, any hostgroup and service description - step 2
            if (isset($arrBlockData['service_description'])) {
                $strRawString .= $arrBlockData['service_description']['value']. ',';
            }
            if (isset($arrBlockData['display_name'])) {
                $strRawString .= $arrBlockData['display_name']['value']. ',';
            }
            if (isset($arrBlockData['check_command'])) {
                $strRawString .= $arrBlockData['check_command']['value']. ',';
            }
        }
        if (($strTable == 'tbl_hostdependency') || ($strTable == 'tbl_servicedependency')) {
            $strRawString1 = '';
            $strRawString2 = '';
            $strRawString3 = '';
            // HASH from any dependent host and any dependent hostgroup
            if (isset($arrBlockData['dependent_host_name'])) {
                $strRawString1 .= $arrBlockData['dependent_host_name']['value']. ',';
            }
            if (isset($arrBlockData['dependent_hostgroup_name'])) {
                $strRawString1 .= $arrBlockData['dependent_hostgroup_name']['value']. ',';
            }
            if (isset($arrBlockData['host_name'])) {
                $strRawString2 .= $arrBlockData['host_name']['value']. ',';
            }
            if (isset($arrBlockData['hostgroup_name'])) {
                $strRawString2 .= $arrBlockData['hostgroup_name']['value']. ',';
            }
            if (isset($arrBlockData['dependent_service_description'])) {
                $strRawString3 .= $arrBlockData['dependent_service_description']['value']. ',';
            }
            if (isset($arrBlockData['service_description'])) {
                $strRawString3 .= $arrBlockData['service_description']['value']. ',';
            }
            if (isset($arrBlockData['dependent_servicegroup_name'])) {
                $strRawString3 .= $arrBlockData['dependent_servicegroup_name']['value']. ',';
            }
            if (isset($arrBlockData['servicegroup_name'])) {
                $strRawString3 .= $arrBlockData['servicegroup_name']['value']. ',';
            }
            // Replace *, + and ! in HASH raw string
            $strRawString1 = str_replace('*,', 'any,', $strRawString1);
            $strRawString2 = str_replace('*,', 'any,', $strRawString2);
            $strRawString3 = str_replace('*,', 'any,', $strRawString3);
            $strRawString1 = str_replace('!', 'not_', $strRawString1);
            $strRawString2 = str_replace('!', 'not_', $strRawString2);
            $strRawString3 = str_replace('!', 'not_', $strRawString3);
            // Create configuration name from NagiosQL variable if exists
            if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) {
                $strConfigName  = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value'];
            } else {
                $arrConfig1    = explode(',', $strRawString1);
                $arrConfig2    = explode(',', $strRawString2);
                $arrConfig3    = explode(',', $strRawString3);
                if (isset($arrConfig1[0])) {
                    $strConfigName  = 'imp_' .$arrConfig1[0];
                }
                if (isset($arrConfig2[0])) {
                    $strConfigName .= '_' .$arrConfig2[0];
                }
                if (isset($arrConfig3[0])) {
                    $strConfigName .= '_' .$arrConfig3[0];
                }
                $strSQL = 'SELECT * FROM `' .$strTable."` WHERE `config_name`='$strConfigName'";
                $booRet    = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
                if ($booRet && ($intDC != 0)) {
                    $intCounter = 1;
                    do {
                        $strConfigNameTemp = $strConfigName. '_' .$intCounter;
                        $strSQL = 'SELECT * FROM `' .$strTable."` WHERE `config_name`='$strConfigNameTemp'";
                        $booRet    = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
                        $intCounter++;
                    } while ($booRet && ($intDC != 0));
                    $strConfigName = $strConfigNameTemp;
                }
            }
            // HASH string
            $strRawString = $strRawString1.$strRawString2.$strRawString3;
            $strRawString = substr($strRawString, 0, -1);
        }
        if (($strTable == 'tbl_hostescalation') || ($strTable == 'tbl_serviceescalation')) {
            $strRawString1 = '';
            $strRawString2 = '';
            $strRawString3 = '';
            // HASH from any host and any hostgroup
            if (isset($arrBlockData['host_name'])) {
                $strRawString1 .= $arrBlockData['host_name']['value']. ',';
            }
            if (isset($arrBlockData['hostgroup_name'])) {
                $strRawString1 .= $arrBlockData['hostgroup_name']['value']. ',';
            }
            if (isset($arrBlockData['contacts'])) {
                $strRawString2 .= $arrBlockData['contacts']['value']. ',';
            }
            if (isset($arrBlockData['contact_groups'])) {
                $strRawString2 .= $arrBlockData['contact_groups']['value']. ',';
            }
            if (isset($arrBlockData['service_description'])) {
                $strRawString3 .= $arrBlockData['service_description']['value']. ',';
            }
            // Replace *, + and ! in HASH raw string
            $strRawString1 = str_replace('*,', 'any,', $strRawString1);
            $strRawString2 = str_replace('*,', 'any,', $strRawString2);
            $strRawString3 = str_replace('*,', 'any,', $strRawString3);
            $strRawString1 = str_replace('!', 'not_', $strRawString1);
            $strRawString2 = str_replace('!', 'not_', $strRawString2);
            $strRawString3 = str_replace('!', 'not_', $strRawString3);
            // Create configuration name from NagiosQL variable if exists
            if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) {
                $strConfigName  = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value'];
            } else {
                $arrConfig1    = explode(',', $strRawString1);
                $arrConfig2    = explode(',', $strRawString2);
                $arrConfig3    = explode(',', $strRawString3);
                if (isset($arrConfig1[0])) {
                    $strConfigName  = 'imp_' .$arrConfig1[0];
                }
                if (isset($arrConfig2[0])) {
                    $strConfigName .= '_' .$arrConfig2[0];
                }
                if (isset($arrConfig3[0])) {
                    $strConfigName .= '_' .$arrConfig3[0];
                }
                $strSQL = 'SELECT * FROM `' .$strTable."` WHERE `config_name`='$strConfigName'";
                $booRet    = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
                if ($booRet && ($intDC != 0)) {
                    $intCounter = 1;
                    do {
                        $strConfigNameTemp = $strConfigName. '_' .$intCounter;
                        $strSQL = 'SELECT * FROM `' .$strTable."` WHERE `config_name`='$strConfigNameTemp'";
                        $booRet    = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
                        $intCounter++;
                    } while ($booRet && ($intDC != 0));
                    $strConfigName = $strConfigNameTemp;
                }
            }
            // HASH string
            $strRawString = $strRawString1.$strRawString2.$strRawString3;
            $strRawString = substr($strRawString, 0, -1);
        }
        if ($strTable == 'tbl_serviceextinfo') {
            // HASH from any host, any hostgroup and service description - step 1
            if (isset($arrBlockData['host_name'])) {
                $strRawString .= $arrBlockData['host_name']['value']. ',';
            }
            if (isset($arrBlockData['service_description'])) {
                $strRawString .= $arrBlockData['service_description']['value']. ',';
            }
            // HASH string
            $strRawString = substr($strRawString, 0, -1);
            // Create configuration name from NagiosQL variable if exists
            if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) {
                $strConfigName  = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value'];
            } else {
                // Create configuration name from first two items
                $arrConfig    = explode(',', $strRawString);
                if (isset($arrConfig[0]) && ($arrConfig[0] != '')) {
                    $strConfigName  = 'imp_' .$arrConfig[0];
                }
                if (isset($arrConfig[1]) && ($arrConfig[1] != '')) {
                    $strConfigName .= '_' .$arrConfig[1];
                }
            }
        }
        while (substr_count($strRawString, ' ') != 0) {
            $strRawString = str_replace(' ', '', $strRawString);
        }
        // Sort hash string
        $arrTemp = explode(',', $strRawString);
        sort($arrTemp);
        $strRawString = implode(',', $arrTemp);
        $strHash = sha1($strRawString);
        //echo "Hash: ".$strRawString." --> ".$strHash."<br>";
    }

    /**
     * @param array $arrImportData              Imported block data
     * @param string $strHash                   Unique data hash
     * @param int $intExists                    Does the dataset already exist?
     * @param string $strTable                  Table name
     * @param string $strKeyField               Table key file
     * @param int $intRelation                  Relation type
     * @param array $arrRelations               Relation array
     * @param string $strSQL1                   SQL statement part 1
     * @param string $strSQL2                   SQL statement part 2
     */
    private function getSQLPart1(
        $arrImportData,
        $strHash,
        $intExists,
        $strTable,
        $strKeyField,
        $intRelation,
        $arrRelations,
        &$strSQL1,
        &$strSQL2
    ) {
        // Define variables
        $intActive = 1;
        $arrData   = array();
        $intDataCount = 0;

        if ($strHash != '') {
            $strHash = " `import_hash`='" . $strHash . "', ";
        }
        if ($intExists != 0) {
            // Update database
            $strSQL1 = 'UPDATE `' .$strTable. '` SET ';
            $strSQL2 = ' `config_id`=' .$this->intDomainId.", $strHash `active`='$intActive', ".
                "`last_modified`=NOW() WHERE `id`=$intExists";
            // Keep config name while update
            if (($strKeyField == 'config_name') && !isset($arrImportData['_NAGIOSQL_CONFIG_NAME'])) {
                $strSQLConfig = 'SELECT `config_name` FROM `' .$strTable. '` WHERE `id`=' . $intExists;
                $arrImportData['config_name']['value'] = $this->myDBClass->getFieldData($strSQLConfig);
            }
            // Remove free variables
            if ($intRelation != 0) {
                foreach ($arrRelations as $relVar) {
                    if ($relVar['type'] == 4) {
                        $strSQL    = 'SELECT * FROM `' .$relVar['linkTable']."` WHERE `idMaster`=$intExists";
                        $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
                        if ($booReturn && ($intDataCount != 0)) {
                            foreach ($arrData as $elem) {
                                $strSQL = 'DELETE FROM `tbl_variabledefinition` WHERE `id`=' .$elem['idSlave'];
                                $this->myDataClass->dataInsert($strSQL, $intInsertId);
                            }
                        }
                        $strSQL = 'DELETE FROM `' .$relVar['linkTable']."` WHERE `idMaster`=$intExists";
                        $this->myDataClass->dataInsert($strSQL, $intInsertId);
                    }
                }
            }
        } else {
            // DB Eintrag einfügen
            $test='';
            $strSQL1  = 'INSERT INTO `' .$strTable."` SET $test";
            $strSQL2  = '  `config_id`=' .$this->intDomainId.", $strHash `active`='$intActive', `last_modified`=NOW()";
        }
    }

    /**
     * @param array $arrImportData              Imported block data
     * @param string $strKeyField               Table key file
     * @param string $strSQL1                   SQL statement part 1
     * @param string $strTable                  Table name
     * @return array                            List of import values
     */
    private function getImportValues($arrImportData, $strKeyField, &$strSQL1, $strTable)
    {
        // Description for the values
        // --------------------------
        // $strVCValues = Simple text values, will be stored as varchar / null = 'null' as text value / empty = ''
        // $strRLValues = Relations - values with relations to other tables
        // $strVWValues = Integer values - will be stored as INT values / null = -1, / empty values as NULL
        // $strVIValues = Decision values 0 = no, 1 = yes, 2 = skip, 3 = null

        // Define variables
        $strVCValues    = '';
        $strVIValues    = '';
        $strRLValues    = '';
        $strVWValues    = '';
        $intWriteConfig = 0;

        // Read command configurations
        if ($strKeyField == 'command_name') {
            $strVCValues = 'command_name,command_line';
            // Find out command type
            if (isset($arrImportData['command_line'])) {
                if ((substr_count($arrImportData['command_line']['value'], 'ARG1') != 0) ||
                    (substr_count($arrImportData['command_line']['value'], 'USER1') != 0)) {
                    $strSQL1 .= '`command_type` = 1,';
                } else {
                    $strSQL1 .= '`command_type` = 2,';
                }
            }
            $intWriteConfig = 1;

            // Read contact configurations
        } elseif ($strKeyField == 'contact_name') {
            $strVCValues  = 'contact_name,alias,host_notification_options,service_notification_options,email,';
            $strVCValues .= 'pager,address1,address2,address3,address4,address5,address6,name';

            $strVWValues  = 'minimum_importance';

            $strVIValues  = 'host_notifications_enabled,service_notifications_enabled,can_submit_commands,';
            $strVIValues .= 'retain_status_information,retain_nonstatus_information';

            $strRLValues  = 'contactgroups,host_notification_period,service_notification_period,';
            $strRLValues .= 'host_notification_commands,service_notification_commands,use';
            $intWriteConfig = 1;

            // Read contactgroup configurations
        } elseif ($strKeyField == 'contactgroup_name') {
            $strVCValues = 'contactgroup_name,alias';

            $strRLValues = 'members,contactgroup_members';
            $intWriteConfig = 1;

            // Read timeperiod configurations
        } elseif ($strKeyField == 'timeperiod_name') {
            $strVCValues = 'timeperiod_name,alias,name';

            $strRLValues = 'use,exclude';
            $intWriteConfig = 1;

            // Read contacttemplate configurations
        } elseif (($strKeyField == 'name') && ($strTable == 'tbl_contacttemplate')) {
            $strVCValues  = 'contact_name,alias,host_notification_options,service_notification_options,email,';
            $strVCValues .= 'pager,address1,address2,address3,address4,address5,address6,name';

            $strVWValues  = 'minimum_importance';

            $strVIValues  = 'host_notifications_enabled,service_notifications_enabled,can_submit_commands,';
            $strVIValues .= 'retain_status_information,retain_nonstatus_information';

            $strRLValues  = 'contactgroups,host_notification_period,service_notification_period,';
            $strRLValues .= 'host_notification_commands,service_notification_commands,use';
            $intWriteConfig = 1;

            // Read host configurations
        } elseif ($strTable == 'tbl_host') {
            $strVCValues  = 'host_name,alias,display_name,address,initial_state,flap_detection_options,';
            $strVCValues .= 'notification_options,stalking_options,notes,notes_url,action_url,icon_image,';
            $strVCValues .= 'icon_image_alt,vrml_image,statusmap_image,2d_coords,3d_coords,name';

            $strVWValues  = 'max_check_attempts,retry_interval,check_interval,freshness_threshold,low_flap_threshold,';
            $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance';

            $strVIValues  = 'active_checks_enabled,passive_checks_enabled,check_freshness,obsess_over_host,';
            $strVIValues .= 'event_handler_enabled,flap_detection_enabled,process_perf_data,retain_status_information,';
            $strVIValues .= 'retain_nonstatus_information,notifications_enabled';

            $strRLValues = 'parents,hostgroups,check_command,use,check_period,event_handler,contacts,contact_groups,';
            $strRLValues .= 'notification_period';
            $intWriteConfig = 1;

            // Read hosttemplate configurations
        } elseif (($strKeyField == 'name') && ($strTable == 'tbl_hosttemplate')) {
            $strVCValues  = 'template_name,alias,initial_state,flap_detection_options,notification_options,';
            $strVCValues .= 'stalking_options,notes,notes_url,action_url,icon_image,icon_image_alt,vrml_image,';
            $strVCValues .= 'statusmap_image,2d_coords,3d_coords,name';

            $strVWValues  = 'max_check_attempts,retry_interval,check_interval,freshness_threshold,low_flap_threshold,';
            $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance';

            $strVIValues  = 'active_checks_enabled,passive_checks_enabled,check_freshness,obsess_over_host,';
            $strVIValues .= 'event_handler_enabled,flap_detection_enabled,process_perf_data,retain_status_information,';
            $strVIValues .= 'retain_nonstatus_information,notifications_enabled';

            $strRLValues  = 'parents,hostgroups,check_command,use,check_period,event_handler,contacts,contact_groups,';
            $strRLValues .= 'notification_period';
            $intWriteConfig = 1;

            // Read hostgroup configurations
        } elseif ($strKeyField == 'hostgroup_name') {
            $strVCValues = 'hostgroup_name,alias,notes,notes_url,action_url';

            $strRLValues = 'members,hostgroup_members';
            $intWriteConfig = 1;

            // Read service configurations
        } elseif ($strTable == 'tbl_service') {
            $strVCValues  = 'service_description,display_name,initial_state,flap_detection_options,stalking_options,';
            $strVCValues .= 'notes,notes_url,action_url,icon_image,icon_image_alt,name,config_name,';
            $strVCValues .= 'notification_options';

            $strVWValues  = 'max_check_attempts,check_interval,retry_interval,freshness_threshold,low_flap_threshold,';
            $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance';

            $strVIValues  = 'is_volatile,active_checks_enabled,passive_checks_enabled,parallelize_check,';
            $strVIValues .= 'obsess_over_service,check_freshness,event_handler_enabled,flap_detection_enabled,';
            $strVIValues .= 'process_perf_data,retain_status_information,retain_nonstatus_information,';
            $strVIValues .= 'notifications_enabled';

            $strRLValues  = 'host_name,hostgroup_name,servicegroups,use,check_command,check_period,event_handler,';
            $strRLValues .= 'notification_period,contacts,contact_groups,parents';
            $intWriteConfig = 1;

            // Read servicetemplate configurations
        } elseif (($strKeyField == 'name') && ($strTable == 'tbl_servicetemplate')) {
            $strVCValues  = 'template_name,service_description,display_name,initial_state,flap_detection_options,';
            $strVCValues .= 'stalking_options,notes,notes_url,action_url,icon_image,icon_image_alt,name,';
            $strVCValues .= 'notification_options';

            $strVWValues  = 'max_check_attempts,check_interval,retry_interval,freshness_threshold,low_flap_threshold,';
            $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance';

            $strVIValues  = 'is_volatile,active_checks_enabled,passive_checks_enabled,parallelize_check,';
            $strVIValues .= 'obsess_over_service,check_freshness,event_handler_enabled,flap_detection_enabled,';
            $strVIValues .= 'process_perf_data,retain_status_information,retain_nonstatus_information,';
            $strVIValues .= 'notifications_enabled';

            $strRLValues  = 'host_name,hostgroup_name,servicegroups,use,check_command,check_period,event_handler,';
            $strRLValues .= 'notification_period,contacts,contact_groups,parents';
            $intWriteConfig = 1;

            // Read servicegroup configurations
        } elseif ($strKeyField == 'servicegroup_name') {
            $strVCValues = 'servicegroup_name,alias,notes,notes_url,action_url';

            $strRLValues = 'members,servicegroup_members';
            $intWriteConfig = 1;

            // Read hostdependency configurations
        } elseif ($strTable == 'tbl_hostdependency') {
            $strVCValues = 'config_name,execution_failure_criteria,notification_failure_criteria';

            $strVIValues = 'inherits_parent';

            $strRLValues = 'dependent_host_name,dependent_hostgroup_name,host_name,hostgroup_name,dependency_period';
            $intWriteConfig = 1;

            // Read hostescalation configurations
        } elseif ($strTable == 'tbl_hostescalation') {
            $strVCValues = 'config_name,escalation_options';

            $strVWValues = 'first_notification,last_notification,notification_interval';

            $strRLValues = 'host_name,hostgroup_name,contacts,contact_groups,escalation_period';
            $intWriteConfig = 1;

            // Read hostextinfo configurations
        } elseif ($strTable == 'tbl_hostextinfo') {
            $strVCValues  = 'notes,notes_url,action_url,icon_image,icon_image_alt,vrml_image,statusmap_image,';
            $strVCValues .= '2d_coords,3d_coords';

            $strRLValues = 'host_name';
            $intWriteConfig = 1;

            // Read servicedependency configurations
        } elseif ($strTable == 'tbl_servicedependency') {
            $strVCValues  = 'config_name,execution_failure_criteria,notification_failure_criteria';

            $strVIValues  = 'inherits_parent';

            $strRLValues  = 'dependent_host_name,dependent_hostgroup_name,dependent_service_description,host_name,';
            $strRLValues .= 'hostgroup_name,dependency_period,service_description,dependent_servicegroup_name,';
            $strRLValues .= 'servicegroup_name';
            $intWriteConfig = 1;

            // Read serviceescalation configurations
        } elseif ($strTable == 'tbl_serviceescalation') {
            $strVCValues  = 'config_name,escalation_options';

            $strVIValues  = 'first_notification,last_notification,notification_interval';

            $strRLValues  = 'host_name,hostgroup_name,contacts,contact_groups,service_description,escalation_period,';
            $strRLValues .= 'servicegroup_name';
            $intWriteConfig = 1;

            // Serviceextinfo configurations
        } elseif ($strTable == 'tbl_serviceextinfo') {
            $strVCValues = 'notes,notes_url,action_url,icon_image,icon_image_alt';

            $strRLValues = 'host_name,service_description';
            $intWriteConfig = 1;
        }

        // Common values (all configurations)
        if ($strVWValues == '') {
            $strVWValues = 'register';
        } else {
            $strVWValues .= ',register';
        }
        return array($strVCValues, $intWriteConfig, $strVIValues, $strRLValues, $strVWValues);
    }

    /**
     * @param $elem
     * @param $strVCValues
     * @param $strSQL1
     * @param $intIsTemplate
     * @param $intExists
     * @param $strTable
     * @return int
     */
    private function writeTextValues($elem, $strVCValues, &$strSQL1, $intIsTemplate, $intExists, $strTable)
    {
        $intCheck = 0;
        if (\in_array($elem['key'], explode(',', $strVCValues), true)) {
            if (strtolower(trim($elem['value'])) == 'null') {
                $strSQL1 .= '`' . $elem['key'] . "` = 'null',";
            } else {
                $elem['value'] = addslashes($elem['value']);
                if ($intIsTemplate == 1) {
                    if ($elem['key'] == 'name') {
                        $strSQL1 .= "template_name = '" . $elem['value'] . "',";
                    } elseif (($elem['key'] == 'config_name') && ($intExists != 0)) {
                        // Do not overwrite config_names during an update!
                        $strSQLConfig = 'SELECT `config_name` FROM `' . $strTable . '` WHERE `id`=' . $intExists;
                        $elem['value'] = $this->myDBClass->getFieldData($strSQLConfig);
                        $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',";
                    } else {
                        $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',";
                    }
                } else {
                    $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',";
                }
            }
            $intCheck = 1;
        }
        return $intCheck;
    }

    /**
     * @param $elem
     * @param $strVIValues
     * @param $strSQL1
     * @return int
     */
    private function writeStatusValues($elem, $strVIValues, &$strSQL1)
    {
        $intCheck = 0;
        if (\in_array($elem['key'], explode(',', $strVIValues), true)) {
            if (strtolower(trim($elem['value'])) == 'null') {
                $strSQL1 .= '`' . $elem['key'] . '` = 3,';
            } else {
                $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',";
            }
            $intCheck = 1;
        }
        return $intCheck;
    }

    /**
     * @param $elem
     * @param $strVWValues
     * @param $strSQL1
     * @return int
     */
    private function writeIntegerValues($elem, $strVWValues, &$strSQL1)
    {
        $intCheck = 0;
        if (\in_array($elem['key'], explode(',', $strVWValues), true)) {
            if (strtolower(trim($elem['value'])) == 'null') {
                $strSQL1 .= '`' . $elem['key'] . '` = -1,';
            } else {
                $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',";
            }
            $intCheck = 1;
        }
        return $intCheck;
    }

    /**
     * @param array $elem
     * @param string $strRLValues
     * @param array $arrImportRelations
     * @param $intInsertRelations
     * @return int
     */
    private function writeRelations(&$elem, $strRLValues, &$arrImportRelations, &$intInsertRelations)
    {
        $intCheck = 0;
        if (($intCheck == 0) && \in_array($elem['key'], explode(',', $strRLValues), true)) {
            if ($elem['key'] == 'use') {
                $elem['key'] = 'use_template';
            }
            $arrTemp = array();
            $arrTemp['key'] = $elem['key'];
            $arrTemp['value'] = $elem['value'];
            $arrImportRelations[] = $arrTemp;
            $intInsertRelations = 1;
            $intCheck = 1;
        }
        return $intCheck;
    }

    /**
     * Inserts a relation type 1 (1:1)
     * @param string $strKey                    Data field name
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     * @param array $arrImportData              Import Data
     */
    public function writeRelation1($strKey, $strValue, $intDataId, $strDataTable, $arrRelData, $arrImportData)
    {
        // Define variables
        $intSlaveId = 0;
        if (strtolower(trim($strValue)) == 'null') {
            // Update data in master table
            $strSQL   = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']. '` = -1 WHERE `id` = '
                .$intDataId;
            $booResult  = $this->myDBClass->insertData($strSQL);
            if ($booResult == false) {
                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
            }
        } else {
            // Decompose data value
            $arrValues = explode(',', $strValue);
            // Process data values
            foreach ($arrValues as $elem) {
                $strWhere = '';
                $strLink  = '';
                $strAdd   = '';
                // Special processing for serviceextinfo
                if (($strDataTable == 'tbl_serviceextinfo') && ($strKey == 'service_description')) {
                    $strLink  = 'LEFT JOIN `tbl_lnkServiceToHost` on `tbl_service`.`id`=`idMaster` ' .
                        'LEFT JOIN `tbl_host` ON `idSlave`=`tbl_host`.`id`';
                    $strWhere = "AND `tbl_host`.`host_name`='".$arrImportData['host_name']['value']."'";
                }
                // Does the value already exist?
                $strSQL = 'SELECT `' .$arrRelData['tableName1']. '`.`id` FROM `' .$arrRelData['tableName1'].
                    "` $strLink " . 'WHERE `' .$arrRelData['target1']."` = '".$elem."' $strWhere AND ".
                    '`' .$arrRelData['tableName1']."`.`active`='1' AND ".
                    '`' .$arrRelData['tableName1']. '`.`config_id`=' .$this->intDomainId;
                $strId  = $this->myDBClass->getFieldData($strSQL);
                if ($strId != '') {
                    $intSlaveId = (int)$strId;
                }
                if ($intSlaveId == 0) {
                    // Insert a temporary value
                    if (($strDataTable == 'tbl_serviceextinfo') && ($arrRelData['tableName1'] == 'tbl_service')) {
                        $strAdd = "`config_name`='imp_tmp_by_serviceextinfo',";
                    }
                    $strSQL    = 'INSERT INTO `' .$arrRelData['tableName1']. '` ' .
                        'SET `' .$arrRelData['target1']."` = '".$elem."', ".
                        "$strAdd `config_id`=".$this->intDomainId.", `active`='0', ".
                        '`last_modified`=NOW()';
                    $booResult  = $this->myDBClass->insertData($strSQL);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                    $intSlaveId = $this->myDBClass->intLastId;

                    // Special processing for serviceextinfo
                    if (($strDataTable == 'tbl_serviceextinfo') && ($strKey == 'service_description')) {
                        $strSQL = 'SELECT `id` FROM `tbl_host` ' .
                            "WHERE `host_name`='".$arrImportData['host_name']['value']."'";
                        $strId  = $this->myDBClass->getFieldData($strSQL);
                        if ($strId != '') {
                            $strSQL     = 'INSERT INTO `tbl_lnkServiceToHost` ' .
                                "SET `idMaster` = '".$intSlaveId."', `idSlave` = '".$strId."'";
                            $booResult  = $this->myDBClass->insertData($strSQL);
                            if ($booResult == false) {
                                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                            }
                            $strSQL    = "UPDATE `tbl_service` SET `host_name`=0 WHERE `id`='".$intSlaveId."'";
                            $booResult  = $this->myDBClass->insertData($strSQL);
                            if ($booResult == false) {
                                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                            }
                        }
                    }
                }
                // Update data in master table
                $strSQL    = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']. '` = ' .$intSlaveId. ' ' .
                    'WHERE `id` = ' .$intDataId;
                $booResult  = $this->myDBClass->insertData($strSQL);
                if ($booResult == false) {
                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                }
            }
        }
    }

    /**
     * Inserts a relation type 2 (1:n)
     * @param string $strKey                    Data field name
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     */
    public function writeRelation2($strKey, $strValue, $intDataId, $strDataTable, $arrRelData)
    {
        // Does a tploption field exist?
        $strSQL = 'SELECT * FROM `' .$strDataTable. '` WHERE `id` = ' .$intDataId;
        $this->myDBClass->hasSingleDataset($strSQL, $arrDataset);
        $strFieldName = $arrRelData['fieldName']. '_tploptions';
        if (isset($arrDataset[$strFieldName])) {
            $intTplOption = 1;
        } else {
            $intTplOption = 0;
        }
        // Delete data from link table
        $strSQL    = 'DELETE FROM `' .$arrRelData['linkTable']. '` WHERE `idMaster` = ' .$intDataId;
        $booResult = $this->myDBClass->insertData($strSQL);
        if ($booResult == false) {
            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
        }
        // Define variables
        if (strtolower(trim($strValue)) == 'null') {
            // Update data in master table
            if ($intTplOption == 1) {
                $strSQL = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']. '` = 0, ' .
                    '`' .$arrRelData['fieldName']. '_tploptions` = 1  WHERE `id` = ' .$intDataId;
            } else {
                $strSQL = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']. '` = 0 WHERE `id` = ' .
                    $intDataId;
            }
            $this->myDBClass->insertData($strSQL);
        } else {
            if (0 === strpos(trim($strValue), '+')) {
                $intOption = 0;
                $strValue = str_replace('+', '', $strValue);
            } else {
                $intOption = 2;
            }
            // Decompose data value
            $arrValues = explode(',', $strValue);
            // Process data values
            foreach ($arrValues as $elem) {
                if ($elem != '*') {
                    $strWhere = '';
                    $strLink  = '';
                    // Exclude values
                    if (0 === strpos($elem, '!')) {
                        $intExclude = 1;
                        $elem = substr($elem, 1);
                    } else {
                        $intExclude = 0;
                    }
                    if ((($strDataTable == 'tbl_servicedependency') || ($strDataTable == 'tbl_serviceescalation')) &&
                        (substr_count($strKey, 'service') != 0) && (substr_count($strKey, 'group') == 0)) {
                        if (substr_count($strKey, 'depend') != 0) {
                            $strLink  = 'LEFT JOIN `tbl_lnkServiceToHost` on `id`=`idMaster`';
                            $strWhere = 'AND `idSlave` IN (' .substr($this->strList1, 0, -1). ')';
                        } else {
                            $strLink  = 'LEFT JOIN `tbl_lnkServiceToHost` on `id`=`idMaster`';
                            $strWhere = 'AND `idSlave` IN (' .substr($this->strList2, 0, -1). ')';
                        }
                    }
                    // Does the entry already exist?
                    $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName1']."` $strLink ".
                        'WHERE `' .$arrRelData['target1']."` = '".$elem."' $strWhere AND ".
                        '`config_id`=' .$this->intDomainId;
                    $strId  = $this->myDBClass->getFieldData($strSQL);
                    if ($strId != '') {
                        $intSlaveId = (int)$strId;
                    } else {
                        $intSlaveId = 0;
                    }
                    if (($intSlaveId == 0) && ($elem != '*')) {
                        // Insert a temporary value to the target table
                        $strSQL    = 'INSERT INTO `' .$arrRelData['tableName1']. '` ' .
                            'SET `' .$arrRelData['target1']."`='".$elem."', ".
                            '`config_id`=' .$this->intDomainId.", `active`='0', `last_modified`=NOW()";
                        $booResult = $this->myDBClass->insertData($strSQL);
                        if ($booResult == false) {
                            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                        }
                        $intSlaveId = $this->myDBClass->intLastId;
                    }
                    // Insert relations
                    $strSQL    = 'INSERT INTO `' .$arrRelData['linkTable']. '` ' .
                        'SET `idMaster` = ' .$intDataId. ', `idSlave` = ' .$intSlaveId. ', `exclude`=' .$intExclude;
                    $booResult = $this->myDBClass->insertData($strSQL);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                    // Keep values
                    if (($strDataTable == 'tbl_servicedependency') || ($strDataTable == 'tbl_serviceescalation')) {
                        $strTemp = '';
                        if (($strKey == 'dependent_host_name') || ($strKey == 'host_name')) {
                            $strTemp .= $intSlaveId. ',';
                        } elseif (($strKey == 'dependent_hostgroup_name') || ($strKey == 'hostgroup_name')) {
                            $arrDataHostgroups = array();
                            $intDCHostgroups   = 0;
                            $strSQL = 'SELECT DISTINCT `id` FROM `tbl_host` ' .
                                'LEFT JOIN `tbl_lnkHostToHostgroup` ON `id`=`tbl_lnkHostToHostgroup`.`idMaster` ' .
                                'LEFT JOIN `tbl_lnkHostgroupToHost` ON `id`=`tbl_lnkHostgroupToHost`.`idSlave` ' .
                                "WHERE (`tbl_lnkHostgroupToHost`.`idMaster` = $intSlaveId ".
                                "OR `tbl_lnkHostToHostgroup`.`idSlave` = $intSlaveId) ".
                                "AND `active`='1' AND `config_id`=".$this->intDomainId;
                            $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataHostgroups, $intDCHostgroups);
                            if ($booReturn && ($intDCHostgroups != 0)) {
                                foreach ($arrDataHostgroups as $elem2) {
                                    $strTemp .= $elem2['id']. ',';
                                }
                            }
                        }
                        if (substr_count($strKey, 'dependent') != 0) {
                            $this->strList1 .= $strTemp;
                        } else {
                            $this->strList2 .= $strTemp;
                        }
                    }
                }
                // Update field values in master table
                if (substr_count($strValue, '*') != 0) {
                    $intRelValue = 2;
                } else {
                    $intRelValue = 1;
                }
                if ($intTplOption == 1) {
                    $strSQL = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']."`=$intRelValue, ".
                        '`' .$arrRelData['fieldName']. '_tploptions` = ' .$intOption. ' WHERE `id` = ' .$intDataId;
                } else {
                    $strSQL = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']."`=$intRelValue ".
                        'WHERE `id` = ' .$intDataId;
                }
                $booResult  = $this->myDBClass->insertData($strSQL);
                if ($booResult == false) {
                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                }
            }
        }
    }

    /**
     * Inserts a relation type 3 (templates)
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     */
    public function writeRelation3($strValue, $intDataId, $strDataTable, $arrRelData)
    {
        // Define variables
        $intSlaveId = 0;
        $intTable   = 0;
        $intSortNr  = 1;
        if (strtolower(trim($strValue)) == 'null') {
            // Update data in master table
            $strSQL = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']. '` = 0, ' .
                '`' .$arrRelData['fieldName']. '_tploptions` = 1  WHERE `id` = ' .$intDataId;
            $this->myDBClass->insertData($strSQL);
        } else {
            if (0 === strpos(trim($strValue), '+')) {
                $intOption = 0;
                $strValue = str_replace('+', '', $strValue);
            } else {
                $intOption = 2;
            }
            // Remove old relations
            $strSQL    = 'DELETE FROM `' .$arrRelData['linkTable']. '` WHERE `idMaster` = ' .$intDataId;
            $booResult = $this->myDBClass->insertData($strSQL);
            if ($booResult == false) {
                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
            }
            // Decompose data value
            $arrValues = explode(',', $strValue);
            // Process data values
            foreach ($arrValues as $elem) {
                // Does the template already exist? (table 1)
                $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName1']. '` ' .
                    'WHERE `' .$arrRelData['target1']."` = '".$elem."' AND `config_id`=".$this->intDomainId;
                $strId  = $this->myDBClass->getFieldData($strSQL);
                if ($strId != '') {
                    $intSlaveId = (int)$strId;
                    $intTable = 1;
                }
                if ($intSlaveId == 0) {
                    // Does the template already exist? (table 2)
                    $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName2']. '` ' .
                        'WHERE `' .$arrRelData['target2']."` = '".$elem."' AND `config_id`=".$this->intDomainId;
                    $strId  = $this->myDBClass->getFieldData($strSQL);
                    if ($strId != '') {
                        $intSlaveId = (int)$strId;
                        $intTable   = 2;
                    }
                }
                if ($intSlaveId == 0) {
                    // Insert a temporary value to the target table
                    $strSQL    = 'INSERT INTO `' .$arrRelData['tableName1']. '` ' .
                        'SET `' .$arrRelData['target1']."` = '".$elem."', `config_id`=".$this->intDomainId. ', ' .
                        "`active`='0', `last_modified`=NOW()";
                    $booResult = $this->myDBClass->insertData($strSQL);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                    $intSlaveId = $this->myDBClass->intLastId;
                    $intTable   = 1;
                }
                // Insert relations
                $strSQL    = 'INSERT INTO `' .$arrRelData['linkTable']. '` ' .
                    'SET `idMaster` = ' .$intDataId. ', `idSlave`=' .$intSlaveId. ', `idSort`=' .$intSortNr. ', ' .
                    '`idTable` = ' .$intTable;
                $booResult = $this->myDBClass->insertData($strSQL);
                if ($booResult == false) {
                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                }
                $intSortNr++;
                $intSlaveId = 0;
                // Update field data in master table
                $strSQL    = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']. '` = 1, ' .
                    '`' .$arrRelData['fieldName']. '_tploptions` = ' .$intOption. ' WHERE `id` = ' .$intDataId;
                $booResult = $this->myDBClass->insertData($strSQL);
                if ($booResult == false) {
                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                }
            }
        }
    }

    /**
     * Inserts a relation type 4 (free variables)
     * @param string $strKey                    Data field name
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     * @return int                              0 = successful / 1 = error
     */
    public function writeRelation4($strKey, $strValue, $intDataId, $strDataTable, $arrRelData)
    {
        // Define variables
        $intReturn = 0;
        // Remove empty variables
        if (($strKey == '') || ($strValue == '')) {
            $intReturn = 1;
        }
        // Remove NagiosQL variables
        if ($strKey == '_NAGIOSQL_CONFIG_NAME') {
            $intReturn = 1;
        }
        if ($intReturn == 0) {
            // Remove old variables
            $strSQL = 'SELECT * FROM '.$arrRelData['linkTable'].' WHERE idMaster='.$intDataId;
            $booResult = $this->myDBClass->hasDataArray($strSQL, $arrLinkData, $intLinkCount);
            if ($booResult && ($intLinkCount != 0)) {
                /** @var array $arrLinkData */
                foreach ($arrLinkData as $elem) {
                    $strSQL1 = 'DELETE FROM tbl_variabledefinition WHERE id=' .$elem['idSlave'];
                    $booResult = $this->myDBClass->insertData($strSQL1);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                    $strSQL2 = 'DELETE FROM '.$arrRelData['linkTable'].' WHERE idMaster='.$elem['idMaster'];
                    $booResult = $this->myDBClass->insertData($strSQL2);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                }
            }
            // Insert values to the table
            $strSQL = "INSERT INTO `tbl_variabledefinition` SET `name` = '" . addslashes($strKey) . "', " .
                "`value` = '" . addslashes($strValue) . "', `last_modified`=now()";
            $booResult = $this->myDBClass->insertData($strSQL);
            if ($booResult == false) {
                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
            }
            $intSlaveId = $this->myDBClass->intLastId;
            // Insert relations to the table
            $strSQL = 'INSERT INTO `' . $arrRelData['linkTable'] . '` ' .
                'SET `idMaster` = ' . $intDataId . ', `idSlave` = ' . $intSlaveId;
            $booResult = $this->myDBClass->insertData($strSQL);
            if ($booResult == false) {
                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
            }
            // Update data in master table
            $strSQL = 'UPDATE `' . $strDataTable . '` SET `use_variables` = 1 WHERE `id` = ' . $intDataId;
            $booResult = $this->myDBClass->insertData($strSQL);
            if ($booResult == false) {
                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
            }
        }
        return $intReturn;
    }

    /**
     * Inserts a relation type 5 (1:1 check command)
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     */
    public function writeRelation5($strValue, $intDataId, $strDataTable, $arrRelData)
    {
        // Extract data values
        $arrCommand = explode('!', $strValue);
        $strValue   = $arrCommand[0];
        // Define variables
        $intSlaveId = 0;
        if (strtolower(trim($strValue)) == 'null') {
            // Update data in master table
            $strSQL   = 'UPDATE `' .$strDataTable. '` SET `' .$arrRelData['fieldName']. '` = -1 WHERE `id` = ' .
                $intDataId;
            $booResult  = $this->myDBClass->insertData($strSQL);
            if ($booResult == false) {
                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
            }
        } else {
            // Decompose data values
            $arrValues = explode(',', $strValue);
            // Process data values
            foreach ($arrValues as $elem) {
                // Does the entry already exist?
                $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName1']. '` ' .
                    'WHERE `' .$arrRelData['target1']."` = '".$elem."' AND `config_id`=".$this->intDomainId;
                $strId  = $this->myDBClass->getFieldData($strSQL);
                if ($strId != '') {
                    $intSlaveId = (int)$strId;
                }
                if ($intSlaveId == 0) {
                    // Insert a temporary value in target table
                    $strSQL    = 'INSERT INTO `' .$arrRelData['tableName1']. '` ' .
                        'SET `' .$arrRelData['target1']."` = '".$elem."', `config_id`=".$this->intDomainId. ', ' .
                        "`active`='0', `last_modified`=NOW()";
                    $booResult = $this->myDBClass->insertData($strSQL);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                    $intSlaveId = $this->myDBClass->intLastId;
                }
                // Update data in master table
                $arrCommand[0] = $intSlaveId;
                $strValue      = implode('!', $arrCommand);
                $strSQL        = 'UPDATE `' .$strDataTable. '` ' .
                    'SET `' .$arrRelData['fieldName']."`='".$this->myDBClass->realEscape($strValue)."' ".
                    'WHERE `id` = ' .$intDataId;
                $booResult     = $this->myDBClass->insertData($strSQL);
                if ($booResult == false) {
                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                }
            }
        }
    }

    ///////////////////////////////////////////////////////////////////////////////////////////
    /**
     * Inserts a relation type 5 (1:n:n service groups)
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     */
    public function writeRelation6($strValue, $intDataId, $strDataTable, $arrRelData)
    {
        // Define variables
        $intSlaveIdH  = 0;
        $intSlaveIdHG = 0;
        // Decompose data value
        $arrValues    = explode(',', $strValue);
        // Remove data from link table
        $strSQL    = 'DELETE FROM `' .$arrRelData['linkTable']. '` WHERE `idMaster` = ' .$intDataId;
        $booResult = $this->myDBClass->insertData($strSQL);
        if ($booResult == false) {
            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
        }
        // Check the sum of elements
        if (\count($arrValues) % 2 != 0) {
            $this->strErrorMessage .= translate('Error: incorrect number of arguments - cannot import service group ' .
                    'members'). '::';
        } else {
            // Process data values
            $intCounter = 1;
            foreach ($arrValues as $elem) {
                if ($intCounter % 2 == 0) {
                    // Does the host entry already exist?
                    $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName1']. '` ' .
                        'WHERE `' .$arrRelData['target1']."` = '".$strValue."' AND `active`='1' ".
                        'AND `config_id`=' .$this->intDomainId;
                    $strId  = $this->myDBClass->getFieldData($strSQL);
                    if ($strId != '') {
                        $intSlaveIdH = (int)$strId;
                    }
                    // Does a hostgroup entry already exist?
                    if ($intSlaveIdH == 0) {
                        $strSQL = "SELECT `id` FROM `tbl_hostgroup` WHERE `hostgroup_name` = '".$strValue."' ".
                            "AND `active`='1' AND `config_id`=".$this->intDomainId;
                        $strId  = $this->myDBClass->getFieldData($strSQL);
                        if ($strId != '') {
                            $intSlaveIdHG = (int)$strId;
                        }
                    }
                    if (($intSlaveIdH == 0) && ($intSlaveIdHG == 0)) {
                        // Insert a temporary value in table
                        $strSQL    = 'INSERT INTO `' .$arrRelData['tableName1']. '` ' .
                            'SET `' .$arrRelData['target1']."` = '".$strValue."', ".
                            '`config_id`=' .$this->intDomainId.", `active`='0', `last_modified`=NOW()";
                        $booResult = $this->myDBClass->insertData($strSQL);
                        if ($booResult == false) {
                            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                        }
                        $intSlaveIdH    = $this->myDBClass->intLastId;
                    }
                    // Does the service entry already exist?
                    if ($intSlaveIdH != 0) {
                        $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName2']. '` ' .
                            'LEFT JOIN `tbl_lnkServiceToHost` ON `id` = `idMaster` ' .
                            'WHERE `' .$arrRelData['target2']."` = '".$elem."' AND `idSlave` = ".$intSlaveIdH. ' ' .
                            'AND `config_id`=' .$this->intDomainId;
                        $strId  = $this->myDBClass->getFieldData($strSQL);
                        if ($strId == '') {
                            $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName2']. '` ' .
                                'LEFT JOIN `tbl_lnkServiceToHostgroup` ON ' .
                                '`id`=`tbl_lnkServiceToHostgroup`.`idMaster` ' .
                                'LEFT JOIN `tbl_lnkHostgroupToHost` ON ' .
                                '`tbl_lnkHostgroupToHost`.`idMaster`=`tbl_lnkServiceToHostgroup`.`idSlave` ' .
                                'WHERE `' .$arrRelData['target2']."` = '".$elem."' AND ".
                                '`tbl_lnkHostgroupToHost`.`idSlave` = ' .$intSlaveIdH. ' AND ' .
                                "`active`='1' AND `config_id`=".$this->intDomainId;
                            $strId  = $this->myDBClass->getFieldData($strSQL);
                        }
                        if ($strId == '') {
                            $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName2']. '` ' .
                                'LEFT JOIN `tbl_lnkServiceToHostgroup` ON ' .
                                '`id` = `tbl_lnkServiceToHostgroup`.`idMaster` ' .
                                'LEFT JOIN `tbl_lnkHostToHostgroup` ON ' .
                                '`tbl_lnkHostToHostgroup`.`idSlave`=`tbl_lnkServiceToHostgroup`.`idSlave` ' .
                                'WHERE `' .$arrRelData['target2']."` = '".$elem."' AND ".
                                '`tbl_lnkHostToHostgroup`.`idMaster` = ' .$intSlaveIdH. ' AND ' .
                                "`active`='1' AND `config_id`=".$this->intDomainId;
                            $strId  = $this->myDBClass->getFieldData($strSQL);
                        }
                    } elseif ($intSlaveIdHG != 0) {
                        $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName2']. '` ' .
                            'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `id` = `idMaster` ' .
                            'WHERE `' .$arrRelData['target2']."` = '".$elem."' AND `idSlave`=".$intSlaveIdHG. ' ' .
                            "AND `active`='1' AND `config_id`=".$this->intDomainId;
                        $strId  = $this->myDBClass->getFieldData($strSQL);
                    }
                    if ($strId != '') {
                        $intSlaveIdS = (int)$strId;
                    } else {
                        $intSlaveIdS = 0;
                    }
                    if ($intSlaveIdS == 0) {
                        // Insert a temporary value in table
                        $intHostName      = 0;
                        $intHostgroupName = 0;
                        if ($intSlaveIdH != 0) {
                            $intHostName        = 1;
                        } elseif ($intSlaveIdHG != 0) {
                            $intHostgroupName    = 1;
                        }
                        $strSQL    = 'INSERT INTO `' .$arrRelData['tableName2']. '` ' .
                            "SET `config_name`='imp_tmp_by_servicegroup', `host_name`=$intHostName, ".
                            "`hostgroup_name`=$intHostgroupName, `".$arrRelData['target2']."` = '".$elem."', ".
                            '`config_id`=' .$this->intDomainId.", `active`='0', `last_modified`=NOW()";
                        $booResult = $this->myDBClass->insertData($strSQL);
                        if ($booResult == false) {
                            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                        }
                        $intSlaveIdS = $this->myDBClass->intLastId;
                        // Make a relation from temp service to host / hostgroup
                        if ($intSlaveIdH != 0) {
                            $strSQL    = 'INSERT INTO `tbl_lnkServiceToHost` ' .
                                "SET `idMaster`='".$intSlaveIdS."', `idSlave`=".$intSlaveIdH.", `exclude`='0'";
                            $booResult = $this->myDBClass->insertData($strSQL);
                            if ($booResult == false) {
                                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                            }
                        } elseif ($intSlaveIdHG != 0) {
                            $strSQL    = 'INSERT INTO `tbl_lnkServiceToHostgroup` ' .
                                "SET `idMaster`='".$intSlaveIdS."', `idSlave`=".$intSlaveIdHG. ', ' .
                                "`exclude`='0'";
                            $booResult = $this->myDBClass->insertData($strSQL);
                            if ($booResult == false) {
                                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                            }
                        }
                    }
                    // Insert relation
                    $strSQL    = 'INSERT INTO `' .$arrRelData['linkTable']. '` ' .
                        'SET `idMaster`=' .$intDataId. ', `idSlaveH`=' .$intSlaveIdH. ', `idSlaveS`=' .$intSlaveIdS;
                    $booResult = $this->myDBClass->insertData($strSQL);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                    // Update data in master table
                    $strSQL    = 'UPDATE `' .$strDataTable. '` ' .
                        'SET `' .$arrRelData['fieldName']. '` = 1 WHERE `id` = ' .$intDataId;
                    $booResult = $this->myDBClass->insertData($strSQL);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                } else {
                    $strValue = $elem;
                }
                $intCounter++;
            }
        }
    }

    /**
     * Inserts a relation type 6 (1:n:str)
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     */
    public function writeRelation7($strValue, $intDataId, $strDataTable, $arrRelData)
    {
        // Delete data from link table
        $strSQL    = 'DELETE FROM `' .$arrRelData['linkTable']. '` WHERE `idMaster` = ' .$intDataId;
        $booResult  = $this->myDBClass->insertData($strSQL);
        if ($booResult == false) {
            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
        }
        // Decompose data value
        $arrValues = explode(',', $strValue);
        // Process data values
        foreach ($arrValues as $elem) {
            if ($elem != '*') {
                $strWhere = '';
                // Exclude values
                if (0 === strpos($elem, '!')) {
                    $intExclude = 1;
                    $elem = substr($elem, 1);
                } else {
                    $intExclude = 0;
                }
                // Does the entry already exist?
                $strSQL = 'SELECT `id` FROM `' .$arrRelData['tableName1']. '` ' .
                    'WHERE `' .$arrRelData['target1']."`='".$elem."' $strWhere ".
                    'AND `config_id`=' .$this->intDomainId;
                $strId  = $this->myDBClass->getFieldData($strSQL);
                if ($strId != '') {
                    $intSlaveId = (int)$strId;
                } else {
                    $intSlaveId = 0;
                }
                if (($intSlaveId == 0) && ($elem != '*')) {
                    // Insert a temporary value to the target table
                    $strSQL    = 'INSERT INTO `' .$arrRelData['tableName1']. '` ' .
                        'SET `' .$arrRelData['target1']."` = '".$elem."', `host_name`=2, `hostgroup_name`=2, ".
                        "`config_name`='imp_tmp_by_servicedependency', `config_id`=".$this->intDomainId. ', ' .
                        "`active`='0', `last_modified`=NOW()";
                    $booResult = $this->myDBClass->insertData($strSQL);
                    if ($booResult == false) {
                        $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                    }
                    $intSlaveId = $this->myDBClass->intLastId;
                }
                // Insert relations
                $strSQL    = 'INSERT INTO `' .$arrRelData['linkTable']. '` ' .
                    'SET `idMaster` = ' .$intDataId. ', `idSlave` = ' .$intSlaveId.", `strSlave`='".$elem."', ".
                    '`exclude`=' .$intExclude;
                $booResult = $this->myDBClass->insertData($strSQL);
                if ($booResult == false) {
                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                }
            }
            // Update field values in master table
            if (substr_count($strValue, '*') != 0) {
                $intRelValue = 2;
            } else {
                $intRelValue = 1;
            }
            $strSQL    = 'UPDATE `' .$strDataTable. '` ' .
                'SET `' .$arrRelData['fieldName']."` = $intRelValue WHERE `id` = ".$intDataId;
            $booResult = $this->myDBClass->insertData($strSQL);
            if ($booResult == false) {
                $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
            }
        }
    }

    /**
     * Inserts a relation type 6 (service and servicetemplate parents - 1:service:host)
     * @param string $strValue                  Data value
     * @param int $intDataId                    Data ID
     * @param string $strDataTable              Data table (Master)
     * @param array $arrRelData                 Relation data
     */
    public function writeRelation8($strValue, $intDataId, $strDataTable, $arrRelData)
    {
        // Decompose data value
        $arrValues = explode(',', $strValue);
        // Delete data from link table
        $strSQL    = 'DELETE FROM `' .$arrRelData['linkTable']. '` WHERE `idMaster` = ' .$intDataId;
        $booResult  = $this->myDBClass->insertData($strSQL);
        if ($booResult == false) {
            $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
        }
        // Check the sum of elements
        /** @noinspection ExplodeMissUseInspection */
        if (count($arrValues) % 2 != 0) {
            $this->strErrorMessage .= translate('Error: incorrect number of arguments - cannot import service parent ' .
                    'members'). '::';
        } else {
            // Process data values
            $intCounter  = 1;
            $strHostName = '';
            foreach ($arrValues as $elem) {
                if ($intCounter % 2 == 0) {
                    $strServiceName = $elem;
                    if (($strServiceName != '') && ($strHostName != '')) {
                        $strSQL = 'SELECT tbl_service.id AS id_1, C.id AS id_2, D.id AS id_3, E.id AS id_4 '
                            . 'FROM tbl_service '
                            . 'LEFT JOIN tbl_lnkServiceToHost ON tbl_service.id=tbl_lnkServiceToHost.idMaster '
                            . 'LEFT JOIN tbl_lnkServiceToHostgroup '
                            . 'ON tbl_service.id=tbl_lnkServiceToHostgroup.idMaster '
                            . 'LEFT JOIN tbl_lnkHostgroupToHost AS A ON tbl_lnkServiceToHostgroup.idSlave=A.idMaster '
                            . 'LEFT JOIN tbl_lnkHostToHostgroup AS B ON tbl_lnkServiceToHostgroup.idSlave=B.idSlave '
                            . 'LEFT JOIN tbl_host AS C ON A.idSlave=C.id '
                            . 'LEFT JOIN tbl_host AS D ON B.idMaster=D.id '
                            . 'LEFT JOIN tbl_host AS E ON tbl_lnkServiceToHost.idSlave=E.id '
                            . "WHERE tbl_service.service_description='".$strServiceName."' "
                            . "AND (C.host_name='".$strHostName."' OR D.host_name='".$strHostName."' "
                            . "OR E.host_name='".$strHostName."')";
                        $booResult = $this->myDBClass->hasDataArray($strSQL, $arrDataset, $intCount);
                        if ($booResult && ($intCount == 1)) {
                            $intServiceId = 0;
                            $intHostId    = 0;
                            $intId1       = $arrDataset[0]['id_1'];
                            $intId2       = $arrDataset[0]['id_2'];
                            $intId3       = $arrDataset[0]['id_3'];
                            $intId4       = $arrDataset[0]['id_4'];
                            if (($intId1!= null) && ($intId1 != 0) && ($intServiceId == 0)) {
                                $intServiceId = (int)$intId1;
                            }
                            $intHostSum = 0;
                            if (($intId2 != null) && ($intId2 != 0) && ($intHostId == 0)) {
                                $intHostId   = (int)$intId2;
                                $intHostSum += $intHostId;
                            }
                            if (($intId3 != null) && ($intId3 != 0) && ($intHostId == 0)) {
                                $intHostId   = (int)$intId3;
                                $intHostSum += $intHostId;
                            }
                            if (($intId4 != null) && ($intId4 != 0) && ($intHostId == 0)) {
                                $intHostId   = (int)$intId4;
                                $intHostSum += $intHostId;
                            }
                            if (($intHostId == $intHostSum) && ($intServiceId != 0) && ($intHostId != 0)) {
                                $strSQL = 'INSERT INTO ' .$arrRelData['linkTable']. ' '
                                    . "SET idMaster=$intDataId, idSlave=$intServiceId, idHost=$intHostId";
                                $booResult = $this->myDBClass->insertData($strSQL);
                                if ($booResult == false) {
                                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                                }
                                $strSQL    = 'UPDATE `' .$strDataTable. '` ' .
                                    'SET `' .$arrRelData['fieldName']. '` = 1 WHERE `id` = ' .$intDataId;
                                $booResult = $this->myDBClass->insertData($strSQL);
                                if ($booResult == false) {
                                    $this->strErrorMessage .= $this->myDBClass->strErrorMessage;
                                }
                            } else {
                                $this->strErrorMessage .= translate('Error: cannot import the service parent member ')
                                    . $strServiceName . '-' . $strHostName . '. '
                                    . translate('This combination is not unique!') . '::';
                            }
                        } else {
                            $this->strErrorMessage .= translate('Error: cannot import the service parent member ')
                                . $strServiceName. '-' .$strHostName. '. '
                                . translate('This combination is not unique or does not exist!').'::';
                        }
                    }
                } else {
                    $strHostName = $elem;
                }
                $intCounter++;
            }
        }
    }
}
