定义配置文件的类,与配置操作相关的类。
class TC_Config
{
public:
TC_Config(); //构造函数
TC_Config(const TC_Config &tc); //构造函数
TC_Config& operator=(const TC_Config &tc); //复制构造函数
void parseFile(const string& sFileName); //解析文件
void parseString(const string& buffer); //解析字符串
string operator[](const string &sName); //通过下标获取值
string get(const string &sName, const string &sDefault="") const; //获取值
bool getDomainMap(const string &path, map<string, string> &m) const; //获取域下面的参数值对
map<string, string> getDomainMap(const string &path) const; //获取域下面的参数值对,不存则返回空map.
vector<string> getDomainKey(const string &path) const; //获取域下面的所有key, 按照文件的行顺序返回.
bool getDomainVector(const string &path, vector<string> &v) const; //获取域下面的子域.
vector<string> getDomainVector(const string &path) const; //获取域下面的子域, 不存在则返回空vector
string tostr() const; //转换成配置文件的字符串格式.
protected:
void parse(istream &is); //输入流
TC_ConfigDomain *newTcConfigDomain(const string& sName); //生成子域
TC_ConfigDomain *searchTcConfigDomain(const vector<string>& domains); //搜索域
const TC_ConfigDomain *searchTcConfigDomain(const vector<string>& domains) const;
protected:
TC_ConfigDomain _root;
};
<Main>
<Domain>
Name = Value
</Domain>
<Domain1>
Name = Value
</Domain1>
</Main>
如图 < Main > 可以看成是一个域,而 < Domain > 与 < Domain1 > 可以理解为是 < Main > 的子域。
当我们要使用 TC_Config 类对象进行操作时,需要先执行 parseFile() 或 parseString() 函数。然后,如果我们要取得某个子域下的全部配置,就可以执行 getDomainMap() 函数,注意传入的路径 path 要写成 域/子域 的形式。比如你要取得子域 < Domain > 下的配置,那么就应该这样 getDomainMap(“Main/Domain”) 调用函数。
初始化 Mysql 配置,连接数据库等。
class TC_Mysql
{
public:
TC_Mysql(); //构造函数
TC_Mysql(const string& sHost, const string& sUser = "", const string& sPasswd = "", const string& sDatabase = "", const string &sCharSet = "", int port = 0, int iFlag = 0); //构造函数
TC_Mysql(const TC_DBConf& tcDBConf); //构造函数
~TC_Mysql(); //析构函数
void init(const string& sHost, const string& sUser = "", const string& sPasswd = "", const string& sDatabase = "", const string &sCharSet = "", int port = 0, int iFlag = 0); //初始化
void init(const TC_DBConf& tcDBConf); //初始化
void connect(); //连接数据库
void disconnect(); //断开数据库连接
MysqlData queryRecord(const string& sSql); //查询数据
size_t updateRecord(const string &sTableName, const map<string, pair<FT, string> > &mpColumns, const string &sCondition); //更新记录
size_t insertRecord(const string &sTableName, const map<string, pair<FT, string> > &mpColumns); //插入记录
size_t replaceRecord(const string &sTableName, const map<string, pair<FT, string> > &mpColumns); //替换记录
size_t deleteRecord(const string &sTableName, const string &sCondition = ""); //删除记录
private:
MYSQL *_pstMql; //数据库指针
TC_DBConf _dbConf; //数据库配置
bool _bConnected; //数据库是否连接标志
string _sLastSql; //追后执行的 sql 语句
};
首先需要实例化出一个类对象,再通过该对象调用 init() 函数初始化 Mysql 配置,然后再调用 connect() 函数连接上 Mysql 后即可进行查询,修改,新增,删除等操作。
数据库初始化可以通过一个个传入参数来完成,也能通过传入 TC_DBConf 结构来完成初始化。
struct TC_DBConf
{
string _host; //主机地址
string _user; //用户名
string _password; //密码
string _database; //数据库名
string _charset; //字符集
int _port; //端口号
int _flag; //客户端标识
void loadFromMap(const map<string, string> &mpParam)
{
map<string, string> mpTmp = mpParam;
_host = mpTmp["dbhost"];
_user = mpTmp["dbuser"];
_password = mpTmp["dbpass"];
_database = mpTmp["dbname"];
_charset = mpTmp["charset"];
_port = atoi(mpTmp["dbport"].c_str());
_flag = 0;
}
};
看一个例子:
TC_Mysql _propmysql; //数据库操作类对象
TC_Config conf; //配置操作类对象
TC_DBConf queryRspDbConf; //数据库配置结构体
conf.parseFile(ServerConfig::BasePath + ServerConfig::ServerName + ".conf"); //解析配置文件,并分为不同的域
map<string, string> rspdb = conf.getDomainMap("/config/querypropertydb"); //将配置文件数据转化为 map 数据存储
queryRspDbConf.loadFromMap(rspdb); //将数据转入 TC_DBConf 结构
_propmysql.init(queryRspDbConf); //使用配置文件初始化数据库
_propmysql.connect(); //连接数据库
主要用于接收,存储从 Mysql 读取出来的数据。
class MysqlData
{
public:
vector<map<string, string> >& data(); //返回从 Mysql 查询到的数据
size_t size(); //返回查询到的数据总条数
MysqlRecord operator[](size_t i); //重载 [] 运算符,通过下标获取数据
protected:
vector<map<string, string> > _data; //存储 Mysql 数据,其中存储在 Map 中的数据是以 <字段,值> 的形式存储
};
首先创建一个 TC_Mysql::MysqlData 类对象 Data,再调用 TC_Mysql 类对象的 queryRecord() 方法。传入要执行的 sql 语句,并把返回结果赋值给 Data 就行了。
Data = mysql.queryRecord(sql);
用于表示一个网络端口,执行网络端口的一些基本操作。
class TC_Endpoint
{
public:
void setHost(const string& host); //设置ip
string getHost() const; //获取ip
void setPort(int port); //设置ip
int getPort() const; //得到端口
void setTimeout(int timeout); //设置超时时间
int getTimeout() const; //获取超时时间
bool isTcp() const; //是否是TCP, 否则则为UDP
void setTcp(bool bTcp); //设置为TCP或UDP
int getGrid() const; //获取路由状态
void setGrid(int grid); //设置路由状态
bool isUnixLocal() const; //是否是本地套接字
void parse(const string &desc); //字符串形式的端口
protected:
std::string _host; //ip
int _port; //端口
int _timeout; //超时时间
int _istcp; //TCP UDP 标志
int _grid; //路由状态
};
通过 OBJ 名获取对应服务器 IP 。
string obj; //obj 是某个服务名方法
vector<string> IPs; //存储 ip
vector<TC_Endpoint> vtHost; //网络端口数组
int iRet = EndPointHelper::getEndPoint(obj, vtHost); //获取该 obj 对应的 TC_Endpoint,可能不止一个,所以用数组存储
for(auto& ep : vtHost) //通过 getHost 方法获取 ip
IPs.push_back(ep.getHost());