{"id":13419210,"url":"https://github.com/iwongu/sqlite3pp","last_synced_at":"2025-10-20T12:58:34.503Z","repository":{"id":19992182,"uuid":"23259456","full_name":"iwongu/sqlite3pp","owner":"iwongu","description":"SQLite3++ - C++ wrapper of SQLite3 API","archived":false,"fork":false,"pushed_at":"2023-11-12T01:35:19.000Z","size":103,"stargazers_count":628,"open_issues_count":4,"forks_count":181,"subscribers_count":38,"default_branch":"master","last_synced_at":"2025-10-20T12:58:19.284Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iwongu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2014-08-23T15:40:36.000Z","updated_at":"2025-10-14T20:02:13.000Z","dependencies_parsed_at":"2023-11-12T02:28:09.795Z","dependency_job_id":"1276f2b2-eec3-46fc-b9e0-b7e095f4afa3","html_url":"https://github.com/iwongu/sqlite3pp","commit_stats":{"total_commits":80,"total_committers":6,"mean_commits":"13.333333333333334","dds":"0.15000000000000002","last_synced_commit":"30d38560c77a689609f012cd7996047c2b6e798f"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/iwongu/sqlite3pp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwongu%2Fsqlite3pp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwongu%2Fsqlite3pp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwongu%2Fsqlite3pp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwongu%2Fsqlite3pp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iwongu","download_url":"https://codeload.github.com/iwongu/sqlite3pp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwongu%2Fsqlite3pp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280094904,"owners_count":26271003,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-20T02:00:06.978Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T22:01:12.799Z","updated_at":"2025-10-20T12:58:34.471Z","avatar_url":"https://github.com/iwongu.png","language":"C++","readme":"\u003e #### ANNOUNCEMENTS\n\u003e ##### Use files in `headeronly_src` directory. The files in `src` are exactly same but in the form of h/cpp files, which you need to compile and link with.\n\u003e ##### `boost_src` is no longer maintained. Do not use unless you need to use pre-c++1x. It requires `boost` library.\n\nsqlite3pp\n=========\n\nThis library makes SQLite3 API more friendly to C++ users. It supports almost all of SQLite3 features using C++ classes such as database, command, query, and transaction. The query class supports iterator concept for fetching records.\n\nWith ext::function class, it's also easy to use the sqlite3's functions and aggregations in C++.\n\n# Usage\n\n## database\n```cpp\nsqlite3pp::database db(\"test.db\");\ndb.execute(\"INSERT INTO contacts (name, phone) VALUES ('Mike', '555-1234')\");\n```\n\n## command\n```cpp\nsqlite3pp::command cmd(\n  db, \"INSERT INTO contacts (name, phone) VALUES (?, ?)\");\ncmd.binder() \u003c\u003c \"Mike\" \u003c\u003c \"555-1234\";\ncmd.execute();\n```\n\n```cpp\nsqlite3pp::command cmd(db, \"INSERT INTO contacts (name, phone) VALUES (?, ?)\");\ncmd.bind(1, \"Mike\", sqlite3pp::nocopy);\ncmd.bind(2, \"555-1234\", sqlite3pp::nocopy);\ncmd.execute();\n```\n\n```cpp\nsqlite3pp::command cmd(\n  db, \"INSERT INTO contacts (name, phone) VALUES (?100, ?101)\");\ncmd.bind(100, \"Mike\", sqlite3pp::nocopy);\ncmd.bind(101, \"555-1234\", sqlite3pp::nocopy);\ncmd.execute();\n```\n\n```cpp\nsqlite3pp::command cmd(\n  db, \"INSERT INTO contacts (name, phone) VALUES (:user, :phone)\");\ncmd.bind(\":user\", \"Mike\", sqlite3pp::nocopy);\ncmd.bind(\":phone\", \"555-1234\", sqlite3pp::nocopy);\ncmd.execute();\n```\n\n```cpp\nsqlite3pp::command cmd(\n  db,\n  \"INSERT INTO contacts (name, phone) VALUES (:user, '555-0000');\"\n  \"INSERT INTO contacts (name, phone) VALUES (:user, '555-1111');\"\n  \"INSERT INTO contacts (name, phone) VALUES (:user, '555-2222')\");\ncmd.bind(\":user\", \"Mike\", sqlite3pp::nocopy);\ncmd.execute_all();\n```\n\n## transaction\n\n```cpp\nsqlite3pp::transaction xct(db);\n{\n  sqlite3pp::command cmd(\n    db, \"INSERT INTO contacts (name, phone) VALUES (:user, :phone)\");\n  cmd.bind(\":user\", \"Mike\", sqlite3pp::nocopy);\n  cmd.bind(\":phone\", \"555-1234\", sqlite3pp::nocopy);\n  cmd.execute();\n}\nxct.rollback();\n```\n\n## query\n\n```cpp\nsqlite3pp::query qry(db, \"SELECT id, name, phone FROM contacts\");\n\nfor (int i = 0; i \u003c qry.column_count(); ++i) {\n  cout \u003c\u003c qry.column_name(i) \u003c\u003c \"\\t\";\n}\n```\n\n```cpp\nfor (sqlite3pp::query::iterator i = qry.begin(); i != qry.end(); ++i) {\n  for (int j = 0; j \u003c qry.column_count(); ++j) {\n    cout \u003c\u003c (*i).get\u003cchar const*\u003e(j) \u003c\u003c \"\\t\";\n  }\n  cout \u003c\u003c endl;\n}\n```\n\n```cpp\nfor (sqlite3pp::query::iterator i = qry.begin(); i != qry.end(); ++i) {\n  int id;\n  char const* name, *phone;\n  std::tie(id, name, phone) =\n    (*i).get_columns\u003cint, char const*, char const*\u003e(0, 1, 2);\n  cout \u003c\u003c id \u003c\u003c \"\\t\" \u003c\u003c name \u003c\u003c \"\\t\" \u003c\u003c phone \u003c\u003c endl;\n}\n```\n\n```cpp\nfor (sqlite3pp::query::iterator i = qry.begin(); i != qry.end(); ++i) {\n  string name, phone;\n  (*i).getter() \u003e\u003e sqlite3pp::ignore \u003e\u003e name \u003e\u003e phone;\n  cout \u003c\u003c \"\\t\" \u003c\u003c name \u003c\u003c \"\\t\" \u003c\u003c phone \u003c\u003c endl;\n}\n```\n\n```cpp\nfor (auto v : qry) {\n  string name, phone;\n  v.getter() \u003e\u003e sqlite3pp::ignore \u003e\u003e name \u003e\u003e phone;\n  cout \u003c\u003c \"\\t\" \u003c\u003c name \u003c\u003c \"\\t\" \u003c\u003c phone \u003c\u003c endl;\n}\n```\n\n## attach\n\n```cpp\nsqlite3pp::database db(\"foods.db\");\ndb.attach(\"test.db\", \"test\");\n\nsqlite3pp::query qry(\n  db,\n  \"SELECT epi.* FROM episodes epi, test.contacts con WHERE epi.id = con.id\");\n```\n\n## backup\n\n```cpp\nsqlite3pp::database db(\"test.db\");\nsqlite3pp::database backupdb(\"backup.db\");\n\ndb.backup(backupdb);\n```\n\n```cpp\ndb.backup(\n  backupdb,\n  [](int pagecount, int remaining, int rc) {\n    cout \u003c\u003c pagecount \u003c\u003c \"/\" \u003c\u003c remaining \u003c\u003c endl;\n    if (rc == SQLITE_OK || rc == SQLITE_BUSY || rc == SQLITE_LOCKED) {\n      // sleep or do nothing.\n    }\n  });\n```\n\n## callback\n\n```cpp\nstruct rollback_handler\n{\n  void operator()() {\n    cout \u003c\u003c \"handle_rollback\" \u003c\u003c endl;\n  }\n};\n\nsqlite3pp::database db(\"test.db\");\n\ndb.set_commit_handler([]{ cout \u003c\u003c \"handle_commit\\n\"; return 0; });\ndb.set_rollback_handler(rollback_handler());\n```\n\n```cpp\nint handle_authorize(int evcode, char const* p1, char const* p2,\n                     char const* dbname, char const* tvname) {\n  cout \u003c\u003c \"handle_authorize(\" \u003c\u003c evcode \u003c\u003c \")\" \u003c\u003c endl;\n  return 0;\n}\n\ndb.set_authorize_handler(\u0026handle_authorize);\n```\n\n```cpp\nstruct handler\n{\n  handler() : cnt_(0) {}\n\n  void handle_update(int opcode, char const* dbname,\n                     char const* tablename, int64_t rowid) {\n    cout \u003c\u003c \"handle_update(\" \u003c\u003c opcode \u003c\u003c \", \" \u003c\u003c dbname \u003c\u003c \", \"\n         \u003c\u003c tablename \u003c\u003c \", \" \u003c\u003c rowid \u003c\u003c \") - \" \u003c\u003c cnt_++ \u003c\u003c endl;\n  }\n  int cnt_;\n};\n\nusing namespace std::placeholders;\n\ndb.set_update_handler(std::bind(\u0026handler::handle_update, \u0026h, _1, _2, _3, _4));\n```\n\n## function\n\n```cpp\nint test0()\n{\n  return 100;\n}\n\nsqlite3pp::database db(\"test.db\");\nsqlite3pp::ext::function func(db);\n\nfunc.create\u003cint ()\u003e(\"test0\", \u0026test0);\n```\n\n```cpp\nvoid test1(sqlite3pp::ext::context\u0026 ctx)\n{\n  ctx.result(200);\n}\n\nvoid test2(sqlite3pp::ext::context\u0026 ctx)\n{\n  string args = ctx.get\u003cstring\u003e(0);\n  ctx.result(args);\n}\n\nvoid test3(sqlite3pp::ext::context\u0026 ctx)\n{\n  ctx.result_copy(0);\n}\n\nfunc.create(\"test1\", \u0026test1);\nfunc.create(\"test2\", \u0026test2, 1);\nfunc.create(\"test3\", \u0026test3, 1);\n```\n\n```cpp\nfunc.create\u003cint ()\u003e(\"test4\", []{ return 500; });\n```\n\n```cpp\nstring test5(string const\u0026 value)\n{\n  return value;\n}\n\nstring test6(string const\u0026 s1, string const\u0026 s2, string const\u0026 s3)\n{\n  return s1 + s2 + s3;\n}\n\nfunc.create\u003cint (int)\u003e(\"test5\", [](int i){ return i + 10000; });\nfunc.create\u003cstring (string, string, string)\u003e(\"test6\", \u0026test6);\n```\n\n```cpp\nsqlite3pp::query qry(\n  db,\n  \"SELECT test0(), test1(), test2('x'), test3('y'), test4(), test5(10), \"\n  \"test6('a', 'b', 'c')\");\n```\n\n## aggregate\n\n```cpp\nvoid step(sqlite3pp::ext::context\u0026 c)\n{\n  int* sum = (int*) c.aggregate_data(sizeof(int));\n\n  *sum += c.get\u003cint\u003e(0);\n}\nvoid finalize(sqlite3pp::ext::context\u0026 c)\n{\n  int* sum = (int*) c.aggregate_data(sizeof(int));\n  c.result(*sum);\n}\n\nsqlite3pp::database db(\"foods.db\");\nsqlite3pp::ext::aggregate aggr(db);\n\naggr.create(\"aggr0\", \u0026step, \u0026finalize);\n```\n\n```cpp\nstruct mycnt\n{\n  void step() {\n    ++n_;\n  }\n  int finish() {\n    return n_;\n  }\n  int n_;\n};\n\naggr.create\u003cmycnt\u003e(\"aggr1\");\n```\n\n```cpp\nstruct strcnt\n{\n  void step(string const\u0026 s) {\n    s_ += s;\n  }\n  int finish() {\n    return s_.size();\n  }\n  string s_;\n};\n\nstruct plussum\n{\n  void step(int n1, int n2) {\n    n_ += n1 + n2;\n  }\n  int finish() {\n    return n_;\n  }\n  int n_;\n};\n\naggr.create\u003cstrcnt, string\u003e(\"aggr2\");\naggr.create\u003cplussum, int, int\u003e(\"aggr3\");\n```\n\n```cpp\nsqlite3pp::query qry(\n  db,\n  \"SELECT aggr0(id), aggr1(type_id), aggr2(name), aggr3(id, type_id) \"\n  \"FROM foods\");\n```\n\n## loadable extension\n\n```cpp\n#define SQLITE3PP_LOADABLE_EXTENSION\n#include \u003csqlite3ppext.h\u003e\n\nint sqlite3_extension_init(\n  sqlite3 *pdb,\n  char **pzErrMsg,\n  const sqlite3_api_routines *pApi) {\n  SQLITE_EXTENSION_INIT2(pApi);\n  sqlite3pp:database db(sqlite3pp::ext::borrow(pdb));\n  // pdb is not closed since db just borrows it.\n}\n\n```\n\n\n# See also\n* http://www.sqlite.org/\n* https://code.google.com/p/sqlite3pp/ \n* https://github.com/iwongu/sqlite3pp/wiki/Using-variadic-templates-with-different-parameter-types\n* https://github.com/iwongu/sqlite3pp/wiki/Using-variadic-templates-with-function-calls-using-tuple\n* [c-of-day-43-sqlite3-c-wrapper-1](http://idea-thinking.blogspot.com/2007/09/c-of-day-43-sqlite3-c-wrapper-1.html) (Korean)\n* [c-of-day-44-sqlite3-c-wrapper-2](http://idea-thinking.blogspot.com/2007/09/c-of-day-44-sqlite3-c-wrapper-2.html) (Korean)\n* [c-of-day-45-sqlite3-c-wrapper-3](http://idea-thinking.blogspot.com/2007/09/c-of-day-45-sqlite3-c-wrapper-3.html) (Korean)\n","funding_links":[],"categories":["TODO scan for Android support in followings","C++","Libraries"],"sub_categories":["Database"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiwongu%2Fsqlite3pp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiwongu%2Fsqlite3pp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiwongu%2Fsqlite3pp/lists"}