예제 #1
0
	public function perform()
	{
		Interspire_TimerStack::start();

		if (!$this->_validateExport()) {
			$this->_logDebug('export validation failed');
			$this->_removeExport();
			Interspire_TimerStack::stop();
			return;
		}

		if ($this->_getExportData('pause')) {
			// not ideal to simply requeue the task, but this is for dev purposes only
			$this->_logDebug('job is paused, requeueing task');
			$this->_repeatExport();
			Interspire_TimerStack::stop();
			return;
		}

		$this->_logDebug('export ' . $this->_type . ' starting from row ' . $this->_skip . ' with batch size ' . self::BATCH_SIZE);

		$method = '_perform' . $this->_type . 'Export';
		$counter = $this->$method();

		$duration = Interspire_TimerStack::stop();

		if ($counter) {
			// track average time taken per item over batches sent
			// may be used in future to dynamically adjust the batch size to fit into pre-determined request times
			// can also be used to compare speeds between modules
			$samples = $this->_keystore->increment('email:module_export:' . $this->_module->GetId() . ':avg_item_samples');
			$peritem = $duration / $counter;
			if ($samples > 1) {
				$previous = (float)$this->_keystore->get('email:module_export:' . $this->_module->GetId() . ':avg_item');
				$peritem = $previous + (($peritem - $previous) / $samples);
			}
			$this->_keystore->set('email:module_export:' . $this->_module->GetId() . ':avg_item', $peritem);
		}

		if (!$counter) {
			// only repeat if the type-specific export actually exported something
			$this->_endExport();
			return;
		}

		$this->_keystore->increment($this->_prefix . 'skip', $counter);
		$this->_repeatExport();
	}
예제 #2
0
	/**
	* Generate merge data for a list subscription (or batch of list subscriptions) for this module based on provided field mapping.
	*
	* @param Interspire_EmailIntegration_Subscription $subscription single subscription of array of subscriptions
	* @param string $listId provider_list_id
	* @param array<provider_field_id=subscription_field_id> $fieldMap
	* @param bool $includeEmail include built-in email address field in merge data
	*/
	public function getMergeData($subscription, $listId, $fieldMap, $includeEmail = false)
	{
		Interspire_TimerStack::start();

		if (is_array($subscription)) {
			$single = false;
			$subscriptions = $subscription;
		}
		else
		{
			$single = true;
			$subscriptions = array($subscription);
		}

		/** @var ISC_LOG */
		$log = $GLOBALS['ISC_CLASS_LOG'];

		$list = $this->getList($listId);

		// get list fields so we know how to translate data
		$providerFields = $this->getListFields($list['provider_list_id']);
		foreach ($providerFields as $index => $providerField) {
			// change the fields array so it has a map of provider_field_id => field
			$providerFields[$providerField['provider_field_id']] = $providerField;
		}

		// note: this takes about 3 - 4 secs per 100 records, but I can't spot an optimisation for it right now

		$batch = array();
		foreach ($subscriptions as /** @var Interspire_EmailIntegration_Subscription */$subscription) {
			$item = array();

			$subscriptionFields = $subscription->getFlatSubscriptionFields();

			$subscriptionData = $subscription->getSubscriptionData();

			foreach ($fieldMap as $providerFieldId => $subscriptionFieldId) {
				if (!isset($subscriptionData[$subscriptionFieldId])) {
					// this used to log an error but with the customer class not all data is always available so it's changed to a debug
					$log->LogSystemDebug(array('emailintegration', $this->GetName()), 'Invalid field mapping specified. Local field "' . $subscriptionFieldId . '" specified in mapping, but not found in subscription data.', var_export($subscriptionData, true));
					continue;
				}

				if (!isset($providerFields[$providerFieldId])) {
					$log->LogSystemError(array('emailintegration', $this->GetName()), 'Invalid field mapping specified. Provider field "' . $providerFieldId . '" specified in mapping, but not found in provider field list.', var_export($providerFields, true));
					continue;
				}

				if (!isset($subscriptionFields[$subscriptionFieldId])) {
					$log->LogSystemError(array('emailintegration', $this->GetName()), 'Invalid field mapping specified. Local field "' . $subscriptionFieldId . '" specified in mapping, but not found in subscription-class field list.', var_export($subscriptionFields, true));
					continue;
				}

				$item[$providerFieldId] = $this->translateMergeField(
					$subscriptionFields[$subscriptionFieldId],
					$providerFields[$providerFieldId],
					$subscriptionData[$subscriptionFieldId],
					$subscriptionData
				);
			}

			if ($includeEmail) {
				$item[$this->getEmailProviderFieldId()] = $subscription->getSubscriptionEmail();
			}

			$batch[] = $item;
		}

		$log->LogSystemDebug(array('emailintegration', $this->GetName()), 'batch data generated for ' . count($batch) . ' subscriptions in ' . number_format(Interspire_TimerStack::stop(), 3) . ' secs');

		if ($single) {
			return $batch[0];
		}

		return $batch;
	}