Ejemplo n.º 1
0
    /**
     * Choose a member to sync from. 
     *
     * The initalSync option is an object with 1 k/v pair:
     * 
     * "state" : 1|2
     * "name" : "host"
     * "_id" : N
     * "optime" : t
     *
     * All except optime are exact matches.  "optime" will find a secondary with
     * an optime >= to the optime given.
     */
    const Member* ReplSetImpl::getMemberToSyncTo() {
        BSONObj sync = myConfig().initialSync;
        bool secondaryOnly = false, isOpTime = false;
        char *name = 0;
        int id = -1;
        OpTime optime;

        StateBox::SP sp = box.get();
        assert( !sp.state.primary() ); // wouldn't make sense if we were.

        // if it exists, we've already checked that these fields are valid in
        // rs_config.cpp
        if ( !sync.isEmpty() ) {
            if (sync.hasElement("state")) {
                if (sync["state"].Number() == 1) {
                    if (sp.primary) {
                        sethbmsg( str::stream() << "syncing to primary: " << sp.primary->fullName(), 0);
                        return const_cast<Member*>(sp.primary);
                    }
                    else {
                        sethbmsg("couldn't clone from primary");
                        return NULL;
                    }
                }
                else {
                    secondaryOnly = true;
                }
            }
            if (sync.hasElement("name")) {
                name = (char*)sync["name"].valuestr();
            }
            if (sync.hasElement("_id")) {
                id = (int)sync["_id"].Number();
            }
            if (sync.hasElement("optime")) {
                isOpTime = true;
                optime = sync["optime"]._opTime();
            }
        }
        
        for( Member *m = head(); m; m = m->next() ) {
            if (!m->hbinfo().up() ||
                (m->state() != MemberState::RS_SECONDARY &&
                 m->state() != MemberState::RS_PRIMARY) ||
                (secondaryOnly && m->state() != MemberState::RS_SECONDARY) ||
                (id != -1 && (int)m->id() != id) ||
                (name != 0 && strcmp(name, m->fullName().c_str()) != 0) ||
                (isOpTime && optime >= m->hbinfo().opTime)) {
                continue;
            }

            sethbmsg( str::stream() << "syncing to: " << m->fullName(), 0);
            return const_cast<Member*>(m);
        }
        
        sethbmsg( str::stream() << "couldn't find a member matching the sync criteria: " <<
                  "\nstate? " << (secondaryOnly ? "2" : "none") <<
                  "\nname? " << (name ? name : "none") <<
                  "\n_id? " << id <<
                  "\noptime? " << optime.toStringPretty() );
        
        return NULL;
    }
	HealthData::HealthData(Member& trainee) :
	membershipID(trainee.getMembershipID()),
	height(trainee.getHeight()),
	weight(trainee.getWeight())
	{
	}
Ejemplo n.º 3
0
static int
delegate_handler( Member* member, CAtom* atom, PyObject* value )
{
    Member* delegate = member_cast( member->setattr_context );
    return delegate->setattr( atom, value );
}
Ejemplo n.º 4
0
    Member* ReplSetImpl::getMemberToSyncTo() {
        lock lk(this);

        bool buildIndexes = true;

        // if we have a target we've requested to sync from, use it

        if (_forceSyncTarget) {
            Member* target = _forceSyncTarget;
            _forceSyncTarget = 0;
            sethbmsg( str::stream() << "syncing to: " << target->fullName() << " by request", 0);
            return target;
        }

        // wait for 2N pings before choosing a sync target
        if (_cfg) {
            int needMorePings = config().members.size()*2 - HeartbeatInfo::numPings;

            if (needMorePings > 0) {
                OCCASIONALLY log() << "waiting for " << needMorePings << " pings from other members before syncing" << endl;
                return NULL;
            }

            buildIndexes = myConfig().buildIndexes;
        }

        // find the member with the lowest ping time that has more data than me

        // Find primary's oplog time. Reject sync candidates that are more than
        // MAX_SLACK_TIME seconds behind.
        OpTime primaryOpTime;
        static const unsigned maxSlackDurationSeconds = 10 * 60; // 10 minutes
        const Member* primary = box.getPrimary();
        if (primary) 
            primaryOpTime = primary->hbinfo().opTime;
        else
            // choose a time that will exclude no candidates, since we don't see a primary
            primaryOpTime = OpTime(maxSlackDurationSeconds, 0);

        if ( primaryOpTime.getSecs() < maxSlackDurationSeconds ) {
            // erh - I think this means there was just a new election
            // and we don't yet know the new primary's optime
            primaryOpTime = OpTime(maxSlackDurationSeconds, 0);
        }

        OpTime oldestSyncOpTime(primaryOpTime.getSecs() - maxSlackDurationSeconds, 0);

        Member *closest = 0;
        time_t now = 0;

        // Make two attempts.  The first attempt, we ignore those nodes with
        // slave delay higher than our own.  The second attempt includes such
        // nodes, in case those are the only ones we can reach.
        // This loop attempts to set 'closest'.
        for (int attempts = 0; attempts < 2; ++attempts) {
            for (Member *m = _members.head(); m; m = m->next()) {
                if (!m->hbinfo().up())
                    continue;
                // make sure members with buildIndexes sync from other members w/indexes
                if (buildIndexes && !m->config().buildIndexes)
                    continue;

                if (!m->state().readable())
                    continue;

                if (m->state() == MemberState::RS_SECONDARY) {
                    // only consider secondaries that are ahead of where we are
                    if (m->hbinfo().opTime <= lastOpTimeWritten)
                        continue;
                    // omit secondaries that are excessively behind, on the first attempt at least.
                    if (attempts == 0 && 
                        m->hbinfo().opTime < oldestSyncOpTime)
                        continue;
                }

                // omit nodes that are more latent than anything we've already considered
                if (closest && 
                    (m->hbinfo().ping > closest->hbinfo().ping))
                    continue;

                if ( attempts == 0 &&
                     myConfig().slaveDelay < m->config().slaveDelay ) {
                    continue; // skip this one in the first attempt
                }

                map<string,time_t>::iterator vetoed = _veto.find(m->fullName());
                if (vetoed != _veto.end()) {
                    // Do some veto housekeeping
                    if (now == 0) {
                        now = time(0);
                    }

                    // if this was on the veto list, check if it was vetoed in the last "while".
                    // if it was, skip.
                    if (vetoed->second >= now) {
                        if (time(0) % 5 == 0) {
                            log() << "replSet not trying to sync from " << (*vetoed).first
                                  << ", it is vetoed for " << ((*vetoed).second - now) << " more seconds" << rsLog;
                        }
                        continue;
                    }
                    _veto.erase(vetoed);
                    // fall through, this is a valid candidate now
                }
                // This candidate has passed all tests; set 'closest'
                closest = m;
            }
            if (closest) break; // no need for second attempt
        }

        if (!closest) {
            return NULL;
        }

        sethbmsg( str::stream() << "syncing to: " << closest->fullName(), 0);

        return closest;
    }
Ejemplo n.º 5
0
void ConditionEventListener::handleEvent(ExecutionContext*, Event* event) {
  if (!m_animation)
    return;
  m_animation->handleConditionEvent(event, m_condition);
}
Ejemplo n.º 6
0
    void ReplSetImpl::_summarizeStatus(BSONObjBuilder& b) const {
        vector<BSONObj> v;

        const Member *_self = this->_self;
        assert( _self );

        // add self
        {
            BSONObjBuilder bb;
            bb.append("_id", (int) _self->id());
            bb.append("name", _self->fullName());
            bb.append("health", 1.0);
            bb.append("state", (int) box.getState().s);
            bb.append("stateStr", box.getState().toString());
            bb.appendTimestamp("optime", lastOpTimeWritten.asDate());
            bb.appendDate("optimeDate", lastOpTimeWritten.getSecs() * 1000LL);
            string s = _self->lhb();
            if( !s.empty() )
                bb.append("errmsg", s);
            bb.append("self", true);
            v.push_back(bb.obj());
        }

        Member *m =_members.head();
        while( m ) {
            BSONObjBuilder bb;
            bb.append("_id", (int) m->id());
            bb.append("name", m->fullName());
            double h = m->hbinfo().health;
            bb.append("health", h);
            bb.append("state", (int) m->state().s);
            if( h == 0 ) {
                // if we can't connect the state info is from the past and could be confusing to show
                bb.append("stateStr", "(not reachable/healthy)");
            }
            else {
                bb.append("stateStr", m->state().toString());
            }
            bb.append("uptime", (unsigned) (m->hbinfo().upSince ? (time(0)-m->hbinfo().upSince) : 0));
            bb.appendTimestamp("optime", m->hbinfo().opTime.asDate());
            bb.appendDate("optimeDate", m->hbinfo().opTime.getSecs() * 1000LL);
            bb.appendTimeT("lastHeartbeat", m->hbinfo().lastHeartbeat);
            bb.append("ping", m->hbinfo().ping);
            string s = m->lhb();
            if( !s.empty() )
                bb.append("errmsg", s);
            v.push_back(bb.obj());
            m = m->next();
        }
        sort(v.begin(), v.end());
        b.append("set", name());
        b.appendTimeT("date", time(0));
        b.append("myState", box.getState().s);
        if (_currentSyncTarget) {
            b.append("syncingTo", _currentSyncTarget->fullName());
        }
        b.append("members", v);
        if( replSetBlind )
            b.append("blind",true); // to avoid confusion if set...normally never set except for testing.
    }
