最先了解到SQLite是基於其作為移動客戶端數據存儲平台,以下是其官網(https://www.sqlite.org/)關於SQLite的一段介紹:
SQLite是遵守ACID的輕型數據庫引擎,它包含在一個相對小的C庫中。它是D.RichardHipp創建的公有領域項目。SQLite第一個Alpha版本誕生於2000年5月,至今已經有16個年頭,當前版本為3.12.2.。不像常見的客戶端/服務器結構范例,SQLite引擎不是個程序與之通信的獨立進程,而是連接到程序中成為它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個,數據庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的文件中。它的簡單的設計是通過在開始一個事務的時候鎖定整個數據文件而完成的。
sqlite3.c文件去掉注釋信息,整個文件大小只有25000行代碼,導入到工程以后,可以隨時查看以及調試相關的代碼,對於理解sqlite有着極大的幫助。
本系列文章主要是使用C++語言來調用其API,達到管中窺豹的目的。另外本文使用的開發環境為mac + clion,並且基於SQLite 3.7.14來進行開發.
一、去下載sqlite-amalgamation-3071400.zip,然后解壓到文件夾(其結構目錄樹如下):
.
├── shell.c
├── sqlite3.c
├── sqlite3.h
└── sqlite3ext.h
二、新建一個sql_tutorial的工程,景sqlite3.c和sqlite3.h文件拷貝到sql_src目錄下:
三、在main.cpp中調用sqlite的代碼如下:
#include <iostream> using namespace std; #include "./sql_src/sqlite3.h" int main() { cout << "sqlite libversion : " << sqlite3_libversion() << endl; return 0; }
四、因為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})
關於代碼調用流程分析:
1、跟蹤查看sqlite3_libversion()的實現,可以看到sqlite3.h中關於其聲明:
SQLITE_API const char *sqlite3_libversion(void);
2、具體實現在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; }
3、而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
4、而SQLITE_VERSION宏定義如下:
#define SQLITE_VERSION "3.7.14"
這里const char *sqlite3_libversion(void){ return sqlite3_version; } 返回的就是默認的是數組的第一個元素,數組的地址指向數組的第一個元素,即此處的返回的就是宏定義的SQLITE_VERSION。
至此整個程序的調用流程分析完成,調用sqlite3_libversion最終返回的是sqlite3.c中的SQLITE_VERSION來代表的數據版本號。