IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> C++: 使用 sqlite3(callback回调方式) -> 正文阅读

[大数据]C++: 使用 sqlite3(callback回调方式)

一、使用 yum 安装 sqlite-devel

yum install -y sqlite-devel

二、使用 sqlite的c++代码

头文件?SqliteKV.h

#ifndef SQLITEORM_H_

#include <string>
#include <sqlite3.h>

class SqliteKV {
public:
    struct Res
    {
        int cnt;
        std::string s;
    };

    SqliteKV();
    ~SqliteKV();

    bool Set(const std::string& key, const std::string& value);
    std::string Get(const std::string& key);
    bool Delete(const std::string& key);
    static int Callback(void *args, int argc, char **argv, char **azColName);

private:
    sqlite3 *db_;
};

#endif

cpp 文件?SqliteKV.cpp

#include <iostream>
#include <cstring>
#include <string>
#include <SqliteKV.h>

SqliteKV::SqliteKV() {
    auto ret = sqlite3_open("sqlitekv.db", &db_);
    if(ret != SQLITE_OK)
    {
        db_ = nullptr;
        return;
    }

    std::string sql = "create table if not exists kv (ID INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL UNIQUE ON CONFLICT REPLACE, VALUE TEXT);";

    char *zErrMsg = NULL;
    ret = sqlite3_exec(db_, sql.data(), NULL, 0, &zErrMsg);
    if(ret != SQLITE_OK)
    {
        std::cout << "create kv table faild" << std::endl;
    }
    else
    {
        std::cout << "create kv table success" << std::endl;
    }
    sqlite3_free(zErrMsg);
}

SqliteKV::~SqliteKV() {
    if(nullptr != db_) {
        sqlite3_close(db_);
        db_ = nullptr;
    }
}

bool SqliteKV::Set(const std::string& key, const std::string& value) {
    char sql[1024] = {0};
    snprintf(sql, sizeof(sql), "insert into kv (key, VALUE) VALUES ('%s', '%s') ;", key.data(), value.data());

    char *zErrMsg = NULL;
    int r = sqlite3_exec(db_, sql, NULL, 0, &zErrMsg); //不需要 callback
    if (r != SQLITE_OK)
    {   
        std::cout << "sqlite3_exec error when set table :" <<  zErrMsg << std::endl;
        sqlite3_free(zErrMsg);
        return false; 
    }   
    sqlite3_free(zErrMsg);

    return true;

}

std::string SqliteKV::Get(const std::string& key) {
    char sql[1024] = {0};
    snprintf(sql, sizeof(sql), "select VALUE from kv where key = '%s'; ", key.data());

    struct Res res = {0, ""};
    char *zErrMsg = NULL;
    int r = sqlite3_exec(db_, sql, SqliteKV::Callback, &res, &zErrMsg);
    if(r != SQLITE_OK)
    {
        std::cout << "sqlite3_exec error : " << zErrMsg << std::endl;
    }
    sqlite3_free(zErrMsg);

    if(res.cnt <= 0)
    {
        return "";
    }
    else
    {
        return res.s;
    }
}

bool SqliteKV::Delete(const std::string& key) {
    char sql[1024] = {0};
    snprintf(sql, sizeof(sql), "delete from kv where key = '%s';", key.data());

    char *zErrMsg = NULL;
    int r = sqlite3_exec(db_, sql, NULL, 0, &zErrMsg);
    if (r != SQLITE_OK)
    {   
        std::cout << "sqlite3_exec error when Delete from table" <<  zErrMsg << std::endl;
        sqlite3_free(zErrMsg);
        return false; 
    }   
    sqlite3_free(zErrMsg);

    return true;
}

int SqliteKV::Callback(void *args, int argc, char **argv, char **azColName) {
    struct Res* res = (struct Res*)args;
    res -> cnt ++;
    res -> s = argv[0];

    return 0;
}

main 文件 main.cpp

#include <iostream>
#include <SqliteKV.h>

int main() {
    auto obj = SqliteKV();
    obj.Set("hello", "world");

    std::cout << "key: hello" << obj.Get("hello") << std::endl;
    std::cout << "key: not-exists" << obj.Get("not-exists") << std::endl;

    return 0;
}

三、编译及运行

编译:

g++ -o main -I./ -lsqlite3 main.cpp SqliteKV.cpp

运行:

$ ./main 
create kv table success
key: helloworld
key: not-exists

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 11:59:11  更:2022-01-28 12:01:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:51:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码