sqlite modern cpp原始碼閱讀3

2021-09-05 11:02:52 字數 2724 閱讀 9838

先看原始碼

class

database_binder

;typedef std::shared_ptr connection_type;

class

database):

_db(

nullptr);

database

(const std::u16string &db_name,

const sqlite_config &config =):

_db(

nullptr);

database

(std::shared_ptr db)

:_db

(db)

database_binder operator

<<

(const std::string& sql)

database_binder operator

<<

(const

char

* sql)

database_binder operator

<<

(const std::u16string& sql)

database_binder operator

<<

(const

char16_t

* sql)

connection_type connection()

const

sqlite3_int64 last_insert_rowid()

const

template

<

typename function>

void

define

(const std::string &name, function&& func)

;template

<

typename stepfunction,

typename finalfunction>

void

define

(const std::string &name, stepfunction&& step, finalfunction&& final);}

;

**中採用了智慧型指標std::shared_ptr ,省略了很多麻煩。兩個過載的define函式可以自定義sql函式。過載「 <<」操作符,把主要操作放在類database_binder中,類database只負責輸入sql語句到database_binder中 ,使得對sql語句的操作與實現分離,**框架更清晰明了。

建構函式有三個過載。涉及乙個結構體,用來對開啟方式進行一些配置:

struct sqlite_config 

;

第乙個

database

(const std::string &db_name,

const sqlite_config &config =):

_db(

nullptr

);

第二個

database

(const std::u16string &db_name,

const sqlite_config &config =):

_db(

nullptr

);

第二個是第乙個的 std::u16string 版本。

第三個簡單一點:

database

(std::shared_ptr db)

:_db

(db)

沒有用 sqlite_config ,直接用智慧型指標std::shared_ptr db 構造。

現在看第乙個:

database

(const std::string &db_name,

const sqlite_config &config =):

_db(

nullptr))

;// this will close the connection eventually when no longer needed.

if(ret != sqlite_ok)

errors::

throw_sqlite_error

(_db ?

sqlite3_extended_errcode

(_db.

get())

: ret)

;sqlite3_extended_result_codes

(_db.

get(),

true);

if(config.encoding == encoding::utf16)

*this

<<

r"(pragma encoding = "utf-16";)"

;}

資料庫的開啟和關閉都使用了v2版本。設計的巧妙之處在:

_db = std::shared_ptr

(tmp,[=

](sqlite3* ptr)

);

用乙個lambad表示式給 tmp 初始化。在判斷開啟是否失敗後,呼叫它,丟擲異常。

最後用乙個操作符 「<<」 給database_binder 語句pragma encoding = 「utf-16」 ,表明編碼型別。

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...