Sqlite代码28“文件在打开时重命名”

时间:2015-01-07 22:05:58

标签: macos sqlite

这是this question的必然结果。

我有一个非常广泛使用sqlite的Mac应用程序。几个线程在sqlite代码中死锁,而不使用任何共享资源。我通过sqlite_config_log函数设置了sqlite3_config,并且我不断收到代码为28的消息:

  

文件在打开时重命名:

Code 28是SQLITE_WARNING。我发现似乎是source code that logs that warning(搜索“打开时重命名的文件”的页面),似乎它应该给我一个违规文件的路径,但这不是通过日志声明。我甚至在我的日志功能中放了一个断点,并检查了“文件重命名”字符串的内存,那里没有文件名;它不仅仅是因为错误的空字符而切断了日志。

我也知道我实际上并没有重命名该文件。它在创建文件后立即给我这个警告。并且相同的代码在iOS应用程序(与sqlite版本3.7.13链接,而Mac为3.8.5)中运行而不生成警告。那么,问题是:除了重命名文件之外还有什么可能导致此警告?

更新:如果数据库在针对它运行任何语句之前转换为DELETE日记帐模式,则不会出现警告。

1 个答案:

答案 0 :(得分:2)

我能够通过将latest version of SQLite作为源代码捆绑到我的项目而不是链接到dylib来解决这个问题。这是sqlite中的某种错误,可能是因为我的应用程序管理文件的方式,它在磁盘上创建一个空文件,然后将其传递给sqlite以创建数据库文件(而不是传递sqlite的路径到一个空的位置)。我目前正在运行3.8.8.2;和Yosemite捆绑在一起的版本是3.7.something,我想。相同的版本在iOS 8中出现,并在我的配套iOS应用程序中引起了同样的问题。

注意:如果将sqlite捆绑到Xcode项目中,请确保已定义HAVE_USLEEP或it'll sleep whole seconds waiting for locks