[Sqlite-數據庫連接句柄]

typedef struct sqlite3 sqlite3;

每一個SQLite數據庫都是通過一個指向不透明的名爲“sqlite3”的結構體指針來代表的,我們可以將sqlite3看作是一個指針,函數 sqlite3_open(), sqlite3_open16()和sqlite3_open_v2()作爲構造函數的接口,函數sqlite3_close(), sqlite3_close_v2()作爲析構函數的接口,同時也有很多的其他的接口,但是主要的就是這幾個函數。

構造函數1:sqlite3_open()

打開一個數據庫連接

int sqlite2_open(
	const char *filename,	//UTF-8類型的數據庫名稱
	sqlite3 **ppDb	//數據庫操作的句柄
);

int sqlite3_open16(
	const void *filename,	//UTF-8類型的數據庫名稱
	sqlite3 **ppDb	//數據可以的操操作句柄
);

int sqlite3_open_v2(
	const char *filename,	//UTF-8類型的數據庫名稱
	sqlite3 **ppDb,		//數據庫的操作句柄
	int flags, 		//標誌位
	const char *zVfs	//所使用的的VFS模型的名字
);

使用這種方式打開一個數據庫是將一個文件名作爲數據庫名稱,這個文件名如果是UTF-8編碼的話,就是用sqlite3_open()和sqlite_open_v2()函數,如果是UTF-16的話,就是用sqlite3_open16()函數,數據的連接通常是使用 ppDb的方式返回,即使出現了一個錯誤,唯一的期望是如果SQlite未能給sqlite3對象分配一個空間,空指針將會代替ppDb作爲返回值,如果數據庫正常的打開,將會返回SQLITE_OK,否則就返回一個故障碼
error_code
,函數sqlite3_errmsg()sqlite3_errmsg()可以將返回的故障代碼轉化成英語
默認的數據庫的編碼格式是UTF-8d的,而且是由函數sqlite3_open()和函數sqlite3_open_v2()創建的,sqlite3_open16()是使用UTF-16編碼的
如果數據庫是否被成功的打開,數據庫的連接必須使用函數sqlite3_close()來關閉連接
函數sqlite3_open_v2()的接口可slqite3_open()的接口是很相似的,只不過斷了2個附加的參數,函數sqlite3_open_v2()的標誌位將使用下面的幾個值,可以在SQLITE_OPEN_NOMUTEX(不帶互斥),
SQLITE_OPEN_FULLMUTEX
(使用全部互斥),SQLITE_OPEN_SHARECACHE(共享緩存),SQLITE_OPEN_PRIVATECACHE(私有緩存),或者使用SQLITE_OPEN_URI標誌位

  • SQLITE_OPEN_READONLY
    數據庫將只用只讀的方式打開,如果數據庫不存在,將返回一個故障碼

  • SQLITE_OPEN_READWRITE

    數據庫將使用讀寫的方式打開,如果文件被操作系統所保護的話,就只讀,換句話說,數據庫一定要存在,否則就會返回一個故障

  • SQLITE_OPEN_READWRITE
    |
    SQLITE_OPEN_CREATE

    數據庫將使用讀寫的方式打開,如果數據庫不存在,將會創建一個數據庫,這個方式通常使用在sqlite3_open()函數和sqlite3_open16()函數中

如果函數sqlite3_open_v2()的第三個參數不是上面定義的幾個選項的參數,則後果是不會預估的
如果 SQLITE_OPEN_NOMUTEX 標誌位設置以後,然後,只要在編譯時或啓動時沒有設置單線程模式,數據庫連接就會以多線程模式打開。如果選擇了 SQLITE_OPEN_FULLMUTEX 標誌位,除非在編譯或者運行階段設置了單線程模式,則數據庫將會以序列的方式來創建,SQLITE_OPEN_SHARECACHE 將會使數據庫使用共享緩存模式,不管數據庫是否使用了共享緩衝模式,標誌位 SQLITE_OPEN_PRIVATECACHE 將會是數據庫的連接不在共享緩存模式
函數sqlite3_open_v2()的第四個參數是
sqlite3_vfs
,它定義了新數據庫連接的時候所使用的操作系統的接口,如果是NULL,則將會使用默認的sqlite3_vfs對象
如果文件名是":memory:",然後一個私有的,內部儲存的數據庫將會爲了這個連接而創建,如果數據庫連接成功,這個臨時的內部存儲數據庫將會兇案是,後面開發的SQLIte版本將會使用附件的特殊文件名,它以":“開頭,建議如果數據庫不是以“:”開頭的話,應該在文件名的開頭加一個比如”./"的前綴
如果文件名是一個孔子字符串,臨時的在磁盤的數據庫將會穿件,這個私有的數據庫將會在數據庫斷開連接後自動的刪除

URI Filenames

如果URI文件名的解析功能使能以後,並且文件名的解析從"file:"開始,這個文件名將會作爲一個URI來解析,如果SQLITE_OPEN_URI標誌位在函數sqlite3_open_v2()中給定,或者在函數sqlite3_config()中使用SQLITE_CONFIG_URI標誌位使能了全局URI文件名解析,則URI文件名解析將會使能,URI文件名解析默認情況下是關閉的,但是後面開發的新版的數據庫可能會默認情況下使能URI文件名解析。
URI文件名是根據RFC 3986解析的,如果URI中包含一個文件的所有權者,它就不能是空的字符串或是字符串“localhost”,如果所屬人不是空或者不是字符串“localhost”,將會報故障,判斷構成了URI,如果出現了,就會忽視
SQLite使用路徑來構成URI的名稱,這個路徑在硬盤中將會包含數據庫,如果路徑是由’/‘開始的,他將會季錫成一個絕對路徑,如果不是以’/'開頭,將會解析成一個相對路徑,在Window中,第一個名字是絕對的cup按路徑
疑問組成的URI解析將會包含SQLite自己,或者通過一個定製的VFS解析,SQLite和內部的的VFSes解析警徽遵循以下參數

  • vfs: vfs參數制定了操作系統的接口的路徑,可以用來訪問磁盤中的數據庫,如果這個選項是一個空的字符串,可能導致意向不到的效果,如果函數sqlite3_open_v2()使用了vfs選項,然後VFS選項將會優先作爲你函數sqlite3_open_v2()的第4個參數
  • mode: 模式參數將會從4個選項中選擇"ro", “rw”, “rwc”, 或者"memory",如果選擇其他的參數們將會報錯,如果沒有指定,數據庫將默認使用制度的方式打開,和SQLITE_OPEN_READONLY參數設定後的表現是昂通的,如果模式選擇爲"rw",則數據庫將會使可讀寫的方式打開,但是這種方式不能夠創建,如果設置爲"rwc",將會以讀寫創建的方式來進行數據庫的連接
  • cache:緩存參數可以設置爲“共享”或者“私有”模式,設置爲共享模式的情況下相當於設置標誌位爲“SQLITE_OPEN_SHAREDCACHE”,設置爲私有相當於
  • psow: 這個參數決定了是否是powersafe的,這個參數是指硬盤沒有電的時候是否是安全的能夠將數據保存下來
  • Nolock
  • immutable
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章