Ejemplo n.º 7
0
	int viewLodging(Member & member) //예약확인
	{

		system("clear");
		


		RoomList rl;
		int memnum;
		memnum = member.getMNumber();
		fileIO::loadBookUser(rl, memnum);
		Room a = rl.getFirstRoom();
		int size = rl.getSize();
			


		int y,m,d,p, r, l, person;
		int x = 1;	

		cout << "******************************************************************************" <<endl;
		cout << "              			나의 예약 현황" <<endl;
		cout << "******************************************************************************" <<endl;



	
		if( size > 0 )
		{

	 		y = a.getMYear();
			m = a.getMMonth();
			d = a.getMDay();
			p = a.getMPeriod();
			r = a.getRNumber();
			person = a.getMPerson();
			l = a.getLNumber();
			cout << "			Hotel Number : " << l <<endl;
			cout << "			RNUMBER : " << r << endl;
			cout << "			HEAD COUNT : " << person << endl;
			cout << "			DATE : "<< y << " " << m << " " << d << "부터 " << p << "일 동안" << endl;
			cout << "----------------------------------------------------------------------------" <<endl;

		}

		while ( x < size )
		{
	 		Room b = rl.getNextRoom();
			y = b.getMYear();
			m = b.getMMonth();
			d = b.getMDay();
			p = b.getMPeriod();
			r = b.getRNumber();
			l = a.getLNumber();
			cout << "			Hotel Number : " << l <<endl;			
			cout << "			RNUMBER : " << r << endl;
			cout << "			HEAD COUNT : " << person << endl;
			cout << "			DATE : "<< y << " " << m << " " << d << "부터 " << p << "일 동안" << endl;
			cout << "----------------------------------------------------------------------------" <<endl;

			x++;

		}
	


	cin.ignore(1024, '\n');
	
	}
Ejemplo n.º 8
0
 bool Consensus::aMajoritySeemsToBeUp() const {
     int vUp = rs._self->config().votes;
     for( Member *m = rs.head(); m; m=m->next() )
         vUp += m->hbinfo().up() ? m->config().votes : 0;
     return vUp * 2 > _totalVotes();
 }
Ejemplo n.º 9
0
 void ReplSetImpl::_getTargets(list<Target>& L, int& configVersion) {
     configVersion = config().version;
     for( Member *m = head(); m; m=m->next() )
         if( m->hbinfo().maybeUp() )
             L.push_back( Target(m->fullName()) );
 }
Ejemplo n.º 10
0
static int
delegate_handler( Member* member, CAtom* atom )
{
    Member* delegate = member_cast( member->delattr_context );
    return delegate->delattr( atom );
}
Ejemplo n.º 11
0
Archivo: rs.cpp Proyecto: sivy/mongo
    /** @param reconf true if this is a reconfiguration and not an initial load of the configuration.
        @return true if ok; throws if config really bad; false if config doesn't include self
    */
    bool ReplSetImpl::initFromConfig(ReplSetConfig& c, bool reconf) {
        /* NOTE: haveNewConfig() writes the new config to disk before we get here.  So 
                 we cannot error out at this point, except fatally.  Check errors earlier.
                 */
        lock lk(this);

        if( getLastErrorDefault || !c.getLastErrorDefaults.isEmpty() ) {
            // see comment in dbcommands.cpp for getlasterrordefault
            getLastErrorDefault = new BSONObj( c.getLastErrorDefaults );
        }

        list<const ReplSetConfig::MemberCfg*> newOnes;
        bool additive = reconf;
        {
            unsigned nfound = 0;
            int me = 0;
            for( vector<ReplSetConfig::MemberCfg>::iterator i = c.members.begin(); i != c.members.end(); i++ ) { 
                const ReplSetConfig::MemberCfg& m = *i;
                if( m.h.isSelf() ) {
                    nfound++;
                    me++;
                    if( !reconf || (_self && _self->id() == (unsigned) m._id) )
                        ;
                    else { 
                        log() << "replSet " << _self->id() << ' ' << m._id << rsLog;
                        assert(false);
                    }
                }
                else if( reconf ) { 
                    const Member *old = findById(m._id);
                    if( old ) { 
                        nfound++;
                        assert( (int) old->id() == m._id );
                        if( old->config() == m ) { 
                            additive = false;
                        }
                    }
                    else {
                        newOnes.push_back(&m);
                    }
                }
            }
            if( me == 0 ) {
                // log() << "replSet config : " << _cfg->toString() << rsLog;
                log() << "replSet error self not present in the repl set configuration:" << rsLog;
                log() << c.toString() << rsLog;
                uasserted(13497, "replSet error self not present in the configuration");
            }
            uassert( 13302, "replSet error self appears twice in the repl set configuration", me<=1 );

            if( reconf && config().members.size() != nfound ) 
                additive = false;
        }

        _cfg = new ReplSetConfig(c);
        assert( _cfg->ok() );
        assert( _name.empty() || _name == _cfg->_id );
        _name = _cfg->_id;
        assert( !_name.empty() );

        if( additive ) { 
            log() << "replSet info : additive change to configuration" << rsLog;
            for( list<const ReplSetConfig::MemberCfg*>::const_iterator i = newOnes.begin(); i != newOnes.end(); i++ ) {
                const ReplSetConfig::MemberCfg* m = *i;
                Member *mi = new Member(m->h, m->_id, m, false);

                /** we will indicate that new members are up() initially so that we don't relinquish our 
                    primary state because we can't (transiently) see a majority.  they should be up as we 
                    check that new members are up before getting here on reconfig anyway.
                    */
                mi->get_hbinfo().health = 0.1;

                _members.push(mi);
                startHealthTaskFor(mi);
            }
            return true;
        }

        // start with no members.  if this is a reconfig, drop the old ones.
        _members.orphanAll();

        endOldHealthTasks();

        int oldPrimaryId = -1;
        {
            const Member *p = box.getPrimary();
            if( p ) 
                oldPrimaryId = p->id();
        }
        forgetPrimary();
        setSelfTo(0);
        for( vector<ReplSetConfig::MemberCfg>::iterator i = _cfg->members.begin(); i != _cfg->members.end(); i++ ) { 
            const ReplSetConfig::MemberCfg& m = *i;
            Member *mi;
            if( m.h.isSelf() ) {
                assert( _self == 0 );
                mi = new Member(m.h, m._id, &m, true);
                setSelfTo(mi);
                if( (int)mi->id() == oldPrimaryId )
                    box.setSelfPrimary(mi);
            } else {
                mi = new Member(m.h, m._id, &m, false);
                _members.push(mi);
                startHealthTaskFor(mi);
                if( (int)mi->id() == oldPrimaryId )
                    box.setOtherPrimary(mi);
            }
        }
        return true;
    }
