【仿RabbitMQ消息队列项目day3】sqlite3数据库快速上手

一.什么是sqlite?

SQLite是⼀个进程内的轻量级数据库, SQLite 引擎不是⼀个独立的进程,可以按应用程序需求进行静态或动态连接,SQLite 直接访问其存储文件

 二.sqlite3接口介绍

1.创建数据库并返回操作句柄

int sqlite3_open(const char *filename, sqlite3 **ppDb)

返回值:成功返回SQLITE_OK

若在编译阶段启动了线程安全,则在程序运行阶段可以通过参数选择线程安全等级:

int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );

flags常用的宏:

SQLITE_OPEN_READWRITE -- 以可读可写方式打开数据库文件

SQLITE_OPEN_CREATE -- 不存在数据库文件则创建

SQLITE_OPEN_NOMUTEX--多线程模式,只要不同的线程使⽤不同的连接即可保证线程 安全

说明:sqlite3是有三种安全等级的

 1. 非线程安全模式

2. 线程安全模式(不同的连接在不同的线程/进程间是安全的,但一个句柄不能用于多线程 间)

3. 串行化模式(可以在不同的线程/进程间使用同一个句柄)

2.执行语句

int sqlite3_exec(sqlite3*, char *sql, int (*callback) (void*,int,char**,char**), void* arg, char **err)

返回值:SQLITE_OK表示成功

callback参数说明:

void* : 是设置的在回调时传⼊的arg参数

int:一行中数据的列数

char**:存储一行数据的字符指针数组

char**:每一列的字段名称

callback返回值说明:

这个回调函数有个int返回值,成功处理的情况下必须返回0,返回非0会触发ABORT退出程序

3.销毁句柄

int sqlite3_close(sqlite3* db);

返回值:SQLITE_OK 表示成功

int sqlite3_close_v2(sqlite3*);

推荐使⽤——无论如何都会返回SQLITE_OK

获取错误信息:const char *sqlite3_errmsg(sqlite3* db); 

三.sqlite3封装

#include <sqlite3.h>
#include <string>
#include <iostream>
using std::cout;
using std::endl;
class SqliteHelper
{
public:
    typedef int(*SqliteCallback)(void*, int, char**, char**);
private:
    std::string _dbfile;
    sqlite3* _handler;
public:
    SqliteHelper(const std::string& dbfile)
        :_dbfile(dbfile)
        ,_handler(nullptr)
    {}
    bool open(int safeLevel = SQLITE_OPEN_FULLMUTEX)
    {
        //int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs)
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safeLevel, nullptr);
        if (ret != SQLITE_OK)
        {
            cout << "打开数据库失败:";
            cout << sqlite3_errmsg(_handler) << endl;
            return false;
        }
        return true;
        
    }
    bool execute(const std::string& sql, SqliteCallback cb, void* arg)
    {
        //int sqlite3_exec(sqlite3 *, const char *sql, int (*callback)(void *, int, char **, char **), 
        //void *, char **errmsg)
        int ret = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);
        if (ret != SQLITE_OK)
        {
            cout << "执行语句失败: " << endl;
            cout << sqlite3_errmsg(_handler) << endl;
            return false;
        }
        return true;
    }
    

    void close()
    {
        if (_handler)
        {
            sqlite3_close_v2(_handler);
        }
    }
};

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值