public function load(AbstractMetaModel $environment_metamodel, array $filters = NULL) {
        LogHelper::log_notice(t('Loading Environment Meta Model from GovDashboard Content Types ...'));

        // Note we do not apply filters because we do not have any
        // if we want to use the filters we would need to prepare list of data source names
        // but to prepare those name we need to load meta model.
        // but that is what we are trying to do in this code
        // Catch 22
        if (isset($filters)) {
            throw new UnsupportedOperationException(t('Filters are not supported during data source loading'));
        }

        $datamartNodes = gd_datamart_get_datamarts(LOAD_ENTITY);

        // preparing data sources
        foreach ($datamartNodes as $datamartNode) {
            GD_DataMartMetaModelLoaderHelper::prepareDataSource($environment_metamodel, $datamartNode);
        }

        // finalizing the preparation
        foreach($datamartNodes as $datamartNode) {
            $datasource = GD_DataMartMetaModelLoaderHelper::getDataSourceByNodeId($environment_metamodel->datasources, $datamartNode->nid);

            GD_DataMartMetaModelLoaderHelper::finalizeDataSourcePreparation($environment_metamodel, $datasource);
        }

        LogHelper::log_info(t('Processed @datamartCount data mart node(s)', array('@datamartCount' => count($datamartNodes))));
    }
 protected function prepareColumnsMetaDataProperties(DataSourceMetaData $datasource, array $tableNames)
 {
     $datasourceHandler = DataSourceQueryFactory::getInstance()->getHandler($datasource->type);
     $sql = 'SELECT c.relname AS ' . self::PROPERTY__TABLE_NAME . ', ' . '       a.attname AS ' . self::PROPERTY__COLUMN_NAME . ', ' . '       a.attnum AS ' . self::PROPERTY__COLUMN_INDEX . ', ' . '       t.typname AS ' . self::PROPERTY__COLUMN_TYPE . '  FROM pg_class c INNER JOIN pg_namespace ns ON ns.oid = c.relnamespace' . '       INNER JOIN pg_attribute a ON a.attrelid = c.oid' . '       INNER JOIN pg_type t ON t.oid = a.atttypid' . " WHERE c.relname IN ('" . implode("', '", $tableNames) . "')" . "   AND c.relkind IN ('r','v')" . "   AND ns.nspname = '{$datasource->schema}'" . '   AND a.attnum > 0';
     LogHelper::log_info(new StatementLogMessage('metadata.dataset.systemTable', $sql));
     return $datasourceHandler->executeQuery(new DataControllerCallContext(), $datasource, $sql, new PassthroughResultFormatter());
 }
    public function apply ( $patients ) {

        if ( !is_array($patients) ) {
            $patients = array($patients);
        }

        foreach ( $patients as $patient ) {
            \LogHelper::log_info('Applying ReportConfigRemoveColumnConfig treatment to: ' . $patient->reportNodeId);

            $node = node_load($patient->reportNodeId);

            $reportConfigText = get_node_field_value($node, 'field_report_conf', 0, 'value', FALSE);
            $reportConfig = isset($reportConfigText) ? json_decode($reportConfigText) : NULL;
            if (!isset($reportConfig)) {
                \LogHelper::log_info('Report configuration is EMPTY');
                return;
            }

            // check column configs
            if (!empty($reportConfig->columnConfigs)) {
                foreach ($reportConfig->columnConfigs as $key => $value) {
                    if (empty($value->columnId)) {
                        unset($reportConfig->columnConfigs[$key]);
                    }
                }

                $node->field_report_conf[$node->language][0]['value'] = json_encode($reportConfig);
                node_save($node);
            }
        }
    }
    public function load(AbstractMetaModel $environment_metamodel, array $filters = NULL) {
        LogHelper::log_notice(t('Loading Environment Meta Model from settings.php ...'));

        $datasourceCount = 0;

        $configurationDataSources = Environment::getInstance()->getConfigurationSection('Data Sources');
        if (isset($configurationDataSources)) {
            foreach ($configurationDataSources as $namespace => $sourceDataSources) {
                foreach ($sourceDataSources as $datasourceName => $sourceDataSource) {
                    $datasourceName = NameSpaceHelper::resolveNameSpace($namespace, $datasourceName);

                    $datasource = new DataSourceMetaData();
                    $datasource->name = $datasourceName;
                    $datasource->initializeFrom($sourceDataSource);
                    // it is possible that configuration contains 'readonly' property. We need to honor it
                    // ... and only when it is not set we mark the data source as read only
                    if (!isset($datasource->readonly)) {
                        $datasource->readonly = TRUE;
                    }

                    $environment_metamodel->registerDataSource($datasource);

                    $datasourceCount++;
                }
            }
        }

        LogHelper::log_info(t('Processed @datasourceCount data sources', array('@datasourceCount' => $datasourceCount)));
    }
    public function apply ( $patients ) {
        if ( !is_array($patients) ) {
            $patients = array($patients);
        }

        foreach ( $patients as $patient ) {
            \LogHelper::log_info('Applying ReportRepairDataset treatment to: ' . $patient->reportNodeId);

            $reportNode = node_load($patient->reportNodeId);
            $reportConfigText = get_node_field_value($reportNode, 'field_report_conf', 0, 'value', FALSE);

            $reportConfig = isset($reportConfigText) ? json_decode($reportConfigText) : NULL;
            if (!isset($reportConfig)) {
                \LogHelper::log_info('Report configuration is EMPTY');
                continue;
            }

            // check columns
            if (!empty($reportConfig->model->datasets)) {
                $reportNode->field_report_dataset_sysnames[$reportNode->language] = array();
                foreach ($reportConfig->model->datasets as $datasetName) {
                    $reportNode->field_report_dataset_sysnames[$reportNode->language][] = array('value' => $datasetName);
                }
                node_save($reportNode);
            }

        }
    }
 public final function join(JoinController_SourceConfiguration $sourceConfigurationA, JoinController_SourceConfiguration $sourceConfigurationB)
 {
     $timeStart = microtime(TRUE);
     $result = $this->joinSourceConfigurations($sourceConfigurationA, $sourceConfigurationB);
     LogHelper::log_info(t('@className execution time: !executionTime', array('@className' => get_class($this), '!executionTime' => ExecutionPerformanceHelper::formatExecutionTime($timeStart))));
     return $result;
 }
    public function apply ( $patients ) {

        if ( !is_array($patients) ) {
            $patients = array($patients);
        }

        foreach ( $patients as $patient ) {
            \LogHelper::log_info('Applying ReportConfigRemoveFilter treatment to: ' . $patient->reportNodeId);

            $node = node_load($patient->reportNodeId);

            $reportConfigText = get_node_field_value($node, 'field_report_conf', 0, 'value', FALSE);
            $reportConfig = isset($reportConfigText) ? json_decode($reportConfigText) : NULL;
            if (!isset($reportConfig)) {
                \LogHelper::log_info('Report configuration is EMPTY');
                return;
            }

            // check column configs
            if (!empty($reportConfig->model->filters)) {
                $preservedFilters = array();
                foreach ($reportConfig->model->filters as $key => $filter) {
                    if ( $patient->filter != $filter ) {
                        $preservedFilters[] = $filter;
                    }
                }
                $reportConfig->model->filters = $preservedFilters;

                $node->field_report_conf[$node->language][0]['value'] = json_encode($reportConfig);
                node_save($node);
            }
        }
    }
 public function __call($methodName, $args)
 {
     $timeStart = microtime(TRUE);
     $result = call_user_func_array(array($this->instance, $methodName), $args);
     LogHelper::log_info(t('Data Controller execution time for @methodName(): !executionTime', array('@methodName' => $methodName, '!executionTime' => ExecutionPerformanceHelper::formatExecutionTime($timeStart))));
     return $result;
 }
    public function load(AbstractMetaModel $environment_metamodel, array $filters = NULL) {
        LogHelper::log_notice(t('Generating Environment Meta Model for Drupal database connections ...'));

        global $databases;

        $datasourceCount = 0;
        foreach ($databases as $namespace => $connections) {
            foreach ($connections as $datasourceNameOnly => $connection) {
                $datasource = new DataSourceMetaData();
                $datasource->name = NameSpaceHelper::addNameSpace($namespace, $datasourceNameOnly);
                $datasource->markAsPrivate();
                $datasource->readonly = FALSE;
                // setting required properties
                $this->setDataSourceProperty($datasource, $connection, 'type', 'driver');
                // setting other provided properties
                $this->setDataSourceExtensionProperties($datasource, $connection);

                // registering the data source
                $environment_metamodel->registerDataSource($datasource);
                $datasourceCount++;
            }
        }

        // Default database connection is shared because we store common utilities and dimensions there
        $defaultDataSource = $environment_metamodel->getDataSource(self::$DATASOURCE_NAME__DEFAULT);
        $defaultDataSource->shared = TRUE;

        LogHelper::log_info(t('Generated @datasourceCount data sources', array('@datasourceCount' => $datasourceCount)));
    }
    protected function executeManipulationStatementBatch(DataSourceMetaData $datasource, $sqls) {
        $sql = (count($sqls) == 1)
            ? $sqls
            : $this->getExtension('prepareManipulationStatementBatch')->prepare($this, $sqls);

        LogHelper::log_info(new StatementLogMessage('table.DML', $sql));
        return $this->executeStatement($datasource, $sql);
    }
    protected function updateDatasets(SystemTableMetaModelLoaderCallContext $callcontext, DataSourceMetaData $datasource) {
        $updatedDatasets = NULL;

        // processing meta data for selected datasets
        $columnsProperties = $this->loadColumnsProperties($callcontext, $datasource);
        if (isset($columnsProperties)) {
            foreach ($columnsProperties as $columnProperties) {
                $tableAccessKey = $this->adjustTableName($columnProperties[self::CN_TABLE_NAME]);
                // checking if we need to work with the table
                if (!isset($callcontext->datasets[$tableAccessKey])) {
                    continue;
                }

                $datasets = $callcontext->datasets[$tableAccessKey];

                // invalidating column indexes
                if (!isset($updatedDatasets[$tableAccessKey])) {
                    foreach ($datasets as $dataset) {
                        $dataset->invalidateColumnIndexes();
                    }

                    $updatedDatasets[$tableAccessKey] = TRUE;
                }

                foreach ($datasets as $dataset) {
                    $column = new ColumnMetaData();
                    $column->name = $this->adjustColumnName($columnProperties[self::CN_COLUMN_NAME]);
                    $column->columnIndex = $columnProperties[self::CN_COLUMN_INDEX];
                    // preparing column type
                    $column->type->databaseType = $columnProperties[self::CN_COLUMN_TYPE];
                    $this->generateColumnApplicationType($callcontext, $datasource, $column);

                    // adjusting column properties
                    if (!isset($column->type->applicationType)) {
                        $column->visible = FALSE;
                    }
                    $this->adjustColumnVisibility($callcontext, $column);

                    $dataset->initializeColumnFrom($column);
                }
            }

            // marking all selected datasets as completed
            foreach ($callcontext->datasets as $tableAccessKey => $datasets) {
                if (!isset($updatedDatasets[$tableAccessKey])) {
                    continue;
                }

                foreach ($datasets as $dataset) {
                    $dataset->markAsComplete();
                }
            }
        }

        LogHelper::log_info(t(
            'Processed system meta data about @tableCount table(s) and @columnCount column(s)',
            array('@tableCount' => count($updatedDatasets), '@columnCount' => count($columnsProperties))));
    }
 public function dropDatasetStorage(DataControllerCallContext $callcontext, DropDatasetStorageRequest $request)
 {
     $environment_metamodel = data_controller_get_environment_metamodel();
     $dataset = DatasetTypeHelper::getTableDataset($request->datasetName);
     $datasource = $environment_metamodel->getDataSource($dataset->datasourceName);
     $sql = $this->getExtension('dropTable')->generate($this, $dataset);
     LogHelper::log_info(new StatementLogMessage('table.drop', $sql));
     $this->executeStatement($datasource, $sql);
 }
    protected function executeQuery(DataSourceMetaData $datasource, $operationName, $sql) {
        LogHelper::log_info(new StatementLogMessage("metamodel.system.{$operationName}[{$datasource->type}][{$datasource->name}]", $sql));

        $executionCallContext = new DataControllerCallContext();

        $datasourceQueryHandler = DataSourceQueryFactory::getInstance()->getHandler($datasource->type);

        return $datasourceQueryHandler->executeQuery($executionCallContext, $datasource, $sql);
    }
    public function rollbackTransaction($datasourceName) {
        $environment_metamodel = data_controller_get_environment_metamodel();

        $datasource = $environment_metamodel->getDataSource($datasourceName);

        $sql = $this->getExtension('rollbackTransaction')->generate($this, $datasource);
        LogHelper::log_info(new StatementLogMessage('transaction.rollback', $sql));
        $this->executeStatement($datasource, $sql);
    }
    public function apply ( $patients ) {
        if ( !is_array($patients) ) {
            $patients = array($patients);
        }

        foreach ( $patients as $patient ) {
            \LogHelper::log_info('Applying ReportConfigRemoveColumnLevel treatment to: ' . $patient->reportNodeId);
        }
    }
    protected function getHandlerClassName($datatype) {
        $classname = isset($this->handlerConfigurations[$datatype]['classname']) ? $this->handlerConfigurations[$datatype]['classname'] : NULL;
        if (!isset($classname)) {
            LogHelper::log_info(t('Supported data types:'));
            LogHelper::log_info(isset($this->handlerConfigurations) ? array_keys($this->handlerConfigurations) : NULL);
            throw new IllegalArgumentException(t('Unsupported data type: %datatype', array('%datatype' => $datatype)));
        }

        return $classname;
    }
    public function apply ( $patients ) {
        if ( !is_array($patients) ) {
            $patients = array($patients);
        }

        foreach ( $patients as $patient ) {
            \LogHelper::log_info('Applying DeleteReport treatment to: '.$patient->reportNodeId);
            node_delete($patient->reportNodeId);
        }
    }
 public function setValues($values, $expiration = NULL)
 {
     $timeStart = microtime(TRUE);
     $errorEntryNames = parent::setValues($values, $expiration);
     $entryCount = count($values);
     $errorEntryCount = count($errorEntryNames);
     $successfulEntryCount = $entryCount - $errorEntryCount;
     LogHelper::log_info(t("[@cacheType] Execution time for @successFlag storing of @entryCount entries is !executionTime", array('@cacheType' => $this->getCacheType(), '@entryCount' => $errorEntryCount == 0 ? $entryCount : ($successfulEntryCount == 0 ? $entryCount : "{$successfulEntryCount} out of {$entryCount}"), '!executionTime' => ExecutionPerformanceHelper::formatExecutionTime($timeStart), '@successFlag' => $errorEntryCount == 0 ? 'SUCCESSFUL' : ($successfulEntryCount == 0 ? 'UNSUCCESSFUL' : 'successful'))));
     // some errors but also some success
     return $errorEntryNames;
 }
 public function load(AbstractMetaModelFactory $factory, AbstractMetaModel $environment_metamodel, array $filters = NULL, $finalAttempt)
 {
     LogHelper::log_notice(t('Generating Environment Meta Model for APC cache ...'));
     $datasourceCount = 0;
     $datasource = new DataSourceMetaData();
     $datasource->name = NameSpaceHelper::addNameSpace(APCHandler::$CACHE__TYPE, DefaultCacheFactory::$DATASOURCE_NAME__DEFAULT);
     $datasource->type = APCHandler::$CACHE__TYPE;
     $environment_metamodel->registerDataSource($datasource);
     $datasourceCount++;
     LogHelper::log_info(t('Generated @datasourceCount data sources', array('@datasourceCount' => $datasourceCount)));
     return self::LOAD_STATE__SUCCESSFUL;
 }
    public function load(AbstractMetaModelFactory $factory, AbstractMetaModel $environment_metamodel, array $filters = NULL) {
        LogHelper::log_notice(t('Generating Environment Meta Model for PHP dataset functionality ...'));

        $datasourceCount = 0;

        $datasource = new DataSourceMetaData();
        $datasource->name = PHPDataSourceHandler::$DATASOURCE_NAME__DEFAULT;
        $datasource->type = PHPDataSourceHandler::$DATASOURCE__TYPE;
        $environment_metamodel->registerDataSource($datasource);
        $datasourceCount++;

        LogHelper::log_info(t('Generated @datasourceCount data sources', array('@datasourceCount' => $datasourceCount)));
    }
    public function apply ( $patients ) {
        if ( !is_array($patients) ) {
            $patients = array($patients);
        }

        foreach ( $patients as $patient ) {
            \LogHelper::log_info('Applying DeleteDataset treatment to: '.$patient->datasetNodeId);
            // remove columns
            $columnNodeIds = gd_column_get_columns_4_dataset($patient->datasetNodeId, LOAD_ENTITY_ID_ONLY, INCLUDE_UNPUBLISHED);
            if ( !empty($columnNodeIds) ) {
                node_delete_multiple($columnNodeIds);
            }
            node_delete($patient->datasetNodeId);
        }
    }
    public function load(AbstractMetaModel $environment_metamodel, array $filters = NULL) {
        LogHelper::log_notice(t('Generating Environment Meta Model for APC cache ...'));

        $datasourceCount = 0;

        $datasource = new DataSourceMetaData();
        $datasource->name = NameSpaceHelper::addNameSpace(APCHandler::CACHE__TYPE, 'default');
        $datasource->type = APCHandler::CACHE__TYPE;
        $datasource->category = CacheFactory::$DATASOURCE__CATEGORY;
        $datasource->markAsPrivate();

        $environment_metamodel->registerDataSource($datasource);
        $datasourceCount++;

        LogHelper::log_info(t('Generated @datasourceCount data sources', array('@datasourceCount' => $datasourceCount)));
    }
    private function scanReportConfigs () {
        $this->affected = array();

        $query = new \EntityFieldQuery();
        $query->entityCondition('entity_type', 'node');
        $query->propertyCondition('type', NODE_TYPE_REPORT);
        $query->propertyCondition('status', NODE_PUBLISHED);
        $query->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT');
        $result = $query->execute();
        $reportNids = isset($result['node']) ? array_keys($result['node']) : NULL;
        $reportNodes = node_load_multiple($reportNids);
        
        foreach ( $reportNodes as $node ) {

            \LogHelper::log_info(t('Inspecting report @nid', array('@nid' => $node->nid)));

            $reportConfigText = get_node_field_value($node, 'field_report_conf', 0, 'value', FALSE);
            $reportConfig = isset($reportConfigText) ? json_decode($reportConfigText) : NULL;
            if (!isset($reportConfig)) {
                \LogHelper::log_info('Report configuration is EMPTY');
                continue;
            }

            // loop through filters
            if (!empty($reportConfig->model->filters)) {
                foreach ($reportConfig->model->filters as $key => $value) {
                    $result = $this->detectInvalidFilter($value);
                    if ($result) {
                        $patient = array(
                            'info' => array(
                                'reportNodeId' => $node->nid,
                                'reportTitle' => $node->title,
                                'filter' => $value,
                                'published' => $node->status,
                                'configPath' => 'model/filters'
                            ),
                            'notes' => $result
                        );
                        $this->attachTreatment($patient);
                        $this->affected[] = $patient;
                    }
                }
            }
        }
    }
 public function load(AbstractMetaModelFactory $factory, AbstractMetaModel $metamodel, array $filters = NULL, $finalAttempt)
 {
     $metamodelTypeFolder = $this->getMetaModelFolderName();
     $filecount = 0;
     $metamodelConfigurations = module_invoke_all('dc_metamodel');
     foreach ($metamodelConfigurations as $metamodelConfiguration) {
         $path = $metamodelConfiguration['path'] . DIRECTORY_SEPARATOR . $metamodelTypeFolder . DIRECTORY_SEPARATOR . 'metadata';
         // initial name space is not defined. It will be based on subfolder name, if any
         $namespace = NULL;
         $simplifiedPath = PathHelper::simplifyPath($path);
         LogHelper::log_info(t("Loading configuration from '@path' ...", array('@path' => $simplifiedPath)));
         if (!file_exists($path)) {
             throw new IllegalStateException(t('Folder could not be found: @path', array('@path' => $simplifiedPath)));
         }
         $filecount += $this->loadFromDirectory($metamodel, $filters, $path, $namespace);
     }
     LogHelper::log_info(t('Processed @filecount files', array('@filecount' => $filecount)));
     return self::LOAD_STATE__SUCCESSFUL;
 }
 public function load(AbstractMetaModelFactory $factory, AbstractMetaModel $environment_metamodel, array $filters = NULL, $finalAttempt)
 {
     LogHelper::log_notice(t('Loading Environment Meta Model from settings.php ...'));
     $datasourceCount = 0;
     $configurationDataSources = Environment::getInstance()->getConfigurationSection('Data Sources');
     if (isset($configurationDataSources)) {
         foreach ($configurationDataSources as $namespace => $sourceDataSources) {
             foreach ($sourceDataSources as $datasourceName => $sourceDataSource) {
                 $datasourceName = NameSpaceHelper::resolveNameSpace($namespace, $datasourceName);
                 $datasource = new DataSourceMetaData();
                 $datasource->name = $datasourceName;
                 $datasource->system = TRUE;
                 $datasource->readonly = TRUE;
                 $datasource->initializeFrom($sourceDataSource);
                 $environment_metamodel->registerDataSource($datasource);
                 $datasourceCount++;
             }
         }
     }
     LogHelper::log_info(t('Processed @datasourceCount data sources', array('@datasourceCount' => $datasourceCount)));
     return self::LOAD_STATE__SUCCESSFUL;
 }
    protected function generateCubes(SystemTableMetaModelLoaderCallContext $callcontext, AbstractMetaModel $metamodel) {
        $cubeCount = 0;

        $loaderName = $this->getName();

        foreach ($callcontext->logicalDatasets as $tableAccessKey => $logicalDataset) {
            $dataset = $callcontext->datasets[$tableAccessKey];

            $cubeName = $logicalDataset->name;
            $cube = new CubeMetaData();
            $cube->name = $cubeName;
            $cube->publicName = $logicalDataset->publicName;
            $cube->description = $logicalDataset->description;
            $cube->factsDatasetName = $dataset->name;
            $cube->factsDataset = $dataset;

            foreach ($logicalDataset->columns as $logicalColumn) {
                StarSchemaCubeMetaData::initializeDimensionFromColumn($metamodel, $cube, $logicalDataset, $logicalColumn->name);

                // FIXME fixing dimensions and pointing to physical datasets instead. Remove the following block once we remove support for logical datasets in cubes
                // FIXME remove support for $callcontext->logicalDatasetNameMappings property as well
                $dimension = $cube->findDimension($logicalColumn->name);
                if (isset($dimension) && isset($dimension->datasetName)) {
                    $dimensionLogicalDatasetName = $dimension->datasetName;
                    $dimensionTableAccessKey = $callcontext->logicalDatasetNameMappings[$dimensionLogicalDatasetName];
                    $dimensionDataset = $callcontext->datasets[$dimensionTableAccessKey];
                    $dimension->datasetName = $dimensionDataset->name;
                    $dimension->dataset = $dimensionDataset;
                }
            }

            foreach ($logicalDataset->columns as $logicalColumn) {
                StarSchemaCubeMetaData::initializeMeasuresFromColumn($cube, $logicalDataset, $logicalColumn->name);
            }

            StarSchemaCubeMetaData::registerCubeMeasures($cube);

            $cube->loaderName = $loaderName;
            $cube->markAsComplete();

            $metamodel->registerCube($cube);
            $cubeCount++;
        }

        LogHelper::log_info(t('Generated and registered @cubeCount cubes', array('@cubeCount' => $cubeCount)));
    }
    public function countDatasetRecords(DataControllerCallContext $callcontext, DatasetCountRequest $request) {
        $datasetName = $request->getDatasetName();
        LogHelper::log_notice(t('Counting script-based dataset records: @datasetName', array('@datasetName' => $datasetName)));

        $metamodel = data_controller_get_metamodel();

        $dataset = $metamodel->getDataset($datasetName);

        $serializer = new DatasetCountUIRequestSerializer();
        $parameters = $serializer->serialize($request);

        $count = $this->executeScriptFunction($dataset, 'countDatasetRecords', $parameters);
        LogHelper::log_info(t('Counted @count record(s)', array('@count' => $count)));

        return $count;
    }