Ejemplo n.º 12
0
Archivo: rs.cpp Proyecto: web-os/mongo
/** @param reconf true if this is a reconfiguration and not an initial load of the configuration.
    @return true if ok; throws if config really bad; false if config doesn't include self
*/
bool ReplSetImpl::initFromConfig(ReplSetConfig& c, bool reconf) {
    /* NOTE: haveNewConfig() writes the new config to disk before we get here.  So
             we cannot error out at this point, except fatally.  Check errors earlier.
             */
    lock lk(this);

    if( getLastErrorDefault || !c.getLastErrorDefaults.isEmpty() ) {
        // see comment in dbcommands.cpp for getlasterrordefault
        getLastErrorDefault = new BSONObj( c.getLastErrorDefaults );
    }

    list<const ReplSetConfig::MemberCfg*> newOnes;
    // additive short-cuts the new config setup. If we are just adding a
    // node/nodes and nothing else is changing, this is additive. If it's
    // not a reconfig, we're not adding anything
    bool additive = reconf;
    {
        unsigned nfound = 0;
        int me = 0;
        for( vector<ReplSetConfig::MemberCfg>::iterator i = c.members.begin(); i != c.members.end(); i++ ) {
            const ReplSetConfig::MemberCfg& m = *i;

            if( m.h.isSelf() ) {
                me++;
            }

            if( reconf ) {
                if (m.h.isSelf() && (!_self || (int)_self->id() != m._id)) {
                    log() << "self doesn't match: " << m._id << rsLog;
                    assert(false);
                }

                const Member *old = findById(m._id);
                if( old ) {
                    nfound++;
                    assert( (int) old->id() == m._id );
                    if( old->config() != m ) {
                        additive = false;
                    }
                }
                else {
                    newOnes.push_back(&m);
                }
            }
        }
        if( me == 0 ) {
            _members.orphanAll();
            // hbs must continue to pick up new config
            // stop sync thread
            box.set(MemberState::RS_STARTUP, 0);

            // go into holding pattern
            log() << "replSet error self not present in the repl set configuration:" << rsLog;
            log() << c.toString() << rsLog;
            return false;
        }
        uassert( 13302, "replSet error self appears twice in the repl set configuration", me<=1 );

        // if we found different members that the original config, reload everything
        if( reconf && config().members.size() != nfound )
            additive = false;
    }

    _cfg = new ReplSetConfig(c);
    assert( _cfg->ok() );
    assert( _name.empty() || _name == _cfg->_id );
    _name = _cfg->_id;
    assert( !_name.empty() );

    // this is a shortcut for simple changes
    if( additive ) {
        log() << "replSet info : additive change to configuration" << rsLog;
        for( list<const ReplSetConfig::MemberCfg*>::const_iterator i = newOnes.begin(); i != newOnes.end(); i++ ) {
            const ReplSetConfig::MemberCfg* m = *i;
            Member *mi = new Member(m->h, m->_id, m, false);

            /** we will indicate that new members are up() initially so that we don't relinquish our
                primary state because we can't (transiently) see a majority.  they should be up as we
                check that new members are up before getting here on reconfig anyway.
                */
            mi->get_hbinfo().health = 0.1;

            _members.push(mi);
            startHealthTaskFor(mi);
        }
        return true;
    }

    // start with no members.  if this is a reconfig, drop the old ones.
    _members.orphanAll();

    endOldHealthTasks();

    int oldPrimaryId = -1;
    {
        const Member *p = box.getPrimary();
        if( p )
            oldPrimaryId = p->id();
    }
    forgetPrimary();

    // not setting _self to 0 as other threads use _self w/o locking
    int me = 0;

    // For logging
    string members = "";

    for( vector<ReplSetConfig::MemberCfg>::iterator i = _cfg->members.begin(); i != _cfg->members.end(); i++ ) {
        const ReplSetConfig::MemberCfg& m = *i;
        Member *mi;
        members += ( members == "" ? "" : ", " ) + m.h.toString();
        if( m.h.isSelf() ) {
            assert( me++ == 0 );
            mi = new Member(m.h, m._id, &m, true);
            setSelfTo(mi);

            if( (int)mi->id() == oldPrimaryId )
                box.setSelfPrimary(mi);
        }
        else {
            mi = new Member(m.h, m._id, &m, false);
            _members.push(mi);
            startHealthTaskFor(mi);
            if( (int)mi->id() == oldPrimaryId )
                box.setOtherPrimary(mi);
        }
    }

    if( me == 0 ) {
        log() << "replSet warning did not detect own host in full reconfig, members " << members << " config: " << c << rsLog;
    }

    return true;
}
Ejemplo n.º 13
0
void SecurityManager::loadMembers()
{
    if (isSql()) {
        loadSqlMembers();
        return;
    }
    const char *path = "serverdb/members.txt";
    const char *backup = "serverdb/members.backup.txt";
    {
        QDir d;
        d.mkdir("serverdb");
    }

    if (!QFile::exists(path) && QFile::exists(backup)) {
        QFile::rename(backup, path);
    }

    memberFile.setFileName(path);
    if (!memberFile.open(QFile::ReadWrite)) {
        throw QObject::tr("Error: cannot open the file that contains the members (%1)").arg(path);
    }

    int pos = memberFile.pos();
    while (!memberFile.atEnd()) {
        QByteArray arr = memberFile.readLine();
        QString s = QString::fromUtf8(arr.constData(), std::max(0,arr.length()-1)); //-1 to remove the \n

        QStringList ls = s.split('%');

        if (ls.size() >= 6 && isValid(ls[0])) {
            Member m (ls[0], ls[1].trimmed(), ls[2][0].toLatin1() - '0', ls[2][1] == '1', ls[3].trimmed().toLatin1(), ls[4].trimmed().toLatin1(), ls[5].trimmed());

            if (ls.size() >= 7) {
                m.ban_expire_time = ls[6].toInt();
            }

            m.filepos = pos;
            members[ls[0]] = m;

            /* Update pos for next iteration */
            pos = memberFile.pos();

            if (m.isBanned()) {
                bannedIPs.insert(m.ip, m.ban_expire_time);
                bannedMembers.insert(m.name.toLower(), std::pair<QString, int>(m.ip, m.ban_expire_time));
            }
            if (m.authority() > 0) {
                authed.insert(m.name);
            }
            playersByIp.insert(m.ip, m.name);
        }
        lastPlace = memberFile.pos();
    }

    //We also clean up the file by rewritting it with only the valid contents
    QFile temp (backup);
    if (!temp.open(QFile::WriteOnly | QFile::Truncate))
        throw QObject::tr("Impossible to change %1").arg(backup);

    pos = temp.pos();

    for(auto it = members.begin(); it != members.end(); ++it) {
        Member &m = it->second;
        m.write(&temp);
        m.filepos = pos;
        pos = temp.pos();
    }

    lastPlace = temp.pos();

    temp.flush();
    memberFile.remove();

    if (!temp.rename(path)) {
        throw QObject::tr("Error: cannot rename the file that contains the members (%1 -> %2)").arg(backup).arg(path);
    }

    temp.rename(path);

    if (!memberFile.open(QFile::ReadWrite)) {
        throw QObject::tr("Error: cannot reopen the file that contains the members (%1)").arg(path);
    }
}
Ejemplo n.º 14
0
/// Given a Reflex::Member object, return the id for the configurable (name or id, if it is a string).
/// non-string ids are used for the persistency (DataObjects)
inline std::string getId(const Member & m) {
      return (m.Properties().HasProperty("id") && (m.Properties().PropertyValue("id").TypeInfo() == typeid(std::string))) ?
             m.Properties().PropertyAsString("id") :
             m.Properties().PropertyAsString("name") ;
}
Ejemplo n.º 15
0
int Msm::epoll_pollin(int fd)
{
        LOG(LOG_DEBUG, "socket: %d EPOLLIN event.", fd);

        char buf[1024];
        memset(buf, 0, sizeof(buf));
        // int rc = recv(events[n].data.fd, buf, sizeof(buf)-1, 0);


        struct msghdr msghdr;
        struct iovec iov;

        memset(&msghdr, 0, sizeof(msghdr));
        iov.iov_base = buf;
        iov.iov_len = sizeof(buf);

        msghdr.msg_iov = &iov;
        msghdr.msg_iovlen = 1;

        int rc = recvmsg(fd, &msghdr, 0);

        if (rc == -1) {
                LOG(LOG_ERROR, "socket: %d recvmsg failed: %s", fd, strerror(errno));
                return -1;
        } else if (rc == 0) {
                LOG(LOG_ERROR, "socket: %d recvmsg 0, socket is closed by user.", fd);
                if (get_member_byfd(fd) != NULL) {
                        logout(get_member_byfd(fd)->get_id());
                }
                return -1;
        }
        LOG(LOG_DEBUG, "socket: %d recvmsg:\n%s", fd, buf);
        Json::Value root;
        Json::Reader reader;
        if (reader.parse(buf, root, false) == false) {
                LOG(LOG_DEBUG, "json parse failed.");
                return -1;
        }

        if (epoll_closefd_before(root["action"].asString(), fd, root["user_id"].asString()) < 0)
                return -1;

        msm_msg_t msm_msg;
        msm_msg.sockfd = fd;
        msm_msg.root = root;
        msm_msg.msm = this;

        actions_handle.find(root["action"].asString())->second(msm_msg);

#if 0
        if (root["action"] == "login") {

                login(root["user_id"].asString(), root["user_name"].asString(), fd);
                // send_test(root["from"].asString());
        } else if (root["action"] == "logout") {

                logout(root["user_id"].asString());

        } else if (root["action"] == "heartbeat") {


        } else if (root["action"] == "askmeeting") {


                create_meeting(root["meeting_id"].asString(), root["meeting_name"].asString());
                get_meeting(root["meeting_id"].asString())->add_member(get_member(root["user_id"].asString()));
                get_meeting(root["meeting_id"].asString())->set_admin(root["user_id"].asString());

        } else if (root["action"] == "adduser") {
                if (get_meeting(root["meeting_id"].asString()) != NULL) {
                        if (get_member(root["users"].asString()) == NULL) {
                                Member *m = new Member(root["users"].asString(), "Unkown");
                                m->set_offline();
                                register_member(m);
                        }
                        get_meeting(root["meeting_id"].asString())->add_member(get_member(root["users"].asString()));
                }
        } else if (root["action"] == "leavemeeting") {
                Meeting *meeting = get_meeting(root["meeting_id"].asString());
                if (meeting != NULL) {
                        Member *m = get_member(root["user_id"].asString());
                        if (m->get_id() != meeting->get_admin()) {
                                meeting->del_member(m);
                        } else {
                                destroy_meeting(meeting->get_id());
                        }
                }
        } else {


        }
#endif
        epoll_closefd_after(root["action"].asString(), fd, root["user_id"].asString());
        dump_members();
        dump_meetings();
        return 0;
}
Ejemplo n.º 16
0
/*************************************************************
 * another kind of function that return a set
 ************************************************************/
