代码改变世界

[原]SQLite的学习系列之获取数据库版本

2016-05-01 13:37  雪夜&流星  阅读(3257)  评论(0编辑  收藏  举报

  最先了解到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来代表的数据版本号。