*/
/**
 * Script to send notification emails
 */
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//_drush_bootstrap_drupal_full();
try {
    $completedJobRequests = QueueUtil::getPendingEmailsInfo();
    LogHelper::log_debug($completedJobRequests);
} catch (Exception $claimException) {
    LogHelper::log_debug("{$logId}: Error while fetching job from queue: " . $claimException);
    return;
}
foreach ($completedJobRequests as $request) {
    LogHelper::log_info($request);
    try {
        global $conf;
        $dir = variable_get('file_public_path', 'sites/default/files') . '/' . $conf['check_book']['data_feeds']['output_file_dir'];
        $file = $dir . '/' . $request['filename'];
        $params = array("download_url" => $file, "download_url_compressed" => $file . '.zip', "expiration_date" => date('d-M-Y', $request['end_time'] + 3600 * 24 * 7), "contact_email" => $request['contact_email'], "tracking_num" => $request['token']);
        LogHelper::log_debug($params);
        $response = drupal_mail('checkbook_datafeeds', "download_notification", $request['contact_email'], null, $params);
        LogHelper::log_debug($response);
        if ($response['result']) {
            QueueUtil::updateJobRequestEmailStatus($request['rid']);
        }
    } catch (Exception $claimException) {
        LogHelper::log_debug("Error while Sending Email Notification: " . $claimException . $params);
        return;
    }
 public function load(AbstractMetaModelFactory $factory, AbstractMetaModel $metamodel, array $filters = NULL, $finalAttempt)
 {
     $selectedDataSourceType = $this->selectedDataSourceType();
     LogHelper::log_notice(t("Finalizing Dataset Meta Data for '@databaseType' database connections ...", array('@databaseType' => $selectedDataSourceType)));
     if ($finalAttempt === FALSE) {
         return self::LOAD_STATE__POSTPONED;
     }
     $finalizedDatasetCount = 0;
     $environment_metamodel = data_controller_get_environment_metamodel();
     // processing all database connections
     foreach ($environment_metamodel->datasources as $datasource) {
         if ($datasource->type !== $selectedDataSourceType) {
             continue;
         }
         // selecting datasets which could be processed for the selected connection
         $selectedSources = NULL;
         foreach ($metamodel->datasets as $dataset) {
             // the dataset should belong to the selected data source
             if ($dataset->datasourceName !== $datasource->name) {
                 continue;
             }
             // the dataset has to be of type table
             if (DatasetTypeHelper::detectDatasetSourceType($dataset) !== DatasetTypeHelper::DATASET_SOURCE_TYPE__TABLE) {
                 continue;
             }
             // whole dataset meta data was prepared using different method. There is nothing else can be done
             if ($dataset->isComplete()) {
                 continue;
             }
             $tableName = strtolower($dataset->source);
             // invalidating existing column indexes
             $dataset->invalidateColumnIndexes();
             // there could be several datasets for one table
             $selectedSources[$tableName][] = $dataset;
         }
         if (!isset($selectedSources)) {
             continue;
         }
         $datasourceHandler = DataSourceQueryFactory::getInstance()->getHandler($datasource->type);
         $metadataCallback = $datasourceHandler->prepareQueryStatementExecutionCallbackInstance();
         // processing meta data for selected datasets
         $columnsMetaDataProperties = $this->prepareColumnsMetaDataProperties($datasource, array_keys($selectedSources));
         if (isset($columnsMetaDataProperties)) {
             foreach ($columnsMetaDataProperties as $columnMetaDataProperties) {
                 $tableName = strtolower($columnMetaDataProperties[self::PROPERTY__TABLE_NAME]);
                 $datasets = $selectedSources[$tableName];
                 foreach ($datasets as $dataset) {
                     $column = new ColumnMetaData();
                     $column->name = strtolower($columnMetaDataProperties[self::PROPERTY__COLUMN_NAME]);
                     $column->columnIndex = $columnMetaDataProperties[self::PROPERTY__COLUMN_INDEX];
                     // preparing column type
                     $column->type->databaseType = $columnMetaDataProperties[self::PROPERTY__COLUMN_TYPE];
                     $column->type->applicationType = $metadataCallback->calculateApplicationDataType($column);
                     // checking if the column is a system column which should be invisible
                     if (substr_compare($column->name, DatasetSystemColumnNames::COLUMN_NAME_PREFIX, 0, strlen(DatasetSystemColumnNames::COLUMN_NAME_PREFIX)) === 0) {
                         $column->visible = FALSE;
                     }
                     $dataset->initializeColumnFrom($column);
                 }
             }
         }
         // marking all selected datasets as completed
         foreach ($selectedSources as $datasets) {
             foreach ($datasets as $dataset) {
                 $dataset->markAsComplete();
                 $finalizedDatasetCount++;
             }
         }
     }
     LogHelper::log_info(t('Finalized @datasetCount dataset meta data configurations', array('@datasetCount' => $finalizedDatasetCount)));
     return self::LOAD_STATE__SUCCESSFUL;
 }
    public function findCompletedHandler() {
        $this->checkInitiation();

        while (TRUE) {
            $info = curl_multi_info_read($this->mh);
            if ($info === FALSE) {
                if ($this->executionState) {
                    curl_multi_select($this->mh);
                    do {
                        $mrc = curl_multi_exec($this->mh, $this->executionState);
                    }
                    while ($mrc == CURLM_CALL_MULTI_PERFORM);
                    if ($mrc != CURLM_OK) {
                        throw new IllegalStateException(t(
                            'Multi-thread execution could not be completed successfully: %errorCode',
                            array('%errorCode' => $mrc)));
                    }
                }
                else {
                    // there is nothing else to process
                    return FALSE;
                }
            }
            else {
                $ch = $info['handle'];

                $completedHandler = NULL;
                foreach ($this->handlers as $handler) {
                    if ($handler->ch === $ch) {
                        $completedHandler = $handler;
                        break;
                    }
                }
                if (!isset($completedHandler)) {
                    throw new IllegalStateException(t('Could not recognize completed thread'));
                }

                LogHelper::log_info(t('Completed execution of thread for %resourceId resource', array('%resourceId' => $completedHandler->resourceId)));

                if ($info['result'] !== CURLE_OK) {
                    $error = 'Error message is not provided';
                    $this->errorResourceExecution($completedHandler->resourceId, $error);
                }

                return $completedHandler;
            }
        }

        return FALSE;
    }