std::vector<QueryTuple*> SetFunFactory::funInstance(XSchema* _pSch, 
										            std::string& _cubeName, 
									                SetTypesec _typesec, 
									                std::vector<std::string>& theVector,
													FunParam *param)
{
    int size = theVector.size();
    XCube* pCube = _pSch->getCube(_cubeName);
	vector<QueryMember*> QmemVector;
	vector<QueryTuple*> QtupleVector;

	string dimName = "";
	string hieName = "";			
	Dimension* pDim = NULL;
	Hierarchy* pHie = NULL;
				
	if (isDimHie(theVector.at(0)))
	{
		vector<string> temp = distinct(theVector.at(0));
		dimName = temp.at(0);
		pDim = pCube->getDimension(temp.at(0));
		assert(pDim);
		hieName = temp.at(1);
		pHie = pDim->getHierarchy(temp.at(1));
		assert(pHie);
	}
			  
	else
	{
		dimName = theVector.at(0);
		pDim = pCube->getDimension(theVector.at(0));
		assert(pDim);
		pHie = pDim->getDefaultHierarchy();
	}
	assert(pHie);
	hieName = pHie->getName();
	
	//首先把Member从数据库中load出来
	pHie->LoadMembers();
	
	switch(_typesec)
	{
		//函数Members的处理对象
		//对于[Time].[Time].[1995].[Q1].[Month].Members
		//theVector中应依次存有string:Time, Time, 1995, Q1, Month
	case Members:
		if (size == 0 )
		{
			cout<<"error! please input query information..."<<endl;
		}
		else if (size == 1) //由于现在还不支持多个Hierarchy,所以size 为1、2结果是一样的
		{   
			if ((theVector.at(0) == "Measures")||(theVector.at(0) == "measures"))
			{
				//元数据现在还没有支持默认度量,先以第一个度量为默认的
				vector<Measure*> vecMea = pCube->getMeasures();
				vector<Measure*>::iterator meaIterator;
				if (!vecMea.empty())
				{
					for (meaIterator = vecMea.begin(); meaIterator < vecMea.end(); meaIterator++)
					{
						std::auto_ptr<QueryMember>pMem(new QueryMember);
	                    
						pMem->setHierarchyName("Measures");
						pMem->setLevelName("Measures");
					    pMem->setVal((*meaIterator)->getName());

						QmemVector.push_back(pMem.release());
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
					}
				}
 				
 				return QtupleVector;
			} 
			else
			{
				string hierarcyName = pHie->getName();
				vector<string> vecLevelName;
	//			vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector
				
				vector<Level*> vecLevel = pHie->getLeveles();

				Member* temp = (vecLevel.at(0)->getMembers()).at(0);//获取第一个级别第一个成员
				
				getDescendants(temp,dimName,hieName,QtupleVector); // 获取该成员的所有后代
				
				pHie->CleanMembers();
				return QtupleVector;
				
			}
		}

		else if (size == 2)
		{   
			
			Level* pLevel = pHie->getLevel(theVector.at(1));
			
			vector<Member *> memVector1 = pLevel->getMembers();
			if (memVector1.empty())
			{
				cout<<"empty member vector,do not get the members from database"<<endl;
			} 
			else
			{
				vector<Member*>::iterator theIterator;
				QueryMember *pMem;

				for (theIterator = memVector1.begin(); theIterator < memVector1.end(); theIterator++)
				{
					
				    pMem = DwMemToQryMem(*theIterator,dimName,hieName);
					QmemVector.push_back(pMem);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				
				pHie->CleanMembers();
				
				return QtupleVector;
			}	

		} 

		else if(size >= 3)  // [Time.Time].[Month].[Day].Members
		{
			cout<<"Members funtion error,too much member"<<endl;
			return 0;
		}

	break;
 
	//函数AllMembers,参考SQL Server联机丛书
	//返回包含指定维度或级别的所有成员的集合,包括计算成员。
	//注:暂时不考虑计算成员的处理,此时功能和Members功能差不多
	case AllMembers:
		if (size == 0 )
		{
			cout<<"error! please input the query information!"<<endl;
		}

		else
		{
			if (size == 1)
			{
				std::auto_ptr<QueryMember>pMem(new QueryMember);
				pMem->setVal("All");
				pMem->setDimensionName(dimName);    // add by eason
				pMem->setHierarchyName(hieName);
				pMem->setLevelName("All");
				QmemVector.push_back(pMem.release());
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
				return QtupleVector;
			} 	
		
			else if(size == 2)//[Time].[Quarter].AllMembers
			{
				pHie->LoadMembers();             //首先把Member从数据库中load出来 add by eason
				
				Level* pLevel = pHie->getLevel(theVector.at(size-1));
				vector<Member*> memVector = pLevel->getMembers();
				vector<Member*>::iterator theIterator;
				QueryMember *pMem;

				for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++)
				{
					pMem = DwMemToQryMem(*theIterator,dimName,hieName);
					QmemVector.push_back(pMem);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				pHie->CleanMembers();  
				
				return QtupleVector;
			}
		
			else //[Time].[Year].[Month].AllMembers
			{
				cout<<"AllMembers funtion error,too much member"<<endl;
				return 0;
			}
		}
	break;

	case Children:
		{
		//注:JPivot里面是不可能出现这种情况的
		//因为一旦出现,JPivot会自动转化成加一个CurrentMember函数
		//如:[Time].Children会自动转变成[Time].CurrentMember.Children
		
		bool isall = false;
		if (size == 1)
		{
			cout<<"error! invalid using of Children"<<endl;

		} 

		else
		{			
			vector<Level*> levelVec = pHie->getLeveles();
			
			Member* mem = levelVec.at(0)->getMember(theVector.at(1), 0);
			
			for (int i = 1; i < size-1; i++)
			{
				mem = levelVec.at(i)->getMember(theVector.at(i+1), mem); 
			}
		
			vector<Member*> memVec = mem->getChildrenMember();

			vector<Member*>::iterator memIterator;
			QueryMember * ptr;
				
			for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++)
			{
				ptr = DwMemToQryMem(*memIterator,dimName,hieName);
				QmemVector.push_back(ptr);
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
		
			pHie->CleanMembers();

 			return QtupleVector;
 		}
		
		break;
		
}
	    //下一个函数起点
		case Siblings:

			if(size >= 2){
				
				vector<Level*> levelVec = pHie->getLeveles();
				Level *pLevel = levelVec.at(0);
				
				Member* temp = levelVec.at(0)->getMember(theVector.at(1), 0);
								
				for (int i = 1; i < size-1; i++)
				{
					temp = levelVec.at(i)->getMember(theVector.at(i+1), temp); 
				    pLevel = levelVec.at(i);	//兄弟成员所在的level				
				}
								
				Member* pMem = temp->getParent();
								
				vector<Member *> memVec;
							
				if(!pMem)   //不存在父成员,如Time.1998
				{	
					memVec = pLevel->getMembers();
				}
								
				else
				{
					memVec = pMem->getChildrenMember();
				}
				
				vector<Member *>::iterator memIterator;
				QueryMember *ptr;
				
				for(memIterator = memVec.begin();memIterator != memVec.end();memIterator++)
				{
					ptr = DwMemToQryMem(*memIterator,dimName,hieName);
					QmemVector.push_back(ptr);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				pHie->CleanMembers();
				
				return QtupleVector;
			}
			else 
			{
				cout<<"Siblings funtion error,too less member"<<endl;
				return 0;
			}
			
			break;	
	
			
	case Descendants:
		{	
			   

				Level *ancLevel;  //先代成员所在的level
				Level *decLevel;  //后代成员所在的level
				vector<Level*> levelVec = pHie->getLeveles();
				Member* ancMember = levelVec.at(0)->getMember(theVector.at(1), 0);
				
				//定位目标成员
				for (int i = 1; i < size-1; i++)
				{
					ancMember = levelVec.at(i)->getMember(theVector.at(i+1), ancMember); 
                    ancLevel = levelVec.at(i);
				}
				
				if(param->getHasIntParam() || param->getHasStrParam())
				{ 
					if(param->getHasIntParam())   //如果包含数字型参数
					{
						int num = param->getIntParam();
						decLevel = ancLevel;

						if(num>0)
						{
							// 定位目标级别
							for(int j=0;j<num;j++)
							{
								decLevel = decLevel ->getChildLevel();
								assert(decLevel);   //不存在该级别
							}
						}
					}
				
					if(param->getHasStrParam())  //如果包含字符型参数
					{
						char *str = param->getStrParam();
						// 定位目标级别
						decLevel = pHie->getLevel(str); 
						assert(decLevel);   //不存在该级别
					}

					vector<Member *> _mem = decLevel->getMembers();
					vector<QueryMember*> QmemVector;
					QueryMember* ancMem = DwMemToQryMem(ancMember,dimName,hieName);
					QueryMember* decMem;
				
					for(int i = 0; i< _mem.size(); i++)
					{
						decMem = DwMemToQryMem(_mem.at(i),dimName,hieName);
					
						//此处仍可改进,没必要遍历级别上的所有成员
						if(isAncestor(ancMem, decMem))
						{
							QmemVector.push_back(decMem);
							std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));	
							QmemVector.pop_back();
							QtupleVector.push_back(pTuple.release());
						}
					}
				}

				else         //如果不含参数
				{
					getDescendants(ancMember,dimName,hieName,QtupleVector);
				}

				pHie->CleanMembers();
				return QtupleVector;
		}
				break;

		case Ascendants:
		{			
					vector<Level*> levelVec = pHie->getLeveles();
					Member* decMember = levelVec.at(0)->getMember(theVector.at(1), 0);
					
					//定位目标成员
					for (int i = 1; i < size-1; i++)
					{
						decMember = levelVec.at(i)->getMember(theVector.at(i+1), decMember); 
						assert(decMember);
					}

					vector<QueryMember*> QmemVector;
					QueryMember * ancQryMem;
					Member* ancMember = decMember ;

					while(ancMember)
					{
						ancQryMem = DwMemToQryMem(ancMember,dimName,hieName);
						QmemVector.push_back(ancQryMem);
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));	
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
						ancMember = ancMember->getParent();
					}

					pHie->CleanMembers();
					return QtupleVector;
		}
					break;
	}

}
Ejemplo n.º 17
0
    void ReplSetImpl::_summarizeAsHtml(stringstream& s) const {
        s << table(0, false);
        s << tr("Set name:", _name);
        s << tr("Majority up:", elect.aMajoritySeemsToBeUp()?"yes":"no" );
        s << _table();

        const char *h[] = {"Member",
                           "<a title=\"member id in the replset config\">id</a>",
                           "Up",
                           "<a title=\"length of time we have been continuously connected to the other member with no reconnects (for self, shows uptime)\">cctime</a>",
                           "<a title=\"when this server last received a heartbeat response - includes error code responses\">Last heartbeat</a>",
                           "Votes", "Priority", "State", "Messages",
                           "<a title=\"how up to date this server is.  this value polled every few seconds so actually lag is typically much lower than value shown here.\">optime</a>",
                           "<a title=\"Clock skew in seconds relative to this server. Informational; server clock variances will make the diagnostics hard to read, but otherwise are benign..\">skew</a>",
                           0
                          };
        s << table(h);

        /* this is to sort the member rows by their ordinal _id, so they show up in the same
           order on all the different web ui's; that is less confusing for the operator. */
        map<int,string> mp;

        string myMinValid;
        try {
            readlocktry lk("local.replset.minvalid", 300);
            if( lk.got() ) {
                BSONObj mv;
                if( Helpers::getSingleton("local.replset.minvalid", mv) ) {
                    myMinValid = "minvalid:" + mv["ts"]._opTime().toString();
                }
            }
            else myMinValid = ".";
        }
        catch(...) {
            myMinValid = "exception fetching minvalid";
        }

        const Member *_self = this->_self;
        assert(_self);
        {
            stringstream s;
            /* self row */
            s << tr() << td(_self->fullName() + " (me)") <<
              td(_self->id()) <<
              td("1") <<  //up
              td(ago(started)) <<
              td("") << // last heartbeat
              td(ToString(_self->config().votes)) <<
              td(ToString(_self->config().priority)) <<
              td( stateAsHtml(box.getState()) + (_self->config().hidden?" (hidden)":"") );
            s << td( _hbmsg );
            stringstream q;
            q << "/_replSetOplog?_id=" << _self->id();
            s << td( a(q.str(), myMinValid, theReplSet->lastOpTimeWritten.toString()) );
            s << td(""); // skew
            s << _tr();
            mp[_self->hbinfo().id()] = s.str();
        }
        Member *m = head();
        while( m ) {
            stringstream s;
            m->summarizeMember(s);
            mp[m->hbinfo().id()] = s.str();
            m = m->next();
        }

        for( map<int,string>::const_iterator i = mp.begin(); i != mp.end(); i++ )
            s << i->second;
        s << _table();
    }
