selectDb('edi'); $db->getHandler()->options(MYSQLI_OPT_LOCAL_INFILE, TRUE); $tmpDir = '/tmp/floricode'; // Establish the FTP connection $ftpConf = $db->getRow('SELECT host, user, password FROM ftpConfig'); echo "Openning FTP connection to {$ftpConf['host']}\n"; $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']); // Gets the list with the tables to update set_time_limit(0); $res = $db->query( 'SELECT fileName, toTable, file, updated FROM fileConfig'); $dwFiles = []; if (!file_exists($tmpDir)) mkdir($tmpDir); while ($row = $res->fetch_assoc()) try { $file = $row['file']; $table = $row['toTable']; $baseName = $row['fileName']; if ($row['updated']) { $updated = DateTime::createFromFormat('Y-m-d', $row['updated']); $updated->setTime(0, 0, 0); } else $updated = NULL; $remoteFile = "codes/$file.ZIP"; $zipFile = "$tmpDir/$file.zip"; $ucDir = "$tmpDir/$file"; // Downloads and decompress the file with the data if (!isset($dwFiles[$file])) { $dwFiles[$file] = TRUE; echo "Downloading $remoteFile\n"; 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 (empty($fileName)) throw new Exception("Import file for table $table does not exist"); // If data is updated, omits the table $lastUpdated = substr($fileName, -10, 6); $lastUpdated = DateTime::createFromFormat('dmy', $lastUpdated); $lastUpdated->setTime(0, 0, 0); if (isset($updated) && $lastUpdated <= $updated) { echo "Table $table is updated, omitted\n"; continue; } // Updates the table echo "Dumping data to table $table\n"; $db->query("START TRANSACTION"); $db->query("DELETE FROM {$db->quote($table)}"); $db->queryFromFile(__DIR__."/sql/$table", ['file' => $fileName]); $db->query("UPDATE fileConfig SET updated = # WHERE fileName = #", [$lastUpdated, $baseName] ); $db->query("COMMIT"); } catch (Exception $e) { error_log($e->getMessage()); $db->query('ROLLBACK'); } shell_exec("rm -R $tmpDir"); ftp_close($ftpConn); echo "Update completed\n"; } }