getSysConn (); $db->selectDb ('edi'); //$db->options (MYSQLI_OPT_LOCAL_INFILE, TRUE); $tmpDir = '/tmp/floricode'; // Establece una conexión FTP $ftpConf = $db->getRow ('SELECT host, user, password FROM ftp_config'); $ftpConn = ftp_connect ($ftpConf['host']); if (!$ftpConn) throw new Exception ('Can not connect to '. $ftpConf['host']); if (!ftp_login ($ftpConn, $ftpConf['user'], $ftpConf['password'])) throw new Exception ('Can not login to '. $ftpConf['user'] .'@'. $ftpConf['host']); // Obtiene el listado de tablas a actualizar set_time_limit (0); $res = $db->query ( 'SELECT file_name, to_table, file, updated FROM file_config'); $dwFiles = []; if (!file_exists ($tmpDir)) mkdir ($tmpDir); while ($row = $res->fetch_assoc ()) try { $file = $row['file']; $table = $row['to_table']; $baseName = $row['file_name']; if ($row['updated']) $updated = DateTime::createFromFormat ('Y-m-d', $row['updated']); else $updated = NULL; $remoteFile = "codes/$file.ZIP"; $zipFile = "$tmpDir/$file.zip"; $ucDir = "$tmpDir/$file"; // Intenta descargar y descomprimir el fichero con los datos if (!isset ($dwFiles[$file])) { $dwFiles[$file] = TRUE; if (!ftp_get ($ftpConn, $zipFile, $remoteFile, FTP_BINARY)) throw new Exception ("Error downloading $remoteFile to $zipFile"); $zip = new ZipArchive; if ($zip->open ($zipFile) !== TRUE) throw new Exception ("Can not open $zipFile"); @mkdir ($ucDir, 0774, TRUE); if (!$zip->extractTo ($ucDir)) throw new Exception ("Can not uncompress file $zipFile"); $zip->close(); unlink ($zipFile); } foreach (glob ("$ucDir/$baseName*.txt") as $fileName) break; if (!$fileName) throw new Exception ("Import file for table $table does not exist"); // Si los datos están actualizados omite la tabla $lastUpdated = substr ($fileName, -10, 6); $lastUpdated = DateTime::createFromFormat ('dmy', $lastUpdated); if ($updated && $lastUpdated <= $updated) continue; // Actualiza los datos de la tabla $importQuery = $db->loadFromFile ("sql/$table", ['file' => $fileName]); $db->multiQuery ( "START TRANSACTION; DELETE FROM $table; $importQuery; UPDATE file_config SET updated = # WHERE file_name = #; COMMIT;", [$lastUpdated, $baseName] ); do { $db->storeResult (); } while ($db->moreResults () && $db->nextResult ()); } catch (Exception $e) { $db->query ('ROLLBACK'); error_log ($e->getMessage ()); } shell_exec ("rm -R $tmpDir"); ftp_close ($ftpConn); } } ?>