Ejemplo n.º 18
0
bool JoinMembers::init()
{
	CCLayer::init();
		
	this->setTouchEnabled(true);
	schedule(schedule_selector(JoinMembers::update));
	goalPoint = ccp(240, 160);
	
	Member* findingUser = new Member();
	findingUser->initWithFile("search_finding.png");
	findingUser->autorelease();
	findingUser->setPosition(ccp(240, 225 + 20.f));
	findingUser->goalPoint = findingUser->getPosition();
	findingUser->startPoint = findingUser->getPosition();
	findingUser->runAction(CCRepeatForever::create(CCSequence::createWithTwoActions(CCFadeOut::create(1.f),
																					  CCFadeIn
																					  ::create(1.f))));
//	findingUser->isGoal = true;
	addChild(findingUser);
	members.push_back(findingUser);
	
	allUser = new Member();
	allUser->initWithFile("search_user.png");
	allUser->setPosition(ccp(240, 176  + 20.f));
	allUser->goalPoint = allUser->getPosition();
	allUser->startPoint = allUser->getPosition();
	addChild(allUser);
//	allUser->isGoal = true;
	members.push_back(allUser);
	
	Member* me = new Member();
	me->initWithFile("search_me.png");
	
	me->autorelease();
//	me->setScale(2.f);
//	me->isGoal = true;
	me->setPosition(ccp(240, 145  + 20.f));
	me->goalPoint = me->getPosition();
	me->startPoint = me->getPosition();
	addChild(me);
	members.push_back(me);
	
	CCSprite* flag = CCSprite::createWithSpriteFrameName((NSDefault::getCountry() + ".png").c_str());
	flag->setPosition(ccp(28, 22));
	me->addChild(flag);
	
	CCLabelTTF* userName = CCLabelTTF::create(NSDefault::getUserName().c_str(), defaultFont, 13.f);
	userName->setColor(ccc3(0,0,0));
	me->addChild(userName);
	userName->setAnchorPoint(ccp(0.f, 0.5f));
	userName->setPosition(ccp(55, 21));
	
	Member* progressBack = new Member();
	progressBack->initWithFile("search_back.png");
	progressBack->autorelease();
	progressBack->setPosition(ccp(240, 202  + 20.f));
	progressBack->startPoint = progressBack->goalPoint = progressBack->getPosition();
	addChild(progressBack);
	
	members.push_back(progressBack);
	
	progress = CCProgressTimer::create(CCSprite::create("search_front.png"));
	progress->setBarChangeRate(ccp(1, 0));
	progress->setMidpoint(ccp(0, 0.5f));
	progress->setType(CCProgressTimerType::kCCProgressTimerTypeBar);
	progress->setPosition(ccp(240, 202  + 20.f));
	progress->setPercentage(0.f);
	addChild(progress);
	
	return true;
}
Ejemplo n.º 19
0
	int bookRoom(Lodging &lodging, Member & member)
	{


		cout << endl <<endl << endl;		
		cout << "RESERVATION START" << endl;

		string y, m, d, peri, per,r;
		int year, month, day, period, person, rnumber, user;
		int checkerror;


		cout << " ROOM NUMBER : ";
		getline(cin, r);
		cout << endl;
		rnumber = atoi(r.c_str());
		cout << " PERSON : ";
		getline(cin, per);
		person = atoi(per.c_str());
		cout << endl;
		cout << " YEAR : " ;
		getline(cin, y);
		year = atoi(y.c_str());
		cout << endl;
		cout << " MONTH : ";
		getline(cin, m);
		month = atoi(m.c_str());
		cout << endl;		
		cout << " DAY : ";
		getline(cin, d);
		day = atoi(d.c_str());
		cout << endl;
		cout << " PERIOD : ";
		getline(cin, peri);
		period = atoi(peri.c_str());
		cout << endl;


		
		user =member.getMNumber();
		
 
		checkerror = fileIO::saveBook(lodging.getLNumber(), rnumber, year, month, day, period, person, user);


		if ( checkerror == -1 )
		{
			cin.ignore(1024, '\n');
			cout << "FAIL" <<endl;
			cin.ignore(1024, '\n');
		}

		else
		{
		system("clear");
		cin.ignore(1024, '\n');
		cout << "******************************************************************************" <<endl;
		cout << " 				RESERVATION COMPLETE" << endl;
		cout << "******************************************************************************" <<endl;
		cout << endl << endl << endl;
		cout << " 				  Go to MAIN MENU" << endl;
		cin.ignore(1024, '\n');
		return 3;
		}

	}
