`

董淳光SQLITE3 使用总结(5)--转

阅读更多

董淳光SQLITE3 使用总结(5)

<script></script>标签:

知识/探索

 
<!-- 正文开始 -->
int sqlite3_key(sqlite3 *db, const void *pKey, int nKey)

{

return sqlite3_key_interop(db, pKey, nKey);

}

 

int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)

{

return sqlite3_rekey_interop(db, pKey, nKey);

}

 



int sqlite3CodecAttach(sqlite3 *db, int nDb, const void *pKey, int nKeyLen)

{

    int rc = SQLITE_ERROR;

    unsigned char* hKey = 0;

 

    //如果没有指定密匙,可能标识用了主数据库的加密或没加密.

    if (!pKey || !nKeyLen)

    {

        if (!nDb)

        {

            return SQLITE_OK; //主数据库, 没有指定密钥所以没有加密.

        }

        else //附加数据库,使用主数据库的密钥.

        {

            //获取主数据库的加密块并复制密钥给附加数据库使用

            LPCryptBlock pBlock = (LPCryptBlock)sqlite3pager_get_codecarg(sqlite3BtreePager(db->aDb[0].pBt));

 

            if (!pBlock) return SQLITE_OK; //主数据库没有加密

            if (!pBlock->ReadKey) return SQLITE_OK; //没有加密

 

            memcpy(pBlock->ReadKey, &hKey, 16);

        }

    }

    else //用户提供了密码,从中创建密钥.

    {

        hKey = DeriveKey(pKey, nKeyLen);

    }

 

    //创建一个新的加密块,并将解码器指向新的附加数据库.

    if (hKey)

    {

        LPCryptBlock pBlock = CreateCryptBlock(hKey, sqlite3BtreePager(db->aDb[nDb].pBt), NULL);

        sqlite3pager_set_codec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, pBlock);

        rc = SQLITE_OK;

    }

    return rc;

}

 

// Changes the encryption key for an existing database.

int __stdcall sqlite3_rekey_interop(sqlite3 *db, const void *pKey, int nKeySize)

{

Btree *pbt = db->aDb[0].pBt;

Pager *p = sqlite3BtreePager(pbt);

LPCryptBlock pBlock = (LPCryptBlock)sqlite3pager_get_codecarg(p);

unsigned char * hKey = DeriveKey(pKey, nKeySize);

int rc = SQLITE_ERROR;

 

 

if (!pBlock && !hKey) return SQLITE_OK;

 

//重新加密一个数据库,改变pager的写密钥, 读密钥依旧保留.

if (!pBlock) //加密一个未加密的数据库

{

     pBlock = CreateCryptBlock(hKey, p, NULL);

     pBlock->ReadKey = 0; // 原始数据库未加密

     sqlite3pager_set_codec(sqlite3BtreePager(pbt), sqlite3Codec, pBlock);

}

else // 改变已加密数据库的写密钥

{

     pBlock->WriteKey = hKey;

}

 

// 开始一个事务

rc = sqlite3BtreeBeginTrans(pbt, 1);

 

if (!rc)

{

     // 用新密钥重写所有的页到数据库。

     Pgno nPage = sqlite3PagerPagecount(p);

     Pgno nSkip = PAGER_MJ_PGNO(p);

     void *pPage;

     Pgno n;

 

     for(n = 1; rc == SQLITE_OK && n <= nPage; n ++)

     {

          if (n == nSkip) continue;

          rc = sqlite3PagerGet(p, n, &pPage);

          if(!rc)

          {

               rc = sqlite3PagerWrite(pPage);

               sqlite3PagerUnref(pPage);

          }

     }

}

 

// 如果成功,提交事务。

if (!rc)

{

     rc = sqlite3BtreeCommit(pbt);

}

 

// 如果失败,回滚。

if (rc)

{

     sqlite3BtreeRollback(pbt);

}

 

 

 

// 如果成功,销毁先前的读密钥。并使读密钥等于当前的写密钥。

if (!rc)

{

     if (pBlock->ReadKey)

     {

          sqliteFree(pBlock->ReadKey);

     }

     pBlock->ReadKey = pBlock->WriteKey;

}

else// 如果失败,销毁当前的写密钥,并恢复为当前的读密钥。

{

     if (pBlock->WriteKey)

     {

          sqliteFree(pBlock->WriteKey);

     }

     pBlock->WriteKey = pBlock->ReadKey;

}

 

 

 

// 如果读密钥和写密钥皆为空,就不需要再对页进行编解码。

// 销毁加密块并移除页的编解码器

if (!pBlock->ReadKey && !pBlock->WriteKey)

{

     sqlite3pager_set_codec(p, NULL, NULL);

     DestroyCryptBlock(pBlock);

}

 

return rc;

}

 

 

 

 

 

 



int __stdcall sqlite3_key_interop(sqlite3 *db, const void *pKey, int nKeySize)

{

  return sqlite3CodecAttach(db, 0, pKey, nKeySize);

}

 

 

// 释放与一个页相关的加密块

void sqlite3pager_free_codecarg(void *pArg)

{

if (pArg)

     DestroyCryptBlock((LPCryptBlock)pArg);

}

 

#endif //#ifdef SQLITE_HAS_CODEC

 

五、       后记

写此教程,可不是一个累字能解释。

但是我还是觉得欣慰的,因为我很久以前就想写 sqlite 的教程,一来自己备忘,二而已造福大众,大家不用再走弯路。

本人第一次写教程,不足的地方请大家指出。

分享到:
评论

相关推荐

    sqlite-tools-win-x64-3440200.zip

    "sqlite-tools-win-x64-3440200.zip"这个压缩包包含了三个主要的SQLite实用工具,它们分别是sqlite3_analyzer.exe、sqlite3.exe和sqldiff.exe。 1. **sqlite3.exe**:这是SQLite的命令行接口,也是最基础的工具。...

    sqlite-devel-3.7.17-8.el7.x86_64.rpm

    sqlite-devel-3.7.17-8.el7.x86_64.rpm

    sqlite-jdbc-3.15.1-API文档-中文版.zip

    赠送jar包:sqlite-jdbc-3.15.1.jar; 赠送原API文档:sqlite-jdbc-3.15.1-javadoc.jar; 赠送源代码:sqlite-jdbc-3.15.1-sources.jar; 赠送Maven依赖信息文件:sqlite-jdbc-3.15.1.pom; 包含翻译后的API文档:...

    wvp-GB28181-pro 适配支持 SQlite3 数据库 支持wvp-GB28181-pro 2.6.9

    wvp-GB28181-pro 适配支持 SQlite3 数据库 支持wvp-GB28181-pro 2.6.9

    sqlite-shell-win32-x86: sqlite3.exe

    网上可以下到sqlite-shell-win32-x86: sqlite3.exe 2. 为了方便命令行执行,将sqlite3.exe放到svn 项目的主目录下,和.svn目录同级下。 3. cmd进入该目录下,执行 sqlite3 .svn/wc.db "select * from work_queue"....

    PyPI 官网下载 | sqlite3-to-mysql-1.4.5.tar.gz

    在使用`sqlite3-to-mysql-1.4.5`之前,确保已安装了必要的依赖库,包括Python的`sqlite3`(默认随Python环境自带)和`mysql-connector-python`(可通过pip进行安装)。安装`sqlite3-to-mysql`的命令为: ```bash pip...

    董淳光的SQLITE3_使用总结

    【SQLite3 使用总结】 SQLite3 是一款轻量级的关系型数据库管理系统,因其开源、小巧、高效的特点而广受欢迎。董淳光的这篇文章主要涵盖了SQLite3的几个关键方面,包括版本信息、基本编译方法以及如何使用SQLite3...

    SQLiteStudio-3.4.4-windows-x64-installer.zip

    SQLite在Windows平台上的使用,除了SQLiteStudio,还可以通过命令行工具sqlite3.exe进行操作,但对于非开发者或不熟悉命令行的用户,SQLiteStudio提供了更友好的图形化界面,使得数据库管理更加便捷。 总之,SQLite...

    sqlite-shell-linux-x86-3080900.zip

    "sqlite-shell-linux-x86-3080900.zip" 是一个适用于Linux环境下32位系统的SQLite交互式shell工具的压缩包,版本为3.8.9。这个工具提供了对SQLite数据库进行命令行操作的能力,是开发者和系统管理员在Linux环境中...

    sqlite3.exe sqlite3.exe sqlite-dll-win64-x64-3230100

    标题中的 "sqlite3.exe sqlite3.exe sqlite-dll-win64-x64-3230100" 指的是这个压缩包包含了两个 `sqlite3.exe` 文件以及一个特定版本(3230100)的 `sqlite-dll-win64-x64`,即64位 Windows 平台的 SQLite3 动态...

    sqlite .net 源码包 sqlite-netFx-source-1.0.86.0

    SQLite .NET源码包`sqlite-netFx-source-1.0.86.0`是一个针对.NET平台的SQLite数据库引擎的开源实现,它提供了方便的API接口供.NET开发者使用。这个源码包主要用于学习、研究或者自定义扩展SQLite的功能,以满足特定...

    SQLite-1.0.66.0-setup

    "SQLite-1.0.66.0-setup" 标题表明这是一个关于SQLite数据库的安装程序,版本号为1.0.66.0。这个压缩包可能包含了用于在用户计算机上安装SQLite的必要文件。 描述中的重复信息“SQLite-1.0.66.0-setup”可能是一个...

    sqlite-devel-3.7.17-8.el7_7.1.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    sqlite-shell-linux-x86-3080500.zip

    "sqlite-shell-linux-x86-3080500.zip" 是针对Linux平台的x86架构的SQLite3命令行接口的压缩包,版本号为3.8.5。这个压缩包包含了一个名为"sqlite3"的可执行文件,它是用于管理和操作SQLite数据库的shell程序。 ...

    sqlite-tools-linux-x86-3350400.zip

    在“sqlite-tools-linux-x86-3350400.zip”这个压缩包中,包含了以下关键的SQLite工具: 1. **sqlite3**: 这是SQLite的主要命令行接口。用户可以通过这个工具执行SQL语句,创建和管理数据库,查询数据,甚至进行...

    SQLite3-net2-4.6-DLL

    3. sqlite-netFx451-static-binary-x64-2013-1.0.109.0.zip、sqlite-netFx45-static-binary-x64-2012-1.0.109.0.zip、sqlite-netFx451-static-binary-Win32-2013-1.0.109.0.zip 和 sqlite-netFx45-static-binary-Win...

    sqlite-shell-win32-x86-3080200.zip

    1. **安装与运行**:解压"sqlite-shell-win32-x86-3080200.zip"到任意目录,然后找到sqlite3.exe,双击运行或在命令行中输入其路径启动。 2. **连接数据库**:在命令行中,输入`.open 数据库文件名`,例如`.open ...

    sqlite-tools-win32-x86-3290000

    sqlite-tools-win32-x86-3290000 通常包含了用于管理SQLite数据库的命令行工具,如sqlite3.exe,这个工具可以用来创建、打开、查询和管理SQLite数据库文件(通常以.db为扩展名)。 用户可以在该目录下运行sqlite3....

    sqlitejdbc-v037-nested

    sqlitejdbc-v037-nested.jar

Global site tag (gtag.js) - Google Analytics