protected function execute($arguments = array(), $options = array()) { // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); $filename = $arguments['filename']; $petition_id = $arguments['petition_id']; $search_table = PetitionSigningSearchTable::getInstance(); $petition = PetitionTable::getInstance()->findById($petition_id, true); if (empty($petition)) { echo "Petition not found.\n"; return; } $campaign = $petition->getCampaign(); $formfields = $petition->getFormfields(); $formfields[] = Petition::FIELD_REF; $table = Doctrine_Core::getTable('PetitionSigning'); printf("Campaign: %s\nPetition: %s\n", $campaign['name'], $petition['name']); $first_id = false; $first_line = null; if (($handle = @fopen($filename, "r")) !== false) { $con = $table->getConnection(); $con->beginTransaction(); echo "Begin transaction\n"; try { $emails = array(); $i = 0; while (($data = fgetcsv($handle, 1000, ",")) !== false) { $i++; if ($i % 100 == 0) { echo "{$i}\n"; } //if ($i > 300) break; if (!is_array($first_line)) { $first_line = $data; } else { $line = array_combine($first_line, $data); $signing = new PetitionSigning(); $signing->setPetitionId($petition_id); $signing->setStatus(PetitionSigning::STATUS_VERIFIED); foreach ($formfields as $formfield) { switch ($formfield) { // case 'created_at': // $signing->setCreatedAt($line[$formfield]); // break; // case 'updated_at': // $signing->setUpdatedAt($line[$formfield]); // break; case Petition::FIELD_FULLNAME: $fullname = array(); if (isset($line[Petition::FIELD_FIRSTNAME])) { $fullname[] = trim($line[Petition::FIELD_FIRSTNAME]); } if (isset($line[Petition::FIELD_LASTNAME])) { $fullname[] = trim($line[Petition::FIELD_LASTNAME]); } if (isset($line[Petition::FIELD_FULLNAME])) { $fullname[] = trim($line[Petition::FIELD_FULLNAME]); } $fullname = join(' ', $fullname); $signing->setField(Petition::FIELD_FULLNAME, $fullname); break; case Petition::FIELD_SUBSCRIBE: if (isset($line[Petition::FIELD_SUBSCRIBE]) && $line[Petition::FIELD_SUBSCRIBE] == '1') { $signing->setField(Petition::FIELD_SUBSCRIBE, array('yes')); } else { $signing->setField(Petition::FIELD_SUBSCRIBE, array()); } break; default: if (isset($line[$formfield])) { $signing->setField($formfield, $line[$formfield]); } } } $signing->save(); $search_table->savePetitionSigning($signing, false); if ($first_id === false) { $first_id = $signing->getId(); } $email = $signing->getField(Petition::FIELD_EMAIL); if (is_string($email)) { $emails[] = trim($email); } $signing->free(); } } echo "checking duplicates\n"; while (count($emails) > 0) { $i = 0; $where_param = array(); $where = array(); while ($i++ < 100) { $email = array_shift($emails); if (empty($email)) { $break; } $where_param[] = $email; $where[] = '(LOWER(ps.email) = LOWER(?))'; } echo count($emails) . "\n"; $duplicates = $table->createQuery('ps')->where('ps.petition_id = ?', $petition_id)->andWhere('ps.id < ?', $first_id)->andWhere(join(' OR ', $where), $where_param)->execute(); foreach ($duplicates as $duplicate) { $duplicate->setStatus(PetitionSigning::STATUS_DUPLICATE); } $duplicates->save(); $duplicates->free(); } echo "Commit transaction"; $con->commit(); echo ".\n"; } catch (Exception $e) { $con->rollback(); echo "DB error. (rollback)\n"; } fclose($handle); } else { echo "File error.\n"; return; } }