最早了解到SQLite是基於其做爲移動客戶端數據存儲平臺,如下是其官網(https://www.sqlite.org/)關於SQLite的一段介紹:ios
SQLite是遵照ACID的輕型數據庫引擎,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。SQLite第一個Alpha版本誕生於2000年5月,至今已經有16個年頭,當前版本爲3.12.2.。不像常見的客戶端/服務器結構範例,SQLite引擎不是個程序與之通訊的獨立進程,而是鏈接到程序中成爲它的一個主要部分。因此主要的通訊協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和總體簡單性上有積極的做用。整個,數據庫(定義、表、索引和數據自己)都在宿主主機上存儲在一個單一的文件中。它的簡單的設計是經過在開始一個事務的時候鎖定整個數據文件而完成的。c++
sqlite3.c文件去掉註釋信息,整個文件大小隻有25000行代碼,導入到工程之後,能夠隨時查看以及調試相關的代碼,對於理解sqlite有着極大的幫助。sql
本系列文章主要是使用C++語言來調用其API,達到管中窺豹的目的。另外本文使用的開發環境爲mac + clion,而且基於SQLite 3.7.14來進行開發.shell
1、去下載sqlite-amalgamation-3071400.zip,而後解壓到文件夾(其結構目錄樹以下):數據庫
.編程
├── shell.c數組
├── sqlite3.c服務器
├── sqlite3.h編程語言
└── sqlite3ext.hui
2、新建一個sql_tutorial的工程,景sqlite3.c和sqlite3.h文件拷貝到sql_src目錄下:
3、在main.cpp中調用sqlite的代碼以下:
#include <iostream> using namespace std; #include "./sql_src/sqlite3.h" int main() { cout << "sqlite libversion : " << sqlite3_libversion() << endl; return 0; }
4、由於clion使用的時cmake編譯,須要在CMakeLists.txt中添加相關sqlite的代碼編譯選項:
cmake_minimum_required(VERSION 3.3) project(sql_tutorial1) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(SOURCE_FILES main.cpp sql_src/sqlite3.c) add_executable(sql_tutorial1 ${SOURCE_FILES})
關於代碼調用流程分析:
一、跟蹤查看sqlite3_libversion()的實現,能夠看到sqlite3.h中關於其聲明:
SQLITE_API const char *sqlite3_libversion(void);
二、具體實如今sqlite3.c中:
/* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns ** a pointer to the to the sqlite3_version[] string constant. */ SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; }
三、而sqlite3_version的定義:
#ifndef SQLITE_AMALGAMATION /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant ** contains the text of SQLITE_VERSION macro. */ SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; #endif
四、而SQLITE_VERSION宏定義以下:
#define SQLITE_VERSION "3.7.14"
這裏const char *sqlite3_libversion(void){ return sqlite3_version; } 返回的就是默認的是數組的第一個元素,數組的地址指向數組的第一個元素,即此處的返回的就是宏定義的SQLITE_VERSION。
至此整個程序的調用流程分析完成,調用sqlite3_libversion最終返回的是sqlite3.c中的SQLITE_VERSION來表明的數據版本號。