/** * Given the query, creates a command to connect to the db and generate the output file, returns the filename * @param $query * @return string */ function getJobCommand($query) { global $conf; //map csv headers $columnMappings = $this->requestDataSet->displayConfiguration->csv->elementsColumn; $columnMappings = (array) $columnMappings; //Handle referenced columns foreach ($columnMappings as $key => $value) { if (strpos($value, "@") !== false) { $column_parts = explode("@", $value); $columnMappings[$key] = $column_parts[0]; } } $columnMappings = array_flip($columnMappings); $end = strpos($query, 'FROM'); $select_part = substr($query, 0, $end); $select_part = str_replace("SELECT", "", $select_part); $sql_parts = explode(",", $select_part); $new_select_part = "SELECT "; foreach ($sql_parts as $sql_part) { $sql_part = trim($sql_part); $column = $sql_part; $alias = ""; //Remove "AS" if (strpos($sql_part, "AS") !== false) { $pos = strpos($column, " AS"); $sql_part = substr($sql_part, 0, $pos); } //get only column if (strpos($sql_part, ".") !== false) { $alias = substr($sql_part, 0, 3); $column = substr($sql_part, 3); } //Handle derived columns switch ($column) { case "prime_vendor_name": $new_column = "CASE WHEN " . $alias . $column . " IS NULL THEN 'N/A' ELSE " . $alias . $column . " END"; $new_select_part .= $new_column . ' AS \\"' . $columnMappings[$column] . '\\",' . "\n"; break; case "minority_type_name": $new_column = "CASE \n"; $new_column .= "WHEN " . $alias . $column . " = 2 THEN 'Black American' \n"; $new_column .= "WHEN " . $alias . $column . " = 3 THEN 'Hispanic American' \n"; $new_column .= "WHEN " . $alias . $column . " = 7 THEN 'Non-M/WBE' \n"; $new_column .= "WHEN " . $alias . $column . " = 9 THEN 'Women' \n"; $new_column .= "WHEN " . $alias . $column . " = 11 THEN 'Individuals and Others' \n"; $new_column .= "ELSE 'Asian American' END"; $new_select_part .= $new_column . ' AS \\"' . $columnMappings[$column] . '\\",' . "\n"; break; case "vendor_type": $new_column = "CASE WHEN " . $alias . $column . " ~* 's' THEN 'Yes' ELSE 'No' END"; $new_select_part .= $new_column . ' AS \\"' . $columnMappings[$column] . '\\",' . "\n"; break; default: $new_select_part .= $alias . $column . ' AS \\"' . $columnMappings[$column] . '\\",' . "\n"; break; } } $new_select_part = rtrim($new_select_part, ",\n"); $query = substr_replace($query, $new_select_part, 0, $end); try { $fileDir = _checkbook_project_prepare_data_feeds_file_output_dir(); $filename = _checkbook_project_generate_uuid() . '.csv'; $tmpDir = isset($conf['check_book']['tmpdir']) && is_dir($conf['check_book']['tmpdir']) ? rtrim($conf['check_book']['tmpdir'], '/') : '/tmp'; $command = $conf['check_book']['data_feeds']['command']; if (!is_writable($tmpDir)) { LogHelper::log_error("{$tmpDir} is not writable. Please make sure this is writable to generate export file."); return $filename; } $tempOutputFile = $tmpDir . '/' . $filename; $outputFile = DRUPAL_ROOT . '/' . $fileDir . '/' . $filename; $cmd = $command . " -c \"\\\\COPY (" . $query . ") TO '" . $tempOutputFile . "' WITH DELIMITER ',' CSV HEADER \" "; shell_exec($cmd); $move_cmd = "mv {$tempOutputFile} {$outputFile}"; shell_exec($move_cmd); } catch (Exception $e) { $value = TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM; TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM = NULL; LogHelper::log_error($e); $msg = "Command used to generate the file: " . $command; $msg .= "Error generating DB command: " . $e->getMessage(); LogHelper::log_error($msg); TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM = $value; } return $filename; }
/** * Executes the shell commands with error logging * @param $commands */ private function processCommands($commands) { $current_command = ""; try { foreach ($commands as $command) { $current_command = $command; shell_exec($command); } } catch (Exception $e) { $value = TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM; TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM = NULL; LogHelper::log_error($e); $msg = "Command used to generate the file: " . $current_command; $msg .= "Error generating DB command: " . $e->getMessage(); LogHelper::log_error($msg); TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM = $value; } }
return; }*/ $dir .= '/' . $conf['check_book']['ref_data_dir']; if (!file_prepare_directory($dir, FILE_CREATE_DIRECTORY)) { LogHelper::log_error("Could not prepare directory {$dir} for generating reference data."); echo $failure; return; } /*if(!is_link($dir) && !@chmod($dir,0777)){ LogHelper::log_error("Could not change permissions to 777 for $dir."); echo $failure; return; }*/ foreach ($ref_data_queries as $file_name => $ref_data_query) { $file = DRUPAL_ROOT . '/' . $dir . '/' . $file_name . '.csv'; $command = $conf['check_book']['data_feeds']['command'] . " -c \"\\\\COPY (" . $ref_data_query . ") TO '" . $file . "' WITH DELIMITER ',' CSV HEADER QUOTE '\\\"' ESCAPE '\\\"' \" "; try { LogHelper::log_notice("Command for generating {$file_name} ref data: " . $command); shell_exec($command); LogHelper::log_notice("Completed executing DB query for {$file_name}. " . (is_file($file) ? "Generated file : {$file}" : "Could not generate file for {$file_name}")); } catch (Exception $e) { $value = TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM; TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM = NULL; LogHelper::log_error($e); LogHelper::log_error("Erorr executing DB query for generating {$file_name} ref data: " . $command . ". Exception is: " . $e); TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM = $value; echo $failure; return; } } echo $success;
* but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ /** * Script to handle process queue jobs. */ set_time_limit(0); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); //_drush_bootstrap_drupal_full(); define('MAXIMUM_JOBS_TO_RUN', 1); TextLogMessageTrimmer::$LOGGED_TEXT_LENGTH__MAXIMUM = 512 * 10; // Make sure data is not getting updated: // TODO - This will be handled by server scripts. $log_id = date('mdYHis'); LogHelper::log_notice("{$log_id}: Cron invoked for processing next job in queue."); if (!QueueUtil::isJobsInProgress()) { LogHelper::log_notice("{$log_id}: No job is in progress. Getting next job."); try { $job_details = QueueUtil::getNextJob(); } catch (Exception $claim_exception) { LogHelper::log_error("{$log_id}: Error while fetching job from queue: " . $claim_exception); return; } if ($job_details) { try { $job_id = $job_details['job_id'];