Ejemplo n.º 20
0
    void ReplSetImpl::_summarizeStatus(BSONObjBuilder& b) const {
        vector<BSONObj> v;

        const Member *_self = this->_self;
        verify( _self );

        MemberState myState = box.getState();

        // add self
        {
            BSONObjBuilder bb;
            bb.append("_id", (int) _self->id());
            bb.append("name", _self->fullName());
            bb.append("health", 1.0);
            bb.append("state", (int)myState.s);
            bb.append("stateStr", myState.toString());
            bb.append("uptime", (unsigned)(time(0) - cmdLine.started));
            if (!_self->config().arbiterOnly) {
                bb.appendTimestamp("optime", lastOpTimeWritten.asDate());
                bb.appendDate("optimeDate", lastOpTimeWritten.getSecs() * 1000LL);
            }

            int maintenance = _maintenanceMode;
            if (maintenance) {
                bb.append("maintenanceMode", maintenance);
            }

            if (theReplSet) {
                string s = theReplSet->hbmsg();
                if( !s.empty() )
                    bb.append("errmsg", s);
            }
            bb.append("self", true);
            v.push_back(bb.obj());
        }

        Member *m =_members.head();
        while( m ) {
            BSONObjBuilder bb;
            bb.append("_id", (int) m->id());
            bb.append("name", m->fullName());
            double h = m->hbinfo().health;
            bb.append("health", h);
            bb.append("state", (int) m->state().s);
            if( h == 0 ) {
                // if we can't connect the state info is from the past and could be confusing to show
                bb.append("stateStr", "(not reachable/healthy)");
            }
            else {
                bb.append("stateStr", m->state().toString());
            }
            bb.append("uptime", (unsigned) (m->hbinfo().upSince ? (time(0)-m->hbinfo().upSince) : 0));
            if (!m->config().arbiterOnly) {
                bb.appendTimestamp("optime", m->hbinfo().opTime.asDate());
                bb.appendDate("optimeDate", m->hbinfo().opTime.getSecs() * 1000LL);
            }
            bb.appendTimeT("lastHeartbeat", m->hbinfo().lastHeartbeat);
            bb.append("pingMs", m->hbinfo().ping);
            string s = m->lhb();
            if( !s.empty() )
                bb.append("errmsg", s);

            if (m->hbinfo().authIssue) {
                bb.append("authenticated", false);
            }

            v.push_back(bb.obj());
            m = m->next();
        }
        sort(v.begin(), v.end());
        b.append("set", name());
        b.appendTimeT("date", time(0));
        b.append("myState", myState.s);
        const Member *syncTarget = _currentSyncTarget;
        if ( syncTarget && 
            (myState != MemberState::RS_PRIMARY) && 
            (myState != MemberState::RS_SHUNNED) ) {
            b.append("syncingTo", syncTarget->fullName());
        }
        b.append("members", v);
        if( replSetBlind )
            b.append("blind",true); // to avoid confusion if set...normally never set except for testing.
    }
Ejemplo n.º 21
0
	int checkBook(const Lodging & lodging)
	{
		Room r;
		RoomList rltemp;
		RoomList rl = lodging.getRoomList();
		int size = rl.getSize();
		Calendar cal = Calendar(true);
		int x = 1;

		cout
			<< " ****************************************************************************** " << endl
			<< "                          숙 박 업 소 관 리 프 로 그 램  " << endl
			<< " ****************************************************************************** " << endl
			<< endl;

		cout << setw(15) << "";
		int m, d;
		for( int plus = 0; plus < 7 ; plus++) //1주 분량의 날짜
		{
			m = cal.getMonth();
			d = cal.getDay();
			cout << setw(2) << m << "/" << setw(2) << d << " ";
			cal.addOneDay();
		}
		cout <<  endl;
		cout << "------------------------------------------------------------" <<endl;


		if(size > 0)
		{
			cal = Calendar(true);
			r = rl.getFirstRoom();

			cout << setw(11) << r.getRNumber() << "호| ";
			for ( int plus = 0 ; plus < 7 ; plus ++)
			{
				Room b;
				int k;

				fileIO::loadBookLodging(rltemp, r.getLNumber(), cal.getYear(), cal.getMonth(), cal.getDay(), 1);
				b = rltemp.searchRoom(r.getRNumber());
				k = b.getRNumber();
				if (k == -1)
					cout << "  O   ";
				else
					cout << "  X   ";
				cal.addOneDay();
			}
			cout << endl;
		}

		while ( x < size )
		{
			cal = Calendar(true);
			r = rl.getNextRoom();
			cout << setw(11) << r.getRNumber() << "호| ";
			for(int plus = 0; plus < 7; plus++)
			{
				Room b;
				int k;
				fileIO::loadBookLodging(rltemp, r.getLNumber(), cal.getYear(), cal.getMonth(), cal.getDay(), 1);
				b = rltemp.searchRoom(r.getRNumber());
				k = b.getRNumber();
				if (k == -1)
					cout << "  O   ";
				else
					cout << "  X   ";
				cal.addOneDay();
			}
			x++;
			cout << endl;
		}

		cal = Calendar(true);
		x = 1;

		cout << endl << " 오늘의 예약 | 인원 | 기간 |     연 락 처     |   이   름 " << endl
			<< "------------------------------------------------------------" <<endl;
		if(size > 0)
		{
			r = rl.getFirstRoom();

			cout << setw(11) << r.getRNumber() << "호| ";
			int k;

			Member m = fileIO::getBookUser(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay());
			k = m.getMNumber();
			if (k == -1)
				cout << " 오늘의 예약이 없습니다.";
			else
				cout << setw(4) << m.getSPerson() << " | " << setw(4) << m.getSPeriod() << " | " << setw(16) << m.getTelephone() << " | " << m.getName();
			cout << endl;
		}

		while ( x < size )
		{
			r = rl.getNextRoom();
			cout << setw(11) << r.getRNumber() << "호| ";
			Room b;
			int k;
			Member m = fileIO::getBookUser(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay());
			k = m.getMNumber();
			if (k == -1)
				cout << " 오늘의 예약이 없습니다.";
			else
				cout << setw(4) << m.getSPerson() << " | " << setw(4) << m.getSPeriod() << " | " << setw(16) << m.getTelephone() << " | " << m.getName();
			x++;
			cout << endl;
		}

		x = 1;

		cout << endl << " 오늘의 룸서비스 : ";
		if(size > 0)
		{
			r = rl.getFirstRoom();

			if(fileIO::getBookRoomStatus(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay()) == 1)
				cout << r.getRNumber() << "호, ";
		}

		while ( x < size )
		{
			r = rl.getNextRoom();
			if(fileIO::getBookRoomStatus(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay()) == 1)
				cout << r.getRNumber() << "호, ";
			x++;
		}
		cout << endl;

		keyIO::getch();

		return M_MENU;
	}
Ejemplo n.º 22
0
LIBSBML_CPP_NAMESPACE_USE

int main(int argc,char** argv){

//
// Creates an SBMLNamespaces object with the given SBML level, version
// package name, package version.
//
// (NOTE) By defualt, the name of package (i.e. "groups") will be used
// if the arugment for the prefix is missing or empty. Thus the argument
// for the prefix can be added as follows:
//
//    SBMLNamespaces sbmlns(3,1,"groups",1,"GROUP");
//

SBMLNamespaces sbmlns(3,1,"groups",1);

//
// (NOTES) The above code creating an SBMLNamespaces object can be replaced 
//         with one of the following other styles.
//
// (1) Creates an SBMLNamespace object with a SBML core namespace and then
//     adds a groups package namespace to the object. 
//
//         SBMLNamespaces sbmlns(3,1);
//         sbmlns.addPkgNamespace("groups",1);
//
//          OR
//
//         SBMLNamespaces sbmlns(3,1);
//         sbmlns.addNamespace(GroupsExtension::XmlnsL3V1V1,"groups");
//
// (2) Creates a GroupsPkgNamespaces object (SBMLNamespace derived class for
//     groups package. The class is basically used for createing an SBase derived
//     objects defined in the groups package) with the given SBML level, version, 
//     and package version
//
//        GroupsPkgNamespaces sbmlns(3,1,1);
//     


// create the document

SBMLDocument *document = new SBMLDocument(&sbmlns);

// create the Model

Model* model=document->createModel();

// create the Compartment

Compartment* compartment = model->createCompartment();
compartment->setId("cytosol");
compartment->setConstant(true);

compartment=model->createCompartment();
compartment->setId("mitochon");
compartment->setConstant(true);

// create the Species

Species* species = model->createSpecies();
species->setId("ATPc");
species->setCompartment("cytosol");
species->setInitialConcentration(1);
species->setHasOnlySubstanceUnits(false);
species->setBoundaryCondition(false);
species->setConstant(false);

species = model->createSpecies();
species->setId("ATPm");
species->setCompartment("mitochon");
species->setInitialConcentration(2);
species->setHasOnlySubstanceUnits(false);
species->setBoundaryCondition(false);
species->setConstant(false);

// create the Groups

//
// Get a GroupsModelPlugin object plugged in the model object.
//
// The type of the returned value of SBase::getPlugin() function is SBasePlugin*, and
// thus the value needs to be casted for the corresponding derived class. 
//
GroupsModelPlugin* mplugin = static_cast<GroupsModelPlugin*>(model->getPlugin("groups"));

//
// Creates a Group object via GroupsModelPlugin object.
//
Group* group = mplugin->createGroup();

group->setId("ATP");
group->setKind(GROUP_KIND_CLASSIFICATION);
group->setSBOTerm("SBO:0000252");

Member* member = group->createMember();
member->setIdRef("ATPc");

member = group->createMember();
member->setIdRef("ATPm");

writeSBML(document,"groups_example1.xml");
delete document;

}
Ejemplo n.º 23
0
        virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {
            if( replSetBlind ) {
                if (theReplSet) {
                    errmsg = str::stream() << theReplSet->selfFullName() << " is blind";
                }
                return false;
            }

            MONGO_FAIL_POINT_BLOCK(rsDelayHeartbeatResponse, delay) {
                const BSONObj& data = delay.getData();
                sleepsecs(data["delay"].numberInt());
            }

            /* we don't call ReplSetCommand::check() here because heartbeat
               checks many things that are pre-initialization. */
            if( !replSet ) {
                errmsg = "not running with --replSet";
                return false;
            }

            /* we want to keep heartbeat connections open when relinquishing primary.  tag them here. */
            {
                AbstractMessagingPort *mp = cc().port();
                if( mp )
                    mp->tag |= ScopedConn::keepOpen;
            }

            if( cmdObj["pv"].Int() != 1 ) {
                errmsg = "incompatible replset protocol version";
                return false;
            }
            {
                string s = string(cmdObj.getStringField("replSetHeartbeat"));
                if (replSettings.ourSetName() != s) {
                    errmsg = "repl set names do not match";
                    log() << "replSet set names do not match, our cmdline: " << replSettings.replSet
                          << rsLog;
                    log() << "replSet s: " << s << rsLog;
                    result.append("mismatch", true);
                    return false;
                }
            }

            result.append("rs", true);
            if( cmdObj["checkEmpty"].trueValue() ) {
                result.append("hasData", replHasDatabases());
            }
            if( (theReplSet == 0) || (theReplSet->startupStatus == ReplSetImpl::LOADINGCONFIG) ) {
                string from( cmdObj.getStringField("from") );
                if( !from.empty() ) {
                    scoped_lock lck( replSettings.discoveredSeeds_mx );
                    replSettings.discoveredSeeds.insert(from);
                }
                result.append("hbmsg", "still initializing");
                return true;
            }

            if( theReplSet->name() != cmdObj.getStringField("replSetHeartbeat") ) {
                errmsg = "repl set names do not match (2)";
                result.append("mismatch", true);
                return false;
            }
            result.append("set", theReplSet->name());

            MemberState currentState = theReplSet->state();
            result.append("state", currentState.s);
            if (currentState == MemberState::RS_PRIMARY) {
                result.appendDate("electionTime", theReplSet->getElectionTime().asDate());
            }

            result.append("e", theReplSet->iAmElectable());
            result.append("hbmsg", theReplSet->hbmsg());
            result.append("time", (long long) time(0));
            result.appendDate("opTime", theReplSet->lastOpTimeWritten.asDate());
            const Member *syncTarget = replset::BackgroundSync::get()->getSyncTarget();
            if (syncTarget) {
                result.append("syncingTo", syncTarget->fullName());
            }

            int v = theReplSet->config().version;
            result.append("v", v);
            if( v > cmdObj["v"].Int() )
                result << "config" << theReplSet->config().asBson();

            Member* from = NULL;
            if (cmdObj.hasField("fromId")) {
                if (v == cmdObj["v"].Int()) {
                    from = theReplSet->getMutableMember(cmdObj["fromId"].Int());
                }
            }
            if (!from) {
                from = theReplSet->findByName(cmdObj.getStringField("from"));
                if (!from) {
                    return true;
                }
            }

            // if we thought that this node is down, let it know
            if (!from->hbinfo().up()) {
                result.append("stateDisagreement", true);
            }

            // note that we got a heartbeat from this node
            theReplSet->mgr->send(stdx::bind(&ReplSet::msgUpdateHBRecv,
                                              theReplSet, from->hbinfo().id(), time(0)));


            return true;
        }
