Example #1
0
 public function translate($text, $sourceLanguage, $targetLanguage)
 {
     $originals = new RecordCollection(new Original(), ['id']);
     $original = $originals->loadOneWhere("%C = %s", "lookup", $text);
     if ($original === null || !$original->exists()) {
         $original = new Original();
         $original->lookup = $text;
         $original->saveChanges();
     }
     $translation = Translation::loadWhere("%C = %d AND %C = %s", "original_id", $original->id(), "language", $targetLanguage);
     if ($translation !== null && $translation instanceof Translation) {
         if ($translation->exists()) {
             $translated = $translation->translated;
             return $translated;
         }
     }
     if ($this->_fallback === null) {
         $this->_fallback = $this->_getTranslator();
     }
     $translated = $this->_fallback->translate($text, $sourceLanguage, $targetLanguage);
     if ($translated !== $text) {
         $translation = new Translation();
         $translation->originalId = $original->id();
         $translation->language = $targetLanguage;
         $translation->translated = $translated;
         $translation->saveChanges();
     }
     return $translated;
 }
Example #2
0
 public function execute()
 {
     $this->_logger->setInstanceName($this->instanceName);
     $this->_pidFile = new PidFile("", $this->instanceName);
     while (true) {
         $startedAt = time();
         $startedAt -= $startedAt % 60;
         $collection = new RecordCollection(new Campaign());
         if (!$collection->hasMappers()) {
             Log::warning('No mappers found');
         }
         foreach ($collection as $campaign) {
             /** @var Campaign $campaign */
             if ($campaign->isDue($startedAt)) {
                 try {
                     Defero::pushCampaign($campaign->id(), $startedAt);
                     if (CronParser::isValid($campaign->sendAt)) {
                         // check average sends on scheduled
                         $avgEndDate = (new \DateTime())->setTimestamp($startedAt);
                         $avgStartDate = CronParser::prevRun($campaign->sendAt, $avgEndDate);
                         $avgEndDate->sub($avgStartDate->diff($avgEndDate));
                         $avgStartDate->setTime($avgStartDate->format('H') - 1, 0, 0);
                         $latestStats = MailStatistic::getCampaignStats($campaign->id(), $avgStartDate, $avgEndDate);
                         $diff = $avgStartDate->diff($avgEndDate);
                         $diffLatest = max(1, intval($diff->format('%i')) + intval($diff->format('%h') * 60) + intval($diff->format('%d') * 3600));
                         $latestHourly = $latestStats->sent / $diffLatest * 60;
                         if ($campaign->warnMin && $latestHourly < $campaign->warnMin || $campaign->warnMax && $latestHourly > $campaign->warnMax) {
                             Log::warning('Sending outside threshold', ['campaign' => $campaign->id(), 'average' => $latestHourly, 'warnMin' => $campaign->warnMin, 'warnMax' => $campaign->warnMax]);
                         }
                     }
                 } catch (\Exception $e) {
                     Log::error('Campaign ' . $campaign->id() . ': ' . $e->getMessage() . ' (Line: ' . $e->getLine() . ')');
                 }
             } else {
                 Log::debug('Campaign ' . $campaign->id() . ' not due');
             }
         }
         $endTime = time();
         $endTime -= $endTime % 60;
         if ($endTime == $startedAt) {
             sleep(30);
         }
     }
 }
Example #3
0
 /**
  * @return BucketRange
  */
 protected function _claimNextFreeRange()
 {
     $range = false;
     $db = BucketRange::conn();
     EventManager::trigger(Events::CLAIM_RANGE_START);
     // Check for an already-flagged range
     $coll = new RecordCollection(new BucketRange());
     $coll->loadWhere(['processing' => 1, 'hostname' => $this->_hostname, 'instanceName' => $this->_instanceName])->limit(1);
     if ($coll->count() > 0) {
         $range = $coll->first();
     } else {
         $res = $db->query(ParseQuery::parse($db, "UPDATE %T SET processing=1, hostname=%s, instanceName=%s " . "WHERE processing=0 AND processed=0 ORDER BY randomKey LIMIT 1", BucketRange::tableName(), $this->_hostname, $this->_instanceName));
         if ($res) {
             $range = BucketRange::loadWhere(['processing' => 1, 'hostname' => $this->_hostname, 'instanceName' => $this->_instanceName]);
         }
     }
     EventManager::trigger(Events::CLAIM_RANGE_END);
     return $range;
 }
 public function showRangeData()
 {
     $col = new RecordCollection(new TokenRange());
     $col->whereNeq('rangeData', '');
     foreach ($col as $range) {
         /** @var TokenRange $range */
         echo $range->id() . ' : ' . $range->rangeData . "\n";
     }
 }
 /**
  * @return TokenRange
  */
 public function claimNextFreeRange()
 {
     EventManager::trigger(Events::CLAIM_RANGE_START);
     $range = false;
     $db = TokenRange::conn();
     // Check for an already-flagged range
     $coll = new RecordCollection(new TokenRange());
     $coll->loadWhere(['processing' => 1, 'hostname' => $this->_hostname])->limit(1);
     if ($coll->count() > 0) {
         $range = $coll->first();
     } else {
         $startKey = $this->_lastStartKey;
         $res = false;
         while (true) {
             $endKey = $startKey + 100;
             $res = $db->query(ParseQuery::parse($db, "UPDATE %T SET processing=1, hostname=%s " . "WHERE processing=0 AND processed=0 AND " . "randomKey BETWEEN %d AND %d " . "ORDER BY randomKey LIMIT 1", (new TokenRange())->getTableName(), $this->_hostname, $startKey, $endKey));
             if ($res && $db->affectedRows() > 0 || $startKey > 10000) {
                 $this->_lastStartKey = $startKey;
                 break;
             }
             $startKey += 100;
         }
         if ($res) {
             $range = TokenRange::loadWhere(['processing' => 1, 'hostname' => $this->_hostname]);
         }
     }
     EventManager::trigger(Events::CLAIM_RANGE_END);
     return $range;
 }