protected function execute($arguments = array(), $options = array())
  {
    $databaseManager = new sfDatabaseManager($this->configuration);

    $members = Doctrine::getTable('Member')->findAll(Doctrine::HYDRATE_ARRAY);
    if (count($members) < 2)
    {
      throw new Exception('Too few members. Please run "opKdt:generate-member" first.');
    }
    $memberIds = array_map(create_function('$m', 'return (int)$m[\'id\'];'), $members);

    foreach ($memberIds as $memberId)
    {
      $candidate = array_diff($memberIds, array($memberId));
      shuffle($candidate);
      $footprintMembers = array_slice($candidate, 0, $options['number']);
      foreach ($footprintMembers as $memberIdTo)
      {
        $ashi = new Ashiato();
        $ashi->setMemberIdFrom($memberId);
        $ashi->setMemberIdTo($memberIdTo);
        $ashi->save();
        $ashi->free();
        $this->logSection('put a footprint', sprintf("%s - %s", $memberId, $memberIdTo));
      }
    }
  }
 public function setAshiatoMember($memberIdTo, $memberIdFrom)
 {
     if ($memberIdTo == $memberIdFrom) {
         return false;
     }
     $wait = date('Y-m-d H:i:s', strtotime('-' . sfConfig::get('app_update_span_minute') . 'minute'));
     $q = Doctrine_Query::create()->select('id')->from('ashiato')->where('member_id_to = ?', $memberIdTo)->andwhere('member_id_from = ?', $memberIdFrom)->andWhere('updated_at > ?', $wait)->limit(1);
     if (count($q->execute(array(), Doctrine::HYDRATE_NONE))) {
         return false;
     }
     $ashiato = new Ashiato();
     $ashiato->setMemberIdFrom($memberIdFrom);
     $ashiato->setMemberIdTo($memberIdTo);
     $ashiato->setRDate(date('Y-m-d'));
     $ashiato->save();
     return $ashiato->getID();
 }
  protected function execute($arguments = array(), $options = array())
  {
    $databaseManager = new sfDatabaseManager($this->configuration);
    $this->conn = $databaseManager->getDatabase('doctrine')->getDoctrineConnection();

    $sql = 'SELECT id FROM member WHERE is_active != 0';
    $where = array();
    if ( $options['min'] && $options['max']  && $options['min'] <= $options['max'])
    {
        $sql .= ' AND id BETWEEN ? AND ?';
        $where = array(intval($options['min']),intval($options['max']));
    }
    $memberIds = $this->conn->fetchColumn($sql, $where);

    $sql = 'SELECT max(id) FROM member WHERE is_active != 0';
    $maxmemberId = $this->conn->fetchOne($sql);

    foreach ($memberIds as $id)
    {
      for ($i=0; $i<$options['number']; ++$i)
      {
        // 送り先は、id1~存在する最大のidからランダムに選出
        $sendTo = rand(1,$maxmemberId);
        $mes = new SendMessageData();
        $mes->setMemberId($id);
        $mes->setSubject('subject');
        $mes->setBody('body');

        // 一定割合で下書き
        $rate = $options['draftrate'];
        if ($rate != 0 && rand(1,100) <= $rate )
        {
          $mes->setIsSend(false);
        } else {
          $mes->setIsSend(true);
        }
        $mes->setMessageTypeId(1);
        $mes->save();

        $messageSendList = new MessageSendList();
        $messageSendList->setMemberId($sendTo);
        $messageSendList->setSendMessageData($mes);
        $messageSendList->save();

        $mesid = $mes->getId();
        $messageSendListid = $messageSendList->getId();

        $mes->free();
        $messageSendList->free();

        $this->logSection('send message', sprintf("%s - %s", $id, $sendTo));

        // 同時にあしあとをつける
        if ($options['footprint'] > 0)
        {
          $r_date = date('Y-m-d');
          for ($j=0 ; $j < $options['footprint'] ; ++$j) { 
              $ashi = new Ashiato();
              $ashi->setMemberIdFrom($id);
              $ashi->setMemberIdTo($sendTo);
              $ashi->setRDate($r_date);
              $ashi->save();
          }
          $ashi->free();
        }

        // 一定割合でゴミ箱へ
        $rate = $options['dustrate'];
        if ($rate != 0 && rand(1,100) <= $rate )
        {
            // 送信者がゴミ箱
            $deleted_message = new DeletedMessage();
            $deleted_message->setMemberId($id);
            $deleted_message->setMessageSendListId($messageSendListid);
            $deleted_message->save();

            // 受信者がゴミ箱
            $rec_deleted_message = new DeletedMessage();
            $rec_deleted_message->setMemberId($sendTo);
            $rec_deleted_message->setMessageId($mesid);
            $rec_deleted_message->save();

            $deleted_message->free();
            $rec_deleted_message->free();

            $this->logSection('delete message', sprintf("%s - %s", $id, $sendTo));
        }

      }
    }
  }