/**
  * Funkce pro import CSV souboru
  * @param string $filename
  * @param string $dbType
  * @param User $user
  * @param string $tableName
  * @param string $encoding='utf-8'
  * @param string $delimiter=','
  * @param string $enclosure='"'
  * @param string $escapeCharacter='\\'
  * @param string $nullValue=''
  * @return DbDatasource
  * @throws \Exception
  */
 public function importCsvFile($filename, $dbType, User $user, $tableName, $encoding = 'utf-8', $delimiter = ',', $enclosure = '"', $escapeCharacter = '\\', $nullValue = '')
 {
     $columns = $this->getColsInCSV($filename, $delimiter, $enclosure, $escapeCharacter);
     if (empty($columns)) {
         throw new \Exception('No columns detected!');
     }
     $dataTypes = [];
     foreach ($columns as $column) {
         $dataTypes[] = $column->type == DbField::TYPE_NOMINAL ? 'nominal' : 'numeric';
     }
     $database = $this->databaseFactory->getDatabaseInstanceWithDefaultDbConnection($dbType, $user);
     return $database->importCsvFile($this->getFilePath($filename), $tableName, $encoding, $delimiter, $enclosure, $escapeCharacter, $nullValue, $dataTypes);
 }
 /**
  * Funkce pro aktualizaci informací o vzdálených datových zdrojích
  *
  * @param User $user
  */
 public function updateRemoteDatasourcesByUser(User $user)
 {
     $supportedDbTypes = $this->databaseFactory->getDbTypes();
     #region připravení seznamu externích
     /** @var DbDatasource[] $dbDatasources */
     $dbDatasources = [];
     $updatableDbTypes = [];
     foreach (self::$dbTypesWithRemoteDatasources as $dbType) {
         if (in_array($dbType, $supportedDbTypes)) {
             //načteme datové zdroje ze vzdálené databáze
             $database = $this->databaseFactory->getDatabaseInstanceWithDefaultDbConnection($dbType, $user);
             $remoteDbDatasources = $database->getDbDatasources();
             if (!empty($remoteDbDatasources)) {
                 foreach ($remoteDbDatasources as $remoteDbDatasource) {
                     $dbDatasources[$remoteDbDatasource->type . '-' . $remoteDbDatasource->id] = $remoteDbDatasource;
                 }
             }
             $updatableDbTypes[] = $dbType;
         }
     }
     #endregion připravení seznamu externích zdrojů
     #region zpracovani seznamu datovych zdroju
     //načteme seznam lokálních datových zdrojů
     $datasources = $this->findDatasourcesByUser($user);
     //porovnáme oba seznamy
     $updatedDatasourcesIds = [];
     $updatedDbDatasourcesIds = [];
     if (!empty($datasources) && !empty($dbDatasources)) {
         //zkusíme najít příslušné překrývající se datové zdroje
         foreach ($datasources as $key => $datasource) {
             if (!in_array($datasource->type, $updatableDbTypes)) {
                 unset($datasources[$key]);
                 continue;
                 //ignorujeme datové zdroje, které nelze tímto způsobem aktualizovat
             }
             foreach ($dbDatasources as $dbDatasource) {
                 if ($datasource->dbDatasourceId == $dbDatasource->id) {
                     if ($datasource->name != $dbDatasource->name) {
                         //aktualizace názvu datového zdroje (došlo k jeho přejmenování) a uložení
                         $datasource->name = $dbDatasource->name;
                     }
                     if (!$datasource->available) {
                         $datasource->available = true;
                     }
                     if ($datasource->isModified()) {
                         $this->saveDatasource($datasource);
                     }
                     $updatedDatasourcesIds[] = $datasource->dbDatasourceId;
                     $updatedDbDatasourcesIds[] = $dbDatasource->id;
                     unset($datasources[$key]);
                     break;
                 }
             }
         }
     }
     if (!empty($datasources)) {
         foreach ($datasources as $datasource) {
             if ($datasource->available && !in_array($datasource->dbDatasourceId, $updatedDatasourcesIds)) {
                 //označení datového zdroje, který již není dostupný
                 $datasource->available = false;
                 $this->saveDatasource($datasource);
             }
         }
     }
     if (!empty($dbDatasources)) {
         $defaultDbConnections = [];
         foreach ($dbDatasources as $dbDatasource) {
             if (!in_array($dbDatasource->id, $updatedDbDatasourcesIds)) {
                 //vyřešení výchozího připojení k DB
                 if (!isset($defaultDbConnections[$dbDatasource->type])) {
                     $defaultDbConnections[$dbDatasource->type] = $this->databaseFactory->getDefaultDbConnection($dbDatasource->type, $user);
                 }
                 //přidání nového datového zdroje...
                 $datasource = Datasource::newFromDbConnection($defaultDbConnections[$dbDatasource->type]);
                 $datasource->user = $user;
                 $datasource->name = $dbDatasource->name;
                 $datasource->dbDatasourceId = $dbDatasource->id;
                 $datasource->type = $dbDatasource->type;
                 $datasource->available = true;
                 $this->datasourcesRepository->persist($datasource);
             }
         }
     }
     #endregion zpracovani seznamu datovych zdroju
 }