首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

sqlite3 关于pagesize的疑惑解决方法

2012-02-27 
sqlite3 关于pagesize的疑惑小弟测试时用的是sqlite3.5.4 ,并且加上了wxsqlite的加密模块,有个问题很不解

sqlite3 关于pagesize的疑惑
小弟测试时用的是sqlite3.5.4 ,并且加上了wxsqlite的加密模块,有个问题很不解
创建表的时候设定pagesize为2048,然后用sqlite3_key加密

在sqlite3_open的时候,在sqlite3BtreeOpen函数里,要读取前100个字节为zDbHeader

C/C++ code
unsigned char zDbHeader[100];sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader);


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


因为加密的原因,一开始读取到的都是加密的东西,不正确,一般pagesize都是很大的数字
所以程序会给纠正为1024
C/C++ code
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% */}


但是在
C/C++ code
sqlite3_exec( db, "select * from MyTable_1", LoadMyInfo, NULL, &errmsg );
的时候
会调用lockBtree函数,并且读取到正确的pagesize值(2048)
C/C++ code
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之后重新赋值呢?




[解决办法]
pagesize在创建完连接以后,是不能改变它的值的。否则易出问题。

热点排行