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

正文內(nèi)容

[計(jì)算機(jī)軟件及應(yīng)用]sqlite-資料下載頁(yè)

2024-08-27 16:27本頁(yè)面
  

【正文】 _stmt * stat。然后,把一個(gè) sql 語(yǔ)句解析到 stat 結(jié)構(gòu)里去:sqlite3_prepare( db, “select * from Tbl_2”, 1, amp。stat, 0 )。當(dāng) prepare 成功之后(返回值是 SQLITE_OK ),開(kāi)始查詢數(shù)據(jù)。int result = sqlite3_step( stat )。這一句的返回值是 SQLITE_ROW 時(shí)表示成功(不是 SQLITE_OK )。你可以循環(huán)執(zhí)行 sqlite3_step 函數(shù),一次 step 查詢出一條記錄。直到返回值不為 SQLITE_ROW 時(shí)表示查詢結(jié)束。然后開(kāi)始獲取第一個(gè)字段:ID 的值。ID是個(gè)整數(shù),用下面這個(gè)語(yǔ)句獲取它的值:int id = sqlite3_column_int( stat, 0 )。 //第2個(gè)參數(shù)表示獲取第幾個(gè)字段內(nèi)容,從0開(kāi)始計(jì)算,因?yàn)槲业谋淼腎D字段是第一個(gè)字段,因此這里我填0下面開(kāi)始獲取 file_content 的值,因?yàn)?file_content 是二進(jìn)制,因此我需要得到它的指針,還有它的長(zhǎng)度:const void * pFileContent = sqlite3_column_blob( stat, 1 )。int len = sqlite3_column_bytes( stat, 1 )。這樣就得到了二進(jìn)制的值。把 pFileContent 的內(nèi)容保存出來(lái)之后,不要忘了釋放 sqlite3_stmt 結(jié)構(gòu):sqlite3_finalize( stat )。 //把剛才分配的內(nèi)容析構(gòu)掉 sqlite3_stmt 結(jié)構(gòu)如果你需要重復(fù)使用 sqlite3_prepare 解析好的 sqlite3_stmt 結(jié)構(gòu),需要用函數(shù): sqlite3_reset。result = sqlite3_reset(stat)。這樣, stat 結(jié)構(gòu)又成為 sqlite3_prepare 完成時(shí)的狀態(tài),你可以重新為它 bind 內(nèi)容。(4)事務(wù)處理sqlite 是支持事務(wù)處理的。如果你知道你要同步刪除很多數(shù)據(jù),不仿把它們做成一個(gè)統(tǒng)一的事務(wù)。通常一次 sqlite3_exec 就是一次事務(wù),如果你要?jiǎng)h除1萬(wàn)條數(shù)據(jù),sqlite就做了1萬(wàn)次:開(kāi)始新事務(wù)刪除一條數(shù)據(jù)提交事務(wù)開(kāi)始新事務(wù)… 的過(guò)程。這個(gè)操作是很慢的。因?yàn)闀r(shí)間都花在了開(kāi)始事務(wù)、提交事務(wù)上。你可以把這些同類操作做成一個(gè)事務(wù),這樣如果操作錯(cuò)誤,還能夠回滾事務(wù)。事務(wù)的操作沒(méi)有特別的接口函數(shù),它就是一個(gè)普通的 sql 語(yǔ)句而已:分別如下:int result。 result = sqlite3_exec( db, begin transaction, 0, 0, amp。zErrorMsg )。 //開(kāi)始一個(gè)事務(wù)result = sqlite3_exec( db, mit transaction, 0, 0, amp。zErrorMsg )。 //提交事務(wù)result = sqlite3_exec( db, rollback transaction, 0, 0, amp。zErrorMsg )。 //回滾事務(wù)一、給數(shù)據(jù)庫(kù)加密前面所說(shuō)的內(nèi)容網(wǎng)上已經(jīng)有很多資料,雖然比較零散,但是花點(diǎn)時(shí)間也還是可以找到的?,F(xiàn)在要說(shuō)的這個(gè)——數(shù)據(jù)庫(kù)加密,資料就很難找。也可能是我操作水平不夠,找不到對(duì)應(yīng)資料。但不管這樣,我還是通過(guò)網(wǎng)上能找到的很有限的資料,探索出了給sqlite數(shù)據(jù)庫(kù)加密的完整步驟。這里要提一下,雖然 sqlite 很好用,速度快、體積小巧。但是它保存的文件卻是明文的。若不信可以用 NotePad 打開(kāi)數(shù)據(jù)庫(kù)文件瞧瞧,里面 insert 的內(nèi)容幾乎一覽無(wú)余。這樣赤裸裸的展現(xiàn)自己,可不是我們的初衷。當(dāng)然,如果你在嵌入式系統(tǒng)、智能手機(jī)上使用 sqlite,最好是不加密,因?yàn)檫@些系統(tǒng)運(yùn)算能力有限,你做為一個(gè)新功能提供者,不能把用戶有限的運(yùn)算能力全部花掉。Sqlite為了速度而誕生。因此Sqlite本身不對(duì)數(shù)據(jù)庫(kù)加密,要知道,如果你選擇標(biāo)準(zhǔn)AES算法加密,那么一定有接近50%的時(shí)間消耗在加解密算法上,甚至更多(性能主要取決于你算法編寫(xiě)水平以及你是否能使用cpu提供的底層運(yùn)算能力,比如MMX或sse系列指令可以大幅度提升運(yùn)算速度)。Sqlite免費(fèi)版本是不提供加密功能的,當(dāng)然你也可以選擇他們的收費(fèi)版本,那你得支付2000塊錢(qián),而且是USD。我這里也不是說(shuō)支付錢(qián)不好,如果只為了數(shù)據(jù)庫(kù)加密就去支付2000塊,我覺(jué)得劃不來(lái)。因?yàn)橄旅嫖覍⒁嬖V你如何為免費(fèi)的Sqlite擴(kuò)展出加密模塊——自己動(dòng)手?jǐn)U展,這是Sqlite允許,也是它提倡的。那么,就讓我們一起開(kāi)始為 文件擴(kuò)展出加密模塊。通過(guò)閱讀 Sqlite 代碼(當(dāng)然沒(méi)有全部閱讀完,6萬(wàn)多行代碼,沒(méi)有一行是我習(xí)慣的風(fēng)格,我可沒(méi)那么多眼神去看),我搞清楚了兩件事:Sqlite是支持加密擴(kuò)展的;需要 define 一個(gè)宏才能使用加密擴(kuò)展。這個(gè)宏就是 SQLITE_HAS_CODEC。你在代碼最前面(也可以在 文件第一行)定義:ifndef SQLITE_HAS_CODECdefine SQLITE_HAS_CODECendif如果你在代碼里定義了此宏,但是還能夠正常編譯,那么應(yīng)該是操作沒(méi)有成功。因?yàn)槟銘?yīng)該會(huì)被編譯器提示有一些函數(shù)無(wú)法鏈接才對(duì)。如果你用的是 VC 2003,你可以在“解決方案”里右鍵點(diǎn)擊你的工程,然后選“屬性”,找到“C/C++”,再找到“命令行”,在里面手工添加“/D SQLITE_HAS_CODEC”。定義了這個(gè)宏,一些被 Sqlite 故意屏蔽掉的代碼就被使用了。這些代碼就是加解密的接口。嘗試編譯,vc會(huì)提示你有一些函數(shù)無(wú)法鏈接,因?yàn)檎也坏剿麄兊膶?shí)現(xiàn)。如果你也用的是VC2003,那么會(huì)得到下面的提示:error LNK2019: 無(wú)法解析的外部符號(hào) _sqlite3CodecGetKey ,該符號(hào)在函數(shù) _attachFunc 中被引用error LNK2019: 無(wú)法解析的外部符號(hào) _sqlite3CodecAttach ,該符號(hào)在函數(shù) _attachFunc 中被引用error LNK2019: 無(wú)法解析的外部符號(hào) _sqlite3_activate_see ,該符號(hào)在函數(shù) _sqlite3Pragma 中被引用error LNK2019: 無(wú)法解析的外部符號(hào) _sqlite3_key ,該符號(hào)在函數(shù) _sqlite3Pragma 中被引用fatal error LNK1120: 4 個(gè)無(wú)法解析的外部命令這是正常的,因?yàn)镾qlite只留了接口而已,并沒(méi)有給出實(shí)現(xiàn)。下面就讓我來(lái)實(shí)現(xiàn)這些接口。如果真要我從一份 網(wǎng)上down下來(lái)的 文件,直接摸索出這些接口的實(shí)現(xiàn),我認(rèn)為我還沒(méi)有這個(gè)能力。好在網(wǎng)上還有一些代碼已經(jīng)實(shí)現(xiàn)了這個(gè)功能。通過(guò)參照他們的代碼以及不斷編譯中vc給出的錯(cuò)誤提示,最終我把整個(gè)接口整理出來(lái)。實(shí)現(xiàn)這些預(yù)留接口不是那么容易,要重頭說(shuō)一次怎么回事很困難。我把代碼都寫(xiě)好了,直接把他們按我下面的說(shuō)明拷貝到 文件對(duì)應(yīng)地方即可。 文件,可以直接參考或取下來(lái)使用。這里要說(shuō)一點(diǎn)的是,我另外新建了兩個(gè)文件:。:ifndef DCG_SQLITE_CRYPT_FUNC_define DCG_SQLITE_CRYPT_FUNC_/***********董淳光寫(xiě)的 SQLITE 加密關(guān)鍵函數(shù)庫(kù)***********//***********關(guān)鍵加密函數(shù)***********/int My_Encrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )。/***********關(guān)鍵解密函數(shù)***********/int My_DeEncrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )。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。}/***********關(guān)鍵解密函數(shù)***********/int My_DeEncrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key ){return 0。}這個(gè)文件很容易看,就兩函數(shù),一個(gè)加密一個(gè)解密。傳進(jìn)來(lái)的參數(shù)分別是待處理的數(shù)據(jù)、數(shù)據(jù)長(zhǎng)度、密鑰、密鑰長(zhǎng)度。處理時(shí)直接把結(jié)果作用于 pData 指針指向的內(nèi)容。你需要定義自己的加解密過(guò)程,就改動(dòng)這兩個(gè)函數(shù),其它部分不用動(dòng)。擴(kuò)展起來(lái)很簡(jiǎn)單。這里有個(gè)特點(diǎn),data_len 一般總是 1024 字節(jié)。正因?yàn)槿绱耍憧梢栽谀愕乃惴ɡ锸褂靡恍┨囟ㄩL(zhǎng)度的加密算法,比如AES要求被加密數(shù)據(jù)一定是128位(16字節(jié))長(zhǎng)。這個(gè)1024不是碰巧,而是 Sqlite 的頁(yè)定義是1024字節(jié),: define SQLITE_DEFAULT_PAGE_SIZE 1024你可以改動(dòng)這個(gè)值,不過(guò)還是建議沒(méi)有必要不要去改它。上面寫(xiě)了兩個(gè)擴(kuò)展函數(shù),如何把擴(kuò)展函數(shù)跟 Sqlite 掛接起來(lái),這個(gè)過(guò)程說(shuō)起來(lái)比較麻煩。我直接貼代碼。分3個(gè)步驟。首先,在 文件頂部,添加下面內(nèi)容:ifdef SQLITE_HAS_CODECinclude .//***********用于在 sqlite3 最后關(guān)閉時(shí)釋放一些內(nèi)存***********/void sqlite3pager_free_codecarg(void *pArg)。endif這個(gè)函數(shù)之所以要在 開(kāi)頭聲明,是因?yàn)橄旅嬖? 里面某些函數(shù)里要插入這個(gè)函數(shù)調(diào)用。所以要提前聲明。其次,“sqlite3PagerClose”函數(shù),要找到它的實(shí)現(xiàn)代碼(而不是聲明代碼)。實(shí)現(xiàn)代碼里一開(kāi)始是:ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT /* A malloc() cannot fail in sqlite3ThreadData() as one or more calls to ** malloc() must have already been made by this thread before it gets ** to this point. This means the ThreadData must have been allocated already ** so that can be set. */ ThreadData *pTsd = sqlite3ThreadData()。 assert( pPager )。 assert( pTsd amp。amp。 pTsdnAlloc )。endif需要在這部分后面緊接著插入:ifdef SQLITE_HAS_CODEC sqlite3pager_free_codecarg(pPagerpCodecArg)。endif這里要注意,sqlite3PagerClose 函數(shù)大概也是 ,以前版本里是叫 “sqlite3pager_close”。因此你在老版本sqlite代碼里搜索“sqlite3PagerClose”是搜不到的。類似的還有“sqlite3pager_get”、“sqlite3pager_unref”、“sqlite3pager_write”、“sqlite3pager_pagecount”等都是老版本函數(shù),它們?cè)? 文件里定義。新版本對(duì)應(yīng)函數(shù)是在 里定義(因?yàn)槎己喜⒌?)。所以,如果你在使用老版本的sqlite,先看看 文件,這些函數(shù)不是消失了,也不是新蹦出來(lái)的,而是老版本函數(shù)改名得到的。最后, 文件下找。找到最后一行:/************** End of ************************************************/在這一行后面,接上本文最下面的代碼段。這些代碼很長(zhǎng),我不再解釋,直接接上去就得了。唯一要提的是 DeriveKey 函數(shù)。這個(gè)函數(shù)是對(duì)密鑰的擴(kuò)展。比如,你要求密鑰是128位,即是16字節(jié),但是如果用戶只輸入 1個(gè)字節(jié)呢?2個(gè)字節(jié)呢?或輸入50個(gè)字節(jié)呢?你得對(duì)密鑰進(jìn)行擴(kuò)展,使之符合16字節(jié)的要求。DeriveKey 函數(shù)就是做這個(gè)擴(kuò)展的。有人把接收到的密鑰求md5,這也是一個(gè)辦法,因?yàn)閙d5運(yùn)算結(jié)果固定16字節(jié),不論你有多少字符,最后就是16字節(jié)。這是md5算法的特點(diǎn)。但是我不想用md5,因?yàn)檫€得為它添加包含一些 md5 。我不想這么做。我自己寫(xiě)了一個(gè)算法來(lái)擴(kuò)展密鑰,很簡(jiǎn)單的算法。當(dāng)然,你也可以使用你的擴(kuò)展方法,也而可以使用 md5 算法。只要修改 DeriveKey 函數(shù)就可以了。在 DeriveKey 函數(shù)里,只管申請(qǐng)空間構(gòu)造所需要的密鑰,不需要釋放,因?yàn)樵诹硪粋€(gè)函數(shù)里有釋放過(guò)程,而那個(gè)函數(shù)會(huì)在數(shù)據(jù)庫(kù)關(guān)閉時(shí)被調(diào)用。參考我的 DeriveKey 函數(shù)來(lái)申請(qǐng)內(nèi)存。這里我給出我已經(jīng)修改好的 和 文件。如果太懶,就直接使用這兩個(gè)文件,編譯肯定能通過(guò),運(yùn)行也正常。當(dāng)然,你必須按我前面提的,新建 和 文件,而且函數(shù)要按我前面定義的要求來(lái)做。:現(xiàn)在,你代碼已經(jīng)有了加密功能。你要把加密功能給用上,除了改 文件、給你工程添加 SQLITE_HAS_CODEC 宏,還得修改你的數(shù)據(jù)庫(kù)調(diào)用函數(shù)。前面提到過(guò),要開(kāi)始一個(gè)數(shù)據(jù)庫(kù)操作,必須先 sqlite3_open 。加解密過(guò)程就在 sqlite3_open 后面操作。假設(shè)你已經(jīng) sqlite3_open 成功了,緊接著寫(xiě)下面的代碼: int i。//添加
點(diǎn)擊復(fù)制文檔內(nèi)容
外語(yǔ)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1