一个简单的支持MySQL和SQLite3的DB接口

C++源代码:

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 <string>
 
 			#include <vector>
 
 			SYS_NAMESPACE_BEGIN
 
 
 
 			typedef std::vector<std::string> DBRow; // 用来存储一行所有字段的值
 
 			typedef std::vector<DBRow> 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 		

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏铭毅天下

Elasticsearch 6.X 新类型Join深入详解

0、ES6.X 一对多、多对多的数据该如何存储和实现呢? 引出问题: “某头条新闻APP”新闻内容和新闻评论是1对多的关系? 在ES6.X该如何存储、如何进行高...

2.6K9
来自专栏hbbliyong

ShellExecute 启动外部程序 参数详细介绍

ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。 目录 1基本简介 2...

49510
来自专栏Golang语言社区

Golang拦截器的一种实现

前言 说起拦截器,大家一定会想起Java语言。 Java里的拦截器是动态拦截Action调用的对象,它提供了一种机制使开发者可以定义在一个action执行的前后...

54111
来自专栏python3

pymysql--插入300万数据

        (2)使用python协程(遇到I/O操作就切换任务,无需等待--提高效率)

1372
来自专栏木头编程 - moTzxx

PHP 学习筆記[1] —— ThinkPHP 公共函数整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1234
来自专栏猿天地

mongodb java操作语法

之前都是通过spring-data框架来对mongodb操作,当然在很多老的项目中,由于jar包版本的问题,不太好升级到最新的版本,往往会采用mongodb-d...

28110
来自专栏数据和云

oracle 12.2 local temp的原理和实现

从Oracle数据库12c开始,可以将Oracle Clusterware和Oracle RAC配置在大型集群中,称为Oracle Flex集群。 这些集群包含...

2989
来自专栏V站

SQL注入基础-基于Sqli-lab平台实战

有关SQL注入的各种定义阐述已经很多,大家可自行使用搜索引擎搜索即可,小东不再赘述。

2415
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作

4405
来自专栏MasiMaro 的技术博文

OLEDB 参数化查询

一般情况下,SQL查询是相对固定的,一条语句变化的可能只是条件值,比如之前要求查询二年级学生信息,而后面需要查询三年级的信息,这样的查询一般查询的列不变,后面的...

1163

扫码关注云+社区