如何在SQLite数据库的每个页面末尾重新开发空间

时间:2017-09-27 16:11:39

标签: python python-3.x sqlite

我尝试使用pysqlsimplecipher加密SQLite3数据库。当我尝试加密它时,它会出错:

raise RuntimeError('needs reserved space at the end of each page.')
RuntimeError: needs reserved space at the end of each page.

我不知道该怎么做。我使用DB浏览器进行sqlite。是否有任何我应该执行的SQL语句,我应该在DB浏览器或任何python函数中从其SQLite模块更改任何设置以在每个页面的末尾保留空间?多少空间就足够了?

或任何解决方法?它是较大程序的一部分,所以这里的约束是我应该使用python来加密。但是,我可以使用任何方法来保留空间,因为它只需要完成一次。

我的平台是Windows 8.1,python版本是3.6 x32。如果那很重要。

我询问pythonic方式或SQL语句来执行此操作。 我已经找到了一个answer using c++,但是在c ++中已经找到了For each construct。我对c ++一无所知 我已经读过您编译sqlite以便与c ++一起使用。我不知道。如果有人发布整个代码片段来使用c ++来完成它,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

您链接的documentation说:

  

需要在数据库文件每页末尾的保留空间。

     

否则,使用sqlcipher进行加密。

     

使用sqlcipher进行加密

     
      
  • 打开普通数据库

    ./sqlcipher plain.db
    
  •   
  • 加密到enc.db

    ATTACH DATABASE 'enc.db' as encrypted key 'testkey';
    SELECT sqlcipher_export('encrypted');
    DETACH DATABASE encrypted;
    
  •   

答案 1 :(得分:0)

经过几天的研究和尝试了大量的方法。我成功地做到了这一点。方法sqlite3_test_control(SQLITE_TESTCTRL_RESERVE,sqlite3 * db,int N)不再起作用。因此,我使用HEX编辑器更改用于指示在sqlite数据库中每页末尾要保留多少空间的特定字节。 Go Go:

1-创建一个空数据库:不要创建任何表或任何其他表。创建并保存sqlite数据库文件。

2-使用十六进制编辑器更改偏移量20处的字节。它将为00这意味着不保留任何字节。例如,如果要保留36个字节。将偏移量为20的字节值更改为“24”(转换为HEX时为36)。

3 - 检查偏移105和106处的字节。它们的值表示内容区域的起始位置。如果保留空间为0,则值为页面大小。 例如,在这种情况下,它的0400是十进制的1024。现在减去先前设置为保留的字节; 36. 1024-36 = 988。在HEX 03DC。 将值设置为105和106偏移到03DC。保存它现在你很高兴。 检查image我是否为编辑器的相关字节和设置加下划线。

我需要使用pysqlsimplecipher来加密和解密数据库,这需要在每个页面的末尾保留一些字节。 希望它可以帮到某人。