SQLite3++

使用 C++ 封装的 SQLite3 API
授权协议 MIT
开发语言 C/C++
所属分类 数据库相关、 数据库服务器
软件类型 开源软件
地区 不详
投 递 者 柳正志
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

sqlite3pp

该库对SQLite3 API使用C++类进行包装,支持几乎所有SQLite3功能(打开数据库、查询、执行命令、事物等)。

示例代码如下:

database 数据库

sqlite3pp::database db("test.db");
db.execute("INSERT INTO contacts (name, phone) VALUES ('Mike', '555-1234')");

command 命令

sqlite3pp::command cmd(
  db, "INSERT INTO contacts (name, phone) VALUES (?, ?)");
cmd.binder() << "Mike" << "555-1234";
cmd.execute();
sqlite3pp::command cmd(db, "INSERT INTO contacts (name, phone) VALUES (?, ?)");
cmd.bind(1, "Mike", sqlite3pp::nocopy);
cmd.bind(2, "555-1234", sqlite3pp::nocopy);
cmd.execute();
sqlite3pp::command cmd(
  db, "INSERT INTO contacts (name, phone) VALUES (?100, ?101)");
cmd.bind(100, "Mike", sqlite3pp::nocopy);
cmd.bind(101, "555-1234", sqlite3pp::nocopy);
cmd.execute();
sqlite3pp::command cmd(
  db, "INSERT INTO contacts (name, phone) VALUES (:user, :phone)");
cmd.bind(":user", "Mike", sqlite3pp::nocopy);
cmd.bind(":phone", "555-1234", sqlite3pp::nocopy);
cmd.execute();
sqlite3pp::command cmd(
  db,  "INSERT INTO contacts (name, phone) VALUES (:user, '555-0000');"
  "INSERT INTO contacts (name, phone) VALUES (:user, '555-1111');"
  "INSERT INTO contacts (name, phone) VALUES (:user, '555-2222')");
cmd.bind(":user", "Mike", sqlite3pp::nocopy);
cmd.execute_all();

transaction 事务

sqlite3pp::transaction xct(db);
{
  sqlite3pp::command cmd(
    db, "INSERT INTO contacts (name, phone) VALUES (:user, :phone)");
  cmd.bind(":user", "Mike", sqlite3pp::nocopy);
  cmd.bind(":phone", "555-1234", sqlite3pp::nocopy);
  cmd.execute();
}
xct.rollback();

query 查询

sqlite3pp::query qry(db, "SELECT id, name, phone FROM contacts");for (int i = 0; i < qry.column_count(); ++i) {
  cout << qry.column_name(i) << "\t";
}
for (sqlite3pp::query::iterator i = qry.begin(); i != qry.end(); ++i) {  for (int j = 0; j < qry.column_count(); ++j) {
    cout << (*i).get<char const*>(j) << "\t";
  }
  cout << endl;
}
for (sqlite3pp::query::iterator i = qry.begin(); i != qry.end(); ++i) {  int id;  char const* name, *phone;  std::tie(id, name, phone) =
    (*i).get_columns<int, char const*, char const*>(0, 1, 2);
  cout << id << "\t" << name << "\t" << phone << endl;
}
for (sqlite3pp::query::iterator i = qry.begin(); i != qry.end(); ++i) {
  string name, phone;
  (*i).getter() >> sqlite3pp::ignore >> name >> phone;
  cout << "\t" << name << "\t" << phone << endl;
}
for (auto v : qry) {
  string name, phone;
  v.getter() >> sqlite3pp::ignore >> name >> phone;
  cout << "\t" << name << "\t" << phone << endl;
}

attach

sqlite3pp::database db("foods.db");
db.attach("test.db", "test");

sqlite3pp::query qry(
  db,  "SELECT epi.* FROM episodes epi, test.contacts con WHERE epi.id = con.id");

backup 备份

sqlite3pp::database db("test.db");
sqlite3pp::database backupdb("backup.db");

