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;
     }
 }