设为首页 收藏本站
查看: 1479|回复: 0

[经验分享] 一个简单的支持MySQL和SQLite3的DB接口

[复制链接]

尚未签到

发表于 2015-12-21 13:34:13 | 显示全部楼层 |阅读模式
C++源代码: DSC0000.png simple_db.zip
相关联代码:https://github.com/eyjian/mooon/tree/master/common_library/include



  • #ifndef MOOON_SYS_SIMPLE_DB_H

  • #define MOOON_SYS_SIMPLE_DB_H
  • #include "sys/db_exception.h"
  • #include
  • #include
  • SYS_NAMESPACE_BEGIN

  • typedef std::vector DBRow; // 用来存储一行所有字段的值
  • typedef std::vector DBTable; // 用来存储所有行

  • /**
  • * 访问DB的接口,是一个抽象接口,当前只支持MySQL
  • *
  • * 使用示例:
  • DBConnection* db_connection = DBConnection::create_connection("mysql");
  • try
  • {
  •     DBTable db_table;

  •     // 不指定DB名,以及不需要密码
  •     db->set_host("127.0.0.1", 3600);
  •     db->set_user("root", "");
  •     db->set_charset("utf8");
  •     db->enable_auto_reconnect();
  •     db->set_timeout_seconds(600);

  •     db_connection->open();
  •     db_connection->query(db_table, "select count(1) from test_table where id=%d", 2015);
  • }
  • catch (CDBException& db_error)
  • {
  •     log("%s error: %s at %s:%d", db_connection.str().c_str(), db_error.what(), db_error.file(), db_error.lien());
  • }

  • DBConnection::destroy_connection(db_connection);
  • */
  • class DBConnection
  • {
  • public:
  •     /***
  •      * 工厂方法 - 创建一个DB连接
  •      * @db_type_name DB类型名,如:mysql、oracle、postgreSQL,不区别大小写
  •      * 当前只支持MySQL和SQLite3,也就是参数值只能输入mysql(不区别大小写)
  •      * @sql_max 支持的最大SQL语句长度,单位为字节数,不含结尾符
  •      * 如果是支持的DB类型,则返回非NULL,否则返回NULL
  •      */
  •     static DBConnection* create_connection(const std::string& db_type_name, size_t sql_max);

  •     /***
  •      * 销毁一个由create_connection()创建的DB连接
  •      * @db_connection 需要销毁的DB连接
  •      */
  •     static void destroy_connection(DBConnection* db_connection);

  •     /***
  •      * 判断是否为网络连接断开异常,
  •      * 如使用过程中,与MySQL间的网络中断,或MySQL进程死掉等,这种情况下可以尝试重连接
  •      */
  •     static bool is_disconnected_exception(CDBException& db_error);

  • public:
  •     virtual ~DBConnection() {}

  •     /***
  •      * 设置需要连接的DB的IP和服务端口号
  •      * 注意,只有在open()或reopen()之前调用才生效
  •      */
  •     virtual void set_host(const std::string& db_ip, uint16_t db_port) = 0;

  •     /***
  •      * 设置连接的数据库名
  •      * 注意,只有在open()或reopen()之前调用才生效
  •      */
  •     virtual void set_db_name(const std::string& db_name) = 0;

  •     /***
  •      * 设置用来连接DB的用户名和密码
  •      * 注意,只有在open()或reopen()之前调用才生效
  •      */
  •     virtual void set_user(const std::string& db_user, const std::string& db_password) = 0;

  •     /***
  •      * 设置访问DB的字符集
  •      * 注意,只有在open()或reopen()之前调用才生效
  •      */
  •     virtual void set_charset(const std::string& charset) = 0;

  •     /***
  •      * 设置为连接断开后自动重连接,如果不主动设置,默认不自动重连接
  •      * 注意,只有在open()或reopen()之前调用才生效
  •      */
  •     virtual void enable_auto_reconnect() = 0;

  •     /***
  •      * 设置用来连接的超时秒数,如果不主动设置,则使用默认的10秒
  •      * 注意,只有在open()或reopen()之前调用才生效
  •      */
  •     virtual void set_timeout_seconds(int timeout_seconds) = 0;

  •     /***
  •      * 设置空值,字段在DB表中的值为NULL时,返回的内容
  •      * 如果不主动设置,则默认空值时被设置为"$NULL$"
  •      */
  •     virtual void set_null_value(const std::string& null_value) = 0;

  •     /***
  •      * 建立一个DB连接
  •      * 出错抛出异常CDBException
  •      */
  •     virtual void open() throw (CDBException) = 0;

  •     /**
  •      * 关闭一个DB连接
  •      * 使用open()建立的连接,在使用完后,要使用close()关闭它
  •      */
  •     virtual void close() throw () = 0;

  •     /***
  •      * 重新建立DB连接
  •      * reopen()会先调用close()关闭连接,然后才重新建立连接,
  •      * 因此调用reopen()之前,可不调用close(),当然即使调用了close()也不会有问题
  •      */
  •     virtual void reopen() throw (CDBException) = 0;

  •     /***
  •       * 数据库查询类操作,包括:select, show, describe, explain和check table等,
  •       * 如果某字段在DB表中为NULL,则返回结果为"$NULL$",如果内容刚好为"$NULL$",则无法区分
  •       * 出错抛出CDBException异常
  •       */
  •     virtual void query(DBTable& db_table, const char* format, ...) throw (CDBException) __attribute__((format(printf, 3, 4))) = 0;

  •     /**
  •      * 查询,期望只返回一行记录,
  •      * 如果某字段在DB表中为NULL,则返回结果为空字符串,因此不能区分字段无值还是值为空字符串
  •      * 如果查询失败,抛出CDBException异常,异常的错误码为-1,
  •      * 如果查询实际返回超过一行记录,抛出CDBException异常,异常的错误码为DB_ERROR_TOO_MANY_ROWS
  •      */
  •     virtual void query(DBRow& db_row, const char* format, ...) throw (CDBException) __attribute__((format(printf, 3, 4))) = 0;

  •     /**
  •      * 查询,期望只返回单行单列,
  •      * 如果某字段在DB表中为NULL,则返回结果为空字符串,因此不能区分字段无值还是值为空字符串
  •      * 如果查询失败,抛出CDBException异常,异常的错误码为-1,
  •      * 如果查询实际返回超过一行记录,抛出CDBException异常,异常的错误码为DB_ERROR_TOO_MANY_ROWS,
  •      * 如果查询实际返回只有一行,但超过一列,则抛出CDBException异常,异常的错误码为DB_ERROR_TOO_MANY_COLS
  •      */
  •     virtual std::string query(const char* format, ...) throw (CDBException) __attribute__((format(printf, 2, 3))) = 0;

  •     /***
  •       * 数据库insert和update更新操作
  •       * 成功返回受影响的记录个数,出错则抛出CDBException异常
  •       */
  •     virtual int update(const char* format, ...) throw (CDBException) __attribute__((format(printf, 2, 3))) = 0;

  •     /**
  •      * 取得可读的字符串信息
  •      */
  •     virtual std::string str() throw () = 0;
  • };

  • SYS_NAMESPACE_END
  • #endif // MOOON_SYS_SIMPLE_DB_H

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-154324-1-1.html 上篇帖子: ubuntu-sqlite install 下篇帖子: SQLite
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表