db.backup(backupdb);
db.backup(
  backupdb,
  [](int pagecount, int remaining, int rc) {
    cout << pagecount << "/" << remaining << endl;if (rc == SQLITE_OK || rc == SQLITE_BUSY || rc == SQLITE_LOCKED) {      // sleep or do nothing.}
  });

callback 回调

struct rollback_handler{  void operator()() {
    cout << "handle_rollback" << endl;
  }
};

sqlite3pp::database db("test.db");

db.set_commit_handler([]{ cout << "handle_commit\n"; return 0; });
db.set_rollback_handler(rollback_handler());
int handle_authorize(int evcode, char const* p1, char const* p2,                     char const* dbname, char const* tvname) {
  cout << "handle_authorize(" << evcode << ")" << endl;  return 0;
}

db.set_authorize_handler(&handle_authorize);
struct handler{  handler() : cnt_(0) {}  void handle_update(int opcode, char const* dbname,                     char const* tablename, int64_t rowid) {
    cout << "handle_update(" << opcode << ", " << dbname << ", " << tablename << ", " << rowid << ") - " << cnt_++ << endl;
  }  int cnt_;
};using namespace std::placeholders;db.set_update_handler(std::bind(&handler::handle_update, &h, _1, _2, _3, _4));

function

int test0()
{  return 100;
}

sqlite3pp::database db("test.db");
sqlite3pp::ext::function func(db);

func.create<int ()>("test0", &test0);
void test1(sqlite3pp::ext::context& ctx)
{
  ctx.result(200);
}void test2(sqlite3pp::ext::context& ctx)
{
  string args = ctx.get<string>(0);
  ctx.result(args);
}void test3(sqlite3pp::ext::context& ctx)
{
  ctx.result_copy(0);
}

func.create("test1", &test1);
func.create("test2", &test2, 1);
func.create("test3", &test3, 1);
func.create<int ()>("test4", []{ return 500; });
string test5(string const& value)
{  return value;
}

string test6(string const& s1, string const& s2, string const& s3)
{  return s1 + s2 + s3;
}

func.create<int (int)>("test5", [](int i){ return i + 10000; });
func.create<string (string, string, string)>("test6", &test6);
sqlite3pp::query qry(
  db,  "SELECT test0(), test1(), test2('x'), test3('y'), test4(), test5(10), "
  "test6('a', 'b', 'c')");

aggregate

void step(sqlite3pp::ext::context& c)
{  int* sum = (int*) c.aggregate_data(sizeof(int));

  *sum += c.get<int>(0);
}void finalize(sqlite3pp::ext::context& c)
{  int* sum = (int*) c.aggregate_data(sizeof(int));
  c.result(*sum);
}

sqlite3pp::database db("foods.db");
sqlite3pp::ext::aggregate aggr(db);

aggr.create("aggr0", &step, &finalize);
struct mycnt{  void step() {
    ++n_;
  }  int finish() {return n_;
  }  int n_;
};

aggr.create<mycnt>("aggr1");
struct strcnt{  void step(string const& s) {
    s_ += s;
  }  int finish() {return s_.size();
  }
  string s_;
};struct plussum{  void step(int n1, int n2) {
    n_ += n1 + n2;
  }  int finish() {return n_;
  }  int n_;
};

aggr.create<strcnt, string>("aggr2");
aggr.create<plussum, int, int>("aggr3");
sqlite3pp::query qry(
  db,  "SELECT aggr0(id), aggr1(type_id), aggr2(name), aggr3(id, type_id) "
  "FROM foods");

loadable extension 加载扩展

#define SQLITE3PP_LOADABLE_EXTENSION#include <sqlite3ppext.h>int sqlite3_extension_init(
  sqlite3 *pdb,  char **pzErrMsg,  const sqlite3_api_routines *pApi) {  SQLITE_EXTENSION_INIT2(pApi);
  sqlite3pp:database db(sqlite3pp::ext::borrow(pdb));  // pdb is not closed since db just borrows it.}
  • 嵌入式开发数据库:SQLite, FireBird, eXtremetDB,3万行的基于c和c++的源码,SQLite 数据库,是一个非常轻量级自包含(lightweight and self-contained)的DBMS,它可移植性好,很容易使用,很小,高效而且可靠。 SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程

  • int sqlite3_exec( sqlite3* ppDb, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char*

  • 表的创建、修改、删除 create table 表名(字段名 字段类型 [约束],...); alter table 表名 {rename to 新名字 | add column 字段 字段类型}; drop table 表名 ; DML 记录的增、删、改、查 insert into 表名(字段名,...)values(字段值,...); insert into 表名 values(字段值,...

  • 1、打开/创建一个数据库  int sqlite3_open(const char *filename,  sqlite3 **ppDb ); 功能:打开数据库链接 参数:filename:数据库的路径和文件名 ppdb:数据库句柄。 返回:成功  SQLITE_OK (值为0),否则返回其他值。 2、回调函数执行sql语句 int sqlite3_exec(sqlite3* pDB, cons

  • sqlite3应用相关函数 1、打开数据库:sqlite3_open 原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 函数功能:打开或创建数据库 参数说明: filenam

  • 核心 Sqlite3接口的核心元素:两个对象 和 八个函数 一、两个对象 1.数据库连接对象 sqlite3 :the database connection object 数据库连接对象, 数据库的连接句柄/数据库的文件描述符,sqlite3 代表所打开的那个 sqlite3 的数据库文件,后序对该数据库的操作都需要用到这个对象。 2.SQL语句对象 sqlite3_stmt :the prep

  • 最近因为工作原因,需要使用sqlite数据库。sqlite数据库小并且使用方便,感觉挺不错的。但有一个不足就是没有对数据库进行加密,不过好的是sqlite预留有加密的接口,我们可以直接调用即可。我也是参考网上的资料对数据库进行加密: sqlite数据库默认没有加密功能,对一些需要对工程文件进行保密的场合产生了不便,本文以QT4.4.3为例, 对qt源代码中的sql模块进行修改,为qt集成的sqli

 相关资料
  • 主要内容:1、public,2、private,3、protected,4、internal,5、protected internalC# 是一门面向对象编程语言,面向对象编程语言有三大特性,分别是封装、 继承和 多态。所谓封装就是将一个或多个项目(函数)集合在一个单元中,这个单元称之为类,我们可以根据需要通过访问权限修饰符来设定类中成员的范围和可见性。C# 中的访问权限修饰符有以下几种: public:公共的,所有对象都可以访问,但是需要引用命名空间; private:私有的,类的内部才可以访

  • 问题内容: 我想编译以使用osx。使用以下命令:GOOS = linux GOARCH = arm CGO_ENABLED = 1 go build -o foo main.go 但我得到:运行时/ cgo叮当声:错误:编译期间未使用参数:’-mno-thumb’ 我使用了这个包:https : //github.com/mattn/go- sqlite3 我尝试了提示:https : //git

  • 封装被定为义为“把一个或多个项目封闭在一个物理的或者逻辑的包中”。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装使程序员实现所需级别的抽象。 封装使用访问修饰符来实现。一个访问修饰符定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示: Public Private Protected Internal

  • 所有的 C++ 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数。 程序数据:数据是程序的信息,会受到程序函数的影响。 封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装引申出了另一个重要的 OOP 概念,即数据隐藏。 数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅

  • 主要内容:1. 数据封装示例,2. 设计策略所有Objective-C程序都由以下两个基本要素组成 - 程序语句(代码) - 这是执行操作的程序的一部分,它们被称为方法(函数)。 程序数据 - 数据是受程序功能影响的程序信息。 封装是一种面向对象的编程概念,它将操作数据的数据和功能绑定在一起,并保护其免受外部干扰和误用。 数据封装导致了重要的OOP数据隐藏概念。 数据封装是捆绑数据和使用函数的机制,数据抽象是一种仅暴露接口并从用户隐藏实现细

  • 本文向大家介绍C#使用iTextSharp封装的PDF文件操作类实例,包括了C#使用iTextSharp封装的PDF文件操作类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用iTextSharp封装的PDF文件操作类。分享给大家供大家参考。具体分析如下: 这个C#代码主要讲iTextSharp中用于操作PDF文件的方法进行了再次封装,可以更加方便的访问PDF文档,可以动态生成P

  • 9.4.1.2.使用 sqlite3 Android 附带了一个命令行工具sqlite3,供我们访问数据库。 要验证数据库原型是否正确,你需要: 打开终端或者命令提示符。 输入adb shell,连接到仿真器或者真机。 切换到数据库所在的目录:cd/data/data/com.marakana.yamba/databases/。 通过sqlite3timeline.db打开数据库。 打开数据库之后

  • 本文向大家介绍AJAX封装类使用指南,包括了AJAX封装类使用指南的使用技巧和注意事项,需要的朋友参考一下 AJAX说起来感觉很难,但是把他封装起来你会发现使用起来很简单了,当然也是简单的应用了,譬如留言板的应用等,这里首先,先送大家一个礼物那就是封装好的AJAX的类,下载地址http://xiazai.jb51.net/201412/yuanma/ajax3.0(jb51.net).rar 这里