freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

[計(jì)算機(jī)軟件及應(yīng)用]sqlite(文件)

2025-09-05 16:27 上一頁面

下一頁面
 

【正文】 *,int,const void*,int,const void*))。通過使用SQLITE3進(jìn)行創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,插入記錄,查詢記錄,更新記錄,關(guān)閉數(shù)據(jù)庫等操作來實(shí)現(xiàn)將相應(yīng)的數(shù)據(jù)存入數(shù)據(jù)庫中。eg: 域名為:子網(wǎng)頁: sqlite3_exec(db,sql,NULL,NULL,NULL)。第2個(gè)參數(shù)const char *sql 是一條 sql 語句,以\0結(jié)尾。等下我們再看回調(diào)函數(shù)的寫法,以及這個(gè)參數(shù)的使用。執(zhí)行 sqlite3_exec 之后,執(zhí)行失敗時(shí)可以查閱這個(gè)指針(直接 printf(“%s\n”,errmsg))得到一串字符串信息,這串信息告訴你錯(cuò)在什么地方。比如你做 insert 操作,做 delete 操作,就沒有必要使用回調(diào)。Insert into :插入命令Weblink (domain,page,fromdomain,status) ::要操作的表名與要插入的數(shù)據(jù)對應(yīng)的字段名稱values(%Q,%Q,%Q,%d) :要插入的數(shù)據(jù)對應(yīng)的格式domain,page,fromdomain,status :通過函數(shù)傳遞進(jìn)來的型參名 (要插入的數(shù)據(jù))3. 查詢記錄sql = sqlite3_mprintf(select * from weblink where page = %Q and domain=%Q,page,domain)。7 . SQLITE3 的常用操作命令a). sqlite3 打開數(shù)據(jù)庫b). .tables 查看表名c). .schema 查看表的結(jié)構(gòu)d). select * from (表名) 。這些天再次研究它,又有一些收獲,這里把我對 sqlite3 的研究列出來,以備忘記。但是,我沒有嘗試過在別的系統(tǒng)、別的編譯器下編譯,因此下面的敘述如果不正確,則留待以后修改。不會(huì)給任何人帶來不便。以前很多文件,現(xiàn)在全部合并成一個(gè) 文件。但是,下面我要寫通過修改 sqlite 代碼完成加密功能,那時(shí)候就比較痛苦了。在里面寫:extern C{include ./}。C++跟C雖然語法上有重疊,但是它們是兩個(gè)不同的東西,內(nèi)存里的布局是完全不同的,在C++編譯器里不用extern“C”括起C代碼,會(huì)導(dǎo)致編譯器不知道該如何為C代碼描述內(nèi)存布局。但是有一堆的 warning。sqlite 跟MS的access一樣是文件型數(shù)據(jù)庫,就是說,一個(gè)數(shù)據(jù)庫就是一個(gè)文件,此數(shù)據(jù)庫里可以建立很多的表,可以建立索引、觸發(fā)器等等,但是,它實(shí)際上得到的就是一個(gè)文件。(1)基本流程sqlite 里最常用到的是 sqlite3 * 類型。int sqlite3_open( 文件名, sqlite3 ** )。如果它存在,就嘗試把它當(dāng)數(shù)據(jù)庫文件來打開。相關(guān)的返回值sqlite定義了一些宏。下面介紹關(guān)閉數(shù)據(jù)庫后,再給一段參考代碼。int main( int , char** ){ //聲明sqlite關(guān)鍵結(jié)構(gòu)指針//打開數(shù)據(jù)庫//需要傳入 db 這個(gè)指針的指針,因?yàn)?sqlite3_open 函數(shù)要為這個(gè)指針分配內(nèi)存,還要讓db指針指向這個(gè)內(nèi)存區(qū)db )。 if( result != SQLITE_OK ){ //數(shù)據(jù)庫打開失敗return 1。(2) SQL語句操作本節(jié)介紹如何用sqlite 執(zhí)行標(biāo)準(zhǔn) sql 語法。第1個(gè)參數(shù)不再說了,是前面open函數(shù)得到的指針。(什么是回調(diào)函數(shù),自己找別的資料學(xué)習(xí))第4個(gè)參數(shù)void * 是你所提供的指針,你可以傳遞任何一個(gè)指針參數(shù)到這里,這個(gè)參數(shù)最終會(huì)傳到回調(diào)函數(shù)里面,如果不需要傳遞指針給回調(diào)函數(shù),可以填NULL。sqlite3里面有很多固定的錯(cuò)誤信息。填NULL表示你不需要回調(diào)。你的回調(diào)函數(shù)必須定義成上面這個(gè)函數(shù)的類型。然后操作這些數(shù)據(jù) printf( “記錄包含 %d 個(gè)字段\n”, n_column )。 223。}int main( int , char ** ){ sqlite3 * db。 char * errmsg = NULL。}//數(shù)據(jù)庫操作代碼//創(chuàng)建一個(gè)測試表,表名叫 MyTable_1,有2個(gè)字段: ID 和 name。if(result != SQLITE_OK ){ printf( “插入記錄失敗,錯(cuò)誤碼:%d,錯(cuò)誤原因:%s\n”, result, errmsg )。if(result != SQLITE_OK ){ printf( “插入記錄失敗,錯(cuò)誤碼:%d,錯(cuò)誤原因:%s\n”, result, errmsg )。}通過上面的例子,應(yīng)該可以知道如何打開一個(gè)數(shù)據(jù)庫,如何做數(shù)據(jù)庫基本操作。但是,我個(gè)人感覺還是回調(diào)好,因?yàn)榇a可以更加整齊,只不過用回調(diào)很麻煩,你得聲明一個(gè)函數(shù),如果這個(gè)函數(shù)是類成員函數(shù),你還不得不把它聲明成 static 的(要問為什么?這又是C++基礎(chǔ)了。雖然回調(diào)顯得代碼整齊,但有時(shí)候你還是想要非回調(diào)的 select 查詢。第2個(gè)參數(shù)是 sql 語句,跟 sqlite3_exec 里的 sql 是一樣的。下面用例子來說事。下面給個(gè)簡單例子:int main( int , char ** ){ 取地址符,傳遞進(jìn)去的就成了 char ***result = sqlite3_get_table( db, “select * from MyTable_1”, amp。errmsg )。 index = nColumn。 i nRow 。 j++ ){ dbResult[j], dbResult [index] )。 }}//到這里,不論數(shù)據(jù)庫查詢是否成功,都釋放 char** 查詢結(jié)果,使用 sqlite 提供的功能來釋放sqlite3_free_table( dbResult )。用以上的方法,再配上 sql 語句,完全可以應(yīng)付絕大多數(shù)數(shù)據(jù)庫需求。這個(gè)數(shù)據(jù)類型記錄了一個(gè)“sql語句”。當(dāng)然,把二進(jìn)制數(shù)據(jù)插到 sqlite3_stmt 結(jié)構(gòu)里可不能直接 memcpy ,也不能像 std::string 那樣用 + 號。我假設(shè)有這么一張表:create table Tbl_2( ID integer, file_content上面的函數(shù)完成 sql 語句的解析。第三個(gè)參數(shù)我寫的是1,這個(gè)參數(shù)含義是前面 sql 語句的長度。第五個(gè)參數(shù)我也不知道是干什么的。 // pdata為數(shù)據(jù)緩沖區(qū),length_of_data_in_bytes為數(shù)據(jù)大小,以字節(jié)為單位這個(gè)函數(shù)一共有5個(gè)參數(shù)。這個(gè)參數(shù)我寫1,表示這里插入的值要替換 stat 的第一個(gè)?號(這里的索引從1開始計(jì)數(shù),而非從0開始)。第4個(gè)參數(shù):二進(jìn)制數(shù)據(jù)的長度,以字節(jié)為單位。bind完了之后,二進(jìn)制數(shù)據(jù)就進(jìn)入了你的“sql語句”里了。 //把剛才分配的內(nèi)容析構(gòu)掉下面說讀二進(jìn)制的步驟。當(dāng) prepare 成功之后(返回值是 SQLITE_OK ),開始查詢數(shù)據(jù)。直到返回值不為 SQLITE_ROW 時(shí)表示查詢結(jié)束。int len = sqlite3_column_bytes( stat, 1 )。result = sqlite3_reset(stat)。通常一次 sqlite3_exec 就是一次事務(wù),如果你要?jiǎng)h除1萬條數(shù)據(jù),sqlite就做了1萬次:開始新事務(wù)刪除一條數(shù)據(jù)提交事務(wù)開始新事務(wù)… 的過程。事務(wù)的操作沒有特別的接口函數(shù),它就是一個(gè)普通的 sql 語句而已:分別如下:int result。 //開始一個(gè)事務(wù)result = sqlite3_exec( db, mit transaction, 0, 0, amp。 //回滾事務(wù)但不管這樣,我還是通過網(wǎng)上能找到的很有限的資料,探索出了給sqlite數(shù)據(jù)庫加密的完整步驟。這樣赤裸裸的展現(xiàn)自己,可不是我們的初衷。Sqlite免費(fèi)版本是不提供加密功能的,當(dāng)然你也可以選擇他們的收費(fèi)版本,那你得支付2000塊錢,而且是USD。通過閱讀 Sqlite 代碼(當(dāng)然沒有全部閱讀完,6萬多行代碼,沒有一行是我習(xí)慣的風(fēng)格,我可沒那么多眼神去看),我搞清楚了兩件事:Sqlite是支持加密擴(kuò)展的;需要 define 一個(gè)宏才能使用加密擴(kuò)展。因?yàn)槟銘?yīng)該會(huì)被編譯器提示有一些函數(shù)無法鏈接才對。嘗試編譯,vc會(huì)提示你有一些函數(shù)無法鏈接,因?yàn)檎也坏剿麄兊膶?shí)現(xiàn)。好在網(wǎng)上還有一些代碼已經(jīng)實(shí)現(xiàn)了這個(gè)功能。 文件,可以直接參考或取下來使用。 DCG_SQLITE_CRYPT_FUNC_/***********董淳光寫的 SQLITE 加密關(guān)鍵函數(shù)庫***********//***********關(guān)鍵加密函數(shù)***********/int My_Encrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )。}這個(gè)文件很容易看,就兩函數(shù),一個(gè)加密一個(gè)解密。擴(kuò)展起來很簡單。上面寫了兩個(gè)擴(kuò)展函數(shù),如何把擴(kuò)展函數(shù)跟 Sqlite 掛接起來,這個(gè)過程說起來比較麻煩。endif這個(gè)函數(shù)之所以要在 開頭聲明,是因?yàn)橄旅嬖? 里面某些函數(shù)里要插入這個(gè)函數(shù)調(diào)用。 /* A malloc() cannot fail in sqlite3ThreadData() as one or more calls to */endif需要在這部分后面緊接著插入:ifdef SQLITE_HAS_CODEC類似的還有“sqlite3pager_get”、“sqlite3pager_unref”、“sqlite3pager_write”、“sqlite3pager_pagecount”等都是老版本函數(shù),它們在 文件里定義。找到最后一行:/************** End of ************************************************/在這一行后面,接上本文最下面的代碼段。比如,你要求密鑰是128位,即是16字節(jié),但是如果用戶只輸入 1個(gè)字節(jié)呢?2個(gè)字節(jié)呢?或輸入50個(gè)字節(jié)呢?你得對密鑰進(jìn)行擴(kuò)展,使之符合16字節(jié)的要求。但是我不想用md5,因?yàn)檫€得為它添加包含一些 md5 。只要修改 DeriveKey 函數(shù)就可以了。如果太懶,就直接使用這兩個(gè)文件,編譯肯定能通過,運(yùn)行也正常。前面提到過,要開始一個(gè)數(shù)據(jù)庫操作,必須先 sqlite3_open 。//添加、使。假設(shè)你已經(jīng) sqlite3_open 成功了,緊接著寫下面的代碼::現(xiàn)在,你代碼已經(jīng)有了加密功能。參考我的 DeriveKey 函數(shù)來申請內(nèi)存。我自己寫了一個(gè)算法來擴(kuò)展密鑰,很簡單的算法。有人把接收到的密鑰求md5,這也是一個(gè)辦法,因?yàn)閙d5運(yùn)算結(jié)果固定16字節(jié),不論你有多少字符,最后就是16字節(jié)。唯一要提的是 DeriveKey 函數(shù)。所以,如果你在使用老版本的sqlite,先看看 文件,這些函數(shù)不是消失了,也不是新蹦出來的,而是老版本函數(shù)改名得到的。endif這里要注意,sqlite3PagerClose 函數(shù)大概也是 ,以前版本里是叫 “sqlite3pager_close”。amp。 ** to this point. This means the ThreadData must have been allocated already其次,“sqlite3PagerClose”函數(shù),要找到它的實(shí)現(xiàn)代碼(而不是聲明代碼)。分3個(gè)步驟。正因?yàn)槿绱?,你可以在你的算法里使用一些特定長度的加密算法,比如AES要求被加密數(shù)據(jù)一定是128位(16字節(jié))長。處理時(shí)直接把結(jié)果作用于 pData 指針指向的內(nèi)容。endif其中的 如此定義:include ./include /***********關(guān)鍵加密函數(shù)***********/int My_Encrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key ){return 0。:ifndef實(shí)現(xiàn)這些預(yù)留接口不是那么容易,要重頭說一次怎么回事很困難。下面就讓我來實(shí)現(xiàn)這些接口。定義了這個(gè)宏,一些被 Sqlite 故意屏蔽掉的代碼就被使用了。 SQLITE_HAS_CODEC。因?yàn)橄旅嫖覍⒁嬖V你如何為免費(fèi)的Sqlite擴(kuò)展出加密模塊——自己動(dòng)手?jǐn)U展,這是Sqlite允許,也是它提倡的。Sqlite為了速度而誕生。但是它保存的文件卻是明文的。現(xiàn)在要說的這個(gè)——數(shù)據(jù)庫加密,資料就很難找。 //提交事務(wù)result = sqlite3_exec( db, rollback transaction, 0, 0, amp。 result = sqlite3_exec( db, begin transaction, 0, 0, amp。因?yàn)闀r(shí)間都花在了開始事務(wù)、提交事務(wù)上。(4)事務(wù)處理sqlite 是支持事務(wù)處理的。把 pFileContent 的內(nèi)容保存出來之后,不要忘了釋放 sqlite3_stmt 結(jié)構(gòu):sqlite3_finalize( stat )。ID是個(gè)整數(shù),用下面這個(gè)語句獲取它的值:int id = sqlite3_column_int( stat, 0 )。這一句的返回值是 SQLITE_ROW 時(shí)表示成功(不是 SQLITE_OK )。然后,把一個(gè) sql 語句解析到 stat 結(jié)構(gòu)里去:sqlite3_prepare
點(diǎn)擊復(fù)制文檔內(nèi)容
外語相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1