cyphesis/server/Persistence.h
Erik Ogenvik 311fc9cd2f Fixed issues with tying accounts to entities.
Since entries in the database tying entities to accounts only can be
created if the entity already is created in the database we need to make
sure the relation in "accounts_entities" isn't created until the entry in
"entities". This is done by letting the StorageManager handle it.
The way to interface between the Persistance and the StorageManager
classes isn't obvious, so we'll have to do it by signals.
2014-09-20 22:13:49 +02:00

99 lines
3.4 KiB
C++

// Cyphesis Online RPG Server and AI Engine
// Copyright (C) 2000,2001 Alistair Riddoch
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#ifndef SERVER_PERSISTENCE_H
#define SERVER_PERSISTENCE_H
#include <Atlas/Objects/ObjectsFwd.h>
#include <sigc++/signal.h>
#include <string>
#include <map>
class Account;
class Database;
class LocatedEntity;
typedef std::map<long, LocatedEntity *> EntityDict;
/// \brief Class for managing the required database tables for persisting
/// in-game entities and server accounts
class Persistence {
private:
Persistence();
std::string m_characterRelation;
static Persistence * m_instance;
public:
/// \brief Data about a character being tied to an account.
///
/// This is used when signaling that an entity has been tied to an account.
/// Since this operation is dependent on the entity having been persisted to the database
/// we can't do it here; instead we rely on the StorageManager to do it.
/// However, the interface between these two components isn't the smoothest, so we'll
/// have to do it through signals.
struct AddCharacterData {
/// \brief The id of the character entity.
std::string entity_id;
/// \brief The id of the account.
std::string account_id;
};
Database & m_db;
static Persistence * instance();
int init();
void shutdown();
bool findAccount(const std::string &);
Account * getAccount(const std::string &);
void putAccount(const Account &);
void registerCharacters(Account &, const EntityDict & worldObjects);
void addCharacter(const Account &, const LocatedEntity &);
void delCharacter(const std::string &);
int getRules(std::map<std::string, Atlas::Objects::Root> & m);
int storeRule(const Atlas::Objects::Root & rule,
const std::string & key,
const std::string & section);
int updateRule(const Atlas::Objects::Root & rule,
const std::string & key);
int clearRules();
/// \brief Gets the name of the DB relation tying Accounts to Entities.
const std::string& getCharacterAccountRelationName() const;
/// \brief Emitted when a character has been tied to an account.
///
/// It's expected that the StorageManager should handle this.
/// Any listener should return "true" if the action was properly handled.
sigc::signal<bool, const AddCharacterData&> characterAdded;
/// \brief Emitted when a character has been deleted, and the
/// tie to any account should be removed.
///
/// It's expected that the StorageManager should handle this.
/// Any listener should return "true" if the action was properly handled.
sigc::signal<bool, const std::string&> characterDeleted;
};
#endif // SERVER_PERSISTENCE_H