Ejemplo n.º 24
0
    Status LegacyReplicationCoordinator::processHeartbeat(const ReplSetHeartbeatArgs& args,
                                                          ReplSetHeartbeatResponse* response) {
        if (args.getProtocolVersion() != 1) {
            return Status(ErrorCodes::BadValue, "incompatible replset protocol version");
        }

        {
            if (_settings.ourSetName() != args.getSetName()) {
                log() << "replSet set names do not match, our cmdline: " << _settings.replSet
                      << rsLog;
                log() << "replSet s: " << args.getSetName() << rsLog;
                response->noteMismatched();
                return Status(ErrorCodes::BadValue, "repl set names do not match");
            }
        }

        response->noteReplSet();
        if( (theReplSet == 0) || (theReplSet->startupStatus == ReplSetImpl::LOADINGCONFIG) ) {
            if (!args.getSenderHost().empty()) {
                scoped_lock lck( _settings.discoveredSeeds_mx );
                _settings.discoveredSeeds.insert(args.getSenderHost().toString());
            }
            response->setHbMsg("still initializing");
            return Status::OK();
        }

        if (theReplSet->name() != args.getSetName()) {
            response->noteMismatched();
            return Status(ErrorCodes::BadValue, "repl set names do not match (2)");
        }
        response->setSetName(theReplSet->name());

        MemberState currentState = theReplSet->state();
        response->setState(currentState.s);
        if (currentState == MemberState::RS_PRIMARY) {
            response->setElectionTime(theReplSet->getElectionTime().asDate());
        }

        response->setElectable(theReplSet->iAmElectable());
        response->setHbMsg(theReplSet->hbmsg());
        response->setTime((long long) time(0));
        response->setOpTime(theReplSet->lastOpTimeWritten.asDate());
        const Member *syncTarget = BackgroundSync::get()->getSyncTarget();
        if (syncTarget) {
            response->setSyncingTo(syncTarget->fullName());
        }

        int v = theReplSet->config().version;
        response->setVersion(v);
        if (v > args.getConfigVersion()) {
            ReplicaSetConfig config;
            fassert(18635, config.initialize(theReplSet->config().asBson()));
            response->setConfig(config);
        }

        Member* from = NULL;
        if (v == args.getConfigVersion() && args.getSenderId() != -1) {
            from = theReplSet->getMutableMember(args.getSenderId());
        }
        if (!from) {
            from = theReplSet->findByName(args.getSenderHost().toString());
            if (!from) {
                return Status::OK();
            }
        }

        // if we thought that this node is down, let it know
        if (!from->hbinfo().up()) {
            response->noteStateDisagreement();
        }

        // note that we got a heartbeat from this node
        theReplSet->mgr->send(stdx::bind(&ReplSet::msgUpdateHBRecv,
                                         theReplSet, from->hbinfo().id(), time(0)));


        return Status::OK();
    }
Ejemplo n.º 25
0
int main() {

  try {
    seal::PluginManager::get()->initialise();
    
    using ROOT::Reflex::Type;
    using ROOT::Reflex::Member;

  //  const Class * simple = Class::forName("NavigationTests::Simple");
  Type simple = Type::byTypeInfo(typeid(NavigationTests::Simple));

  for (size_t i=0; i<simple.dataMemberCount(); i++) {
    Member m = simple.dataMember(i);
    std::cout << m.name() << " " << m.type().name() << std::endl;
  }
  std::stringstream file;

  {
    
    NavigationTests::Simple s; s.a=3.14; s.b=sqrt(3.); s.j=12;
    NavigationTests::Compound c; c.q = 99; c.name="Me"; c.i=-45; c.a=s; c.b=s; c.b.b=sqrt(5);
    c.v.push_back(s); c.v.push_back(s);
    c.m[1]="one"; c.m[10]="ten"; c.m[5]="five"; c.m[20]="2ten";
    //    std::sstream file("bha.txt");
    boost::archive::text_oarchive oa(file);
    {
      ROOT::Reflex::Object rc(simple, (void*)(&s));
      oa << rc;
    }
    {
      ROOT::Reflex::Object rc(Type::byTypeInfo(typeid(c)), (void*)(&c));
      oa << rc;
    }
    //file.close();
      
    std::cout << s.a << " " << s.b << " " << s.j << std::endl; 
    std::cout << c.q << " " << c.name << " "  << c.v.size() << " " 
	      << c.a.a << " " << c.a.b << " " << c.a.j << std::endl; 
    std::cout << c.m[1] << " " << c.m[5] << " " << c.m[10] << " " << c.m[20] << std::endl; 
  }
  std::cout << file.str() << std::endl;
  {
  
    NavigationTests::Simple s;
    NavigationTests::Compound c;    
    // std::ifstream file("bha.txt");
    boost::archive::text_iarchive oa(file);
    {
      ROOT::Reflex::Object rc(simple, (void*)(&s));
      oa >> rc;
    }
    {
      ROOT::Reflex::Object rc(Type::byTypeInfo(typeid(c)), (void*)(&c));
      oa >> rc;
    }
    //    file.close();
    std::cout << s.a << " " << s.b << " " << s.j << std::endl; 
    std::cout  << c.q << " "<< c.name << " " << c.v.size() << " " 
	       << c.a.a << " " << c.a.b << " " << c.a.j << std::endl; 
    std::cout << c.v[0].a << " " << c.v[0].b << " " << c.v[0].j << std::endl; 
    std::cout << c.m[1] << " " << c.m[5] << " " << c.m[10] << " " << c.m[20] << std::endl; 

  }
  } catch (std::exception & ex) {
    std::cout << "error!!!" << ex.what() << std::endl;
  }

  return 0;

};
Ejemplo n.º 26
0
static PyObject*
delegate_handler( Member* member, CAtom* atom, PyObject* oldvalue, PyObject* newvalue )
{
    Member* delegate = member_cast( member->post_validate_context );
    return delegate->post_validate( atom, oldvalue, newvalue );
}
Ejemplo n.º 27
0
    // @param reconf true if this is a reconfiguration and not an initial load of the configuration.
    // @return true if ok; throws if config really bad; false if config doesn't include self
    bool ReplSetImpl::initFromConfig(OperationContext* txn, ReplSetConfig& c, bool reconf) {
        // NOTE: haveNewConfig() writes the new config to disk before we get here.  So
        //       we cannot error out at this point, except fatally.  Check errors earlier.
        lock lk(this);

        if (!getLastErrorDefault.isEmpty() || !c.getLastErrorDefaults.isEmpty()) {
            getLastErrorDefault = c.getLastErrorDefaults;
        }

        list<ReplSetConfig::MemberCfg*> newOnes;
        // additive short-cuts the new config setup. If we are just adding a
        // node/nodes and nothing else is changing, this is additive. If it's
        // not a reconfig, we're not adding anything
        bool additive = reconf;
        bool updateConfigs = false;
        {
            unsigned nfound = 0;
            int me = 0;
            for (vector<ReplSetConfig::MemberCfg>::iterator i = c.members.begin();
                    i != c.members.end();
                    i++) {
                
                ReplSetConfig::MemberCfg& m = *i;
                if (isSelf(m.h)) {
                    me++;
                }
                
                if (reconf) {
                    const Member *old = findById(m._id);
                    if (old) {
                        nfound++;
                        verify((int) old->id() == m._id);
                        if (!old->config().isSameIgnoringTags(m)) {
                            additive = false;
                        }
                        if (!updateConfigs && old->config() != m) {
                            updateConfigs = true;
                        }
                    }
                    else {
                        newOnes.push_back(&m);
                    }
                }
            }
            if (me == 0) { // we're not in the config -- we must have been removed
                if (state().removed()) {
                    // already took note of our ejection from the set
                    // so just sit tight and poll again
                    return false;
                }

                _members.orphanAll();

                // kill off rsHealthPoll threads (because they Know Too Much about our past)
                endOldHealthTasks();

                // close sockets to force clients to re-evaluate this member
                MessagingPort::closeAllSockets(0);

                // take note of our ejection
                changeState(MemberState::RS_REMOVED);

                // go into holding pattern
                log() << "replSet info self not present in the repl set configuration:" << rsLog;
                log() << c.toString() << rsLog;

                loadConfig(txn);  // redo config from scratch
                return false; 
            }
            uassert(13302, "replSet error self appears twice in the repl set configuration", me<=1);

            // if we found different members that the original config, reload everything
            if (reconf && config().members.size() != nfound)
                additive = false;
        }

        // If we are changing chaining rules, we don't want this to be an additive reconfig so that
        // the primary can step down and the sync targets change.
        // TODO: This can be removed once SERVER-5208 is fixed.
        if (reconf && config().chainingAllowed() != c.chainingAllowed()) {
            additive = false;
        }

        _cfg = new ReplSetConfig(c);

        // config() is same thing but const, so we use that when we can for clarity below
        dassert(&config() == _cfg);
        verify(config().ok());
        verify(_name.empty() || _name == config()._id);
        _name = config()._id;
        verify(!_name.empty());

        {
            // Hack to force ReplicationCoordinatorImpl to have a config.
            // TODO(spencer): rm this once the ReplicationCoordinatorImpl can load its own config.
            HybridReplicationCoordinator* replCoord =
                    dynamic_cast<HybridReplicationCoordinator*>(getGlobalReplicationCoordinator());
            fassert(18648, replCoord);
            replCoord->setImplConfigHack(_cfg);
        }

        // this is a shortcut for simple changes
        if (additive) {
            log() << "replSet info : additive change to configuration" << rsLog;
            if (updateConfigs) {
                // we have new configs for existing members, so we need to repopulate _members
                // with the most recent configs
                _members.orphanAll();

                // for logging
                string members = "";

                // not setting _self to 0 as other threads use _self w/o locking
                int me = 0;
                for(vector<ReplSetConfig::MemberCfg>::const_iterator i = config().members.begin();
                    i != config().members.end(); i++) {
                    const ReplSetConfig::MemberCfg& m = *i;
                    Member *mi;
                    members += (members == "" ? "" : ", ") + m.h.toString();
                    if (isSelf(m.h)) {
                        verify(me++ == 0);
                        mi = new Member(m.h, m._id, &m, true);
                        setSelfTo(mi);
                    }
                    else {
                        mi = new Member(m.h, m._id, &m, false);
                        _members.push(mi);
                    }
                }
                // trigger a handshake to update the syncSource of our writeconcern information
                syncSourceFeedback.forwardSlaveHandshake();
            }

            // add any new members
            for (list<ReplSetConfig::MemberCfg*>::const_iterator i = newOnes.begin();
                    i != newOnes.end();
                    i++) {
                ReplSetConfig::MemberCfg *m = *i;
                Member *mi = new Member(m->h, m->_id, m, false);

                // we will indicate that new members are up() initially so that we don't relinquish
                // our primary state because we can't (transiently) see a majority. they should be
                // up as we check that new members are up before getting here on reconfig anyway.
                mi->get_hbinfo().health = 0.1;

                _members.push(mi);
                startHealthTaskFor(mi);
            }

            // if we aren't creating new members, we may have to update the
            // groups for the current ones
            _cfg->updateMembers(_members);

            return true;
        }

        // start with no members.  if this is a reconfig, drop the old ones.
        _members.orphanAll();

        endOldHealthTasks();
        
        int oldPrimaryId = -1;
        {
            const Member *p = box.getPrimary();
            if (p)
                oldPrimaryId = p->id();
        }
        forgetPrimary(txn);

        // not setting _self to 0 as other threads use _self w/o locking
        int me = 0;

        // For logging
        string members = "";

        for (vector<ReplSetConfig::MemberCfg>::const_iterator i = config().members.begin();
                i != config().members.end();
                i++) {
            const ReplSetConfig::MemberCfg& m = *i;
            Member *mi;
            members += (members == "" ? "" : ", ") + m.h.toString();
            if (isSelf(m.h)) {
                verify(me++ == 0);
                mi = new Member(m.h, m._id, &m, true);
                if (!reconf) {
                    log() << "replSet I am " << m.h.toString() << rsLog;
                }
                setSelfTo(mi);

                if ((int)mi->id() == oldPrimaryId)
                    box.setSelfPrimary(mi);
            }
            else {
                mi = new Member(m.h, m._id, &m, false);
                _members.push(mi);
                if ((int)mi->id() == oldPrimaryId)
                    box.setOtherPrimary(mi);
            }
        }

        if (me == 0){
            log() << "replSet warning did not detect own host in full reconfig, members "
                  << members << " config: " << c << rsLog;
        }
        else {
            // Do this after we've found ourselves, since _self needs
            // to be set before we can start the heartbeat tasks
            for (Member *mb = _members.head(); mb; mb=mb->next()) {
                startHealthTaskFor(mb);
            }
        }
        return true;
    }
Ejemplo n.º 28
0
bool Member::operator!=(Member const& member)
{
  CHECK(Position() != EmptyPosition(), Position());
  return Position() != member.Position();
}
Ejemplo n.º 29
0
    Status ReplSetImpl::forceSyncFrom(const string& host, BSONObjBuilder* result) {
        lock lk(this);

        // initial sanity check
        if (iAmArbiterOnly()) {
            return Status(ErrorCodes::NotSecondary, "arbiters don't sync");
        }
        if (box.getState().primary()) {
            return Status(ErrorCodes::NotSecondary, "primaries don't sync");
        }
        if (_self != NULL && host == _self->fullName()) {
            return Status(ErrorCodes::InvalidOptions, "I cannot sync from myself");
        }

        // find the member we want to sync from
        Member *newTarget = 0;
        for (Member *m = _members.head(); m; m = m->next()) {
            if (m->fullName() == host) {
                newTarget = m;
                break;
            }
        }

        // do some more sanity checks
        if (!newTarget) {
            // this will also catch if someone tries to sync a member from itself, as _self is not
            // included in the _members list.
            return Status(ErrorCodes::NodeNotFound, "could not find member in replica set");
        }
        if (newTarget->config().arbiterOnly) {
            return Status(ErrorCodes::InvalidOptions, "I cannot sync from an arbiter");
        }
        if (!newTarget->config().buildIndexes && myConfig().buildIndexes) {
            return Status(ErrorCodes::InvalidOptions,
                          "I cannot sync from a member who does not build indexes");
        }
        if (newTarget->hbinfo().authIssue) {
            return Status(ErrorCodes::Unauthorized,
                          "not authorized to communicate with " + newTarget->fullName());
        }
        if (newTarget->hbinfo().health == 0) {
            return Status(ErrorCodes::HostUnreachable, "I cannot reach the requested member");
        }
        if (newTarget->hbinfo().opTime.getSecs()+10 < lastOpTimeWritten.getSecs()) {
            log() << "attempting to sync from " << newTarget->fullName()
                  << ", but its latest opTime is " << newTarget->hbinfo().opTime.getSecs()
                  << " and ours is " << lastOpTimeWritten.getSecs() << " so this may not work"
                  << rsLog;
            result->append("warning", "requested member is more than 10 seconds behind us");
            // not returning false, just warning
        }

        // record the previous member we were syncing from
        const Member *prev = BackgroundSync::get()->getSyncTarget();
        if (prev) {
            result->append("prevSyncTarget", prev->fullName());
        }

        // finally, set the new target
        _forceSyncTarget = newTarget;
        return Status::OK();
    }
Ejemplo n.º 30
0
 Member& define_global_member(context* c,const char* name,Fn fn,type<Member> const&) {
     Member* m = new Member(name,fn);
     m->create(c);
     c->global()->insert(name,m);
     return *m;
 }