• 一个C++版本的Sqlite3封装--SmartDb


    Sqlite是一个非常轻量级的开源数据库,在嵌入式系统中使用的比较多,存储管理数据非常方便,Sqlite库提供的基于C语言的API,用起来也挺简单,但是有一点不太好的就是API使用起来有些繁琐,另外就是不同的场合,代码复用率很低,又要重新写代码,增加了工作量,代码要尽量复用,才有价值。SmartDB对sqlite做了一层封装(基于C++11的模板元编程),屏蔽了诸多细节,使得我们使用起来很方便。在注重易用性的基础上还兼顾了性能和灵活性。

    SmartDb是《深入应用C++11  代码优化与工程级应用》的作者编写的,SmartDb使用了很多C++11新特性:可变长参数、模板元编程、完美转发、泛型编程等,代码质量非常高,很值得学习,使用C++做开发的同学不妨看看,网上有电子版的。

    使用这个SmartDb去操作数据库就简单多了:

    来看下示例代码:

    void TestPerformance()
    {
        SmartDB db;
        db.Open("test.db");   //打开数据库
        const string sqlcreat = "CREATE TABLE if not exists TestInfoTable(ID INTEGER NOT NULL, KPIID INTEGER, CODE INTEGER, V1 INTEGER, V2 INTEGER, V3 REAL, V4 TEXT);";
        if (!db.Excecute(sqlcreat))  //执行sql语句
            return;
    
        boost::timer t;
        const string sqlinsert = "INSERT INTO TestInfoTable(ID, KPIID, CODE, V1, V2, V3, V4) VALUES(?, ?, ?, ?, ?, ?, ?);";
        bool ret = db.Prepare(sqlinsert);
        db.Begin();
        for (size_t i = 0; i < 10; i++) //00000
        {
            ret = db.ExcecuteArgs(i, i, i, i, i, i + 1.25, "it is a test");
            if (!ret)
                break;
        }
    
        if (ret)
            db.Commit(); //提交事务
        else
            db.RollBack(); //回滚
    
        cout << t.elapsed() << endl;
        t.restart();
        //100w 3.5-4秒左右
    
        auto p = db.Query("select * from TestInfoTable");
        cout << t.elapsed() << endl;
        cout << "size: " << p->Size() << endl;
        //100W 4秒左右
    
          rapidjson::StringBuffer buffer;
          rapidjson::PrettyWriter<rapidjson::StringBuffer> pretty_writer(buffer);  //PrettyWriter是格式化的json,如果是Writer则是换行空格压缩后的json
          p->Accept(pretty_writer);
          //打印到屏幕
          //cout<<"the json output:"<<endl;
         cout<<buffer.GetString()<<endl;
    
        //遍历查询结果
        rapidjson::Value& infoArray  = *p;
        for ( int i = 0; i < p->Size(); ++i )
        {
            const rapidjson::Value& object = infoArray[i];
            printf("%d. Id: %d  KpiId: %d, v3: %f, v4: %s
    ",i,
                object["ID"].GetInt(), object["KPIID"].GetInt(),object["V3"].GetDouble(),object["V4"].GetString());
        }
    
    }

    查询的数据库时,结果是以Json格式返回的,这里返回的是一个json数组,这个用起来很方便。

    作者的源代码是VS下编译测试的,我在VS2015下可以编译运行,在Linux下编译有点问题,可能是编译器的差异造成的,目前只编译通过部分,

    ExcecuteTuple接口还用不了,

    Variant的Visit接口编译不通过,注释掉可以通过,这这里好像也没有用到;

    大家如果在Linux下编译通过,正常运行告诉我下哈。

    在linux下编译通过的版本(码云地址):https://gitee.com/fensw/SmartDB

    作者原文:
    https://www.cnblogs.com/qicosmos/p/3805156.html

    欢迎关注我微信订阅号:

  • 相关阅读:
    LINQ用于数据库访问的基本方法示例
    设计模式代码示例
    [文档].Altera PLL(锁相环)宏用户指导
    [文档]. Xilinx 编写有效的Testbenches
    [笔记].怎样正确插拔FPGA开发板的JTAG仿真器,如USBBlaster等?
    [连载计划][大家一起学FPGA/SOPC]
    [文档].Altera – SOPC Builder组件开发攻略
    [原创].图解一招搞定UCWEB@Nokia S60v5无法在博客园手机版发闪存的问题
    [文档].Altera – SOPC Builder存储子系统开发攻略
    [笔记].开发SOPC Buider中的自定义IP所必备资料
  • 原文地址:https://www.cnblogs.com/fensnote/p/13436492.html
Copyright © 2020-2023  润新知