sqlite3 关于pagesize的疑惑

zhfish 2011-01-28 03:08:01
小弟测试时用的是sqlite3.5.4 ,并且加上了wxsqlite的加密模块,有个问题很不解
创建表的时候设定pagesize为2048,然后用sqlite3_key加密

在sqlite3_open的时候,在sqlite3BtreeOpen函数里,要读取前100个字节为zDbHeader
unsigned char zDbHeader[100];
sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader);


然后获取第16,17字节为pageSize
20字节为nReserve
21字节为maxEmbedFrac
22字节为minEmbedFrac
23字节为minLeafFrac
pBt->pageSize = get2byte(&zDbHeader[16]);
nReserve = zDbHeader[20];
pBt->maxEmbedFrac = zDbHeader[21];

pBt->minEmbedFrac = zDbHeader[22];
pBt->minLeafFrac = zDbHeader[23];


因为加密的原因,一开始读取到的都是加密的东西,不正确,一般pagesize都是很大的数字
所以程序会给纠正为1024
if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE
|| ((pBt->pageSize-1)&pBt->pageSize)!=0 )
{

pBt->pageSize = 0;
sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize);
pBt->maxEmbedFrac = 64; /* 25% */

pBt->minEmbedFrac = 32; /* 12.5% */

pBt->minLeafFrac = 32; /* 12.5% */
}


但是在
sqlite3_exec( db, "select * from MyTable_1", LoadMyInfo, NULL, &errmsg );
的时候
会调用lockBtree函数,并且读取到正确的pagesize值(2048)
pageSize = get2byte(&page1[16]);
assert( (pageSize & 7)==0 );
pBt->pageSize = pageSize;
pBt->usableSize = pageSize - page1[20];
pBt->maxEmbedFrac = page1[21];

pBt->minEmbedFrac = page1[22];
pBt->minLeafFrac = page1[23];


但问题来了,小弟搞不清楚这两次获取pagesize有何联系
当手动把第一个pagesize改为2048,就可以成功获取到数据
如何可以让程序获取到正确的 pagesize之后重新赋值呢?


...全文
342 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cook_fish 2012-07-08
  • 打赏
  • 举报
回复
楼主,你的加密怎么实现的?能具体说一下吗
iihero 2011-02-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhfish 的回复:]

那请问改哪里才可以让他不加密page1的前100字节?
sqlite3的代码确实是实用型的,简单说是乱乱的看不明白
[/Quote]
加密是每页都要加密的,只是会留出16个字节的空间来存放跟key有关的东西。
zhfish 2011-02-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iihero 的回复:]
加密是每页都要加密的,只是会留出16个字节的空间来存放跟key有关的东西。
[/Quote]

通过跟踪发现,只有读第一页的时候有问题,后面页都是正确的..
iihero 2011-01-31
  • 打赏
  • 举报
回复
pagesize在创建完连接以后,是不能改变它的值的。否则易出问题。
zhfish 2011-01-31
  • 打赏
  • 举报
回复
那请问改哪里才可以让他不加密page1的前100字节?
sqlite3的代码确实是实用型的,简单说是乱乱的看不明白
zhfish 2011-01-29
  • 打赏
  • 举报
回复
pagesize为2048就不可用了....
iihero 2011-01-29
  • 打赏
  • 举报
回复
加密只要调用以后可用就行了。应该是按页加密的。

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