gpt4 book ai didi

qt - 向 Qt 应用程序添加自定义 sqlite 函数

转载 作者:IT王子 更新时间:2023-10-29 06:28:24 30 4
gpt4 key购买 nike

我正在尝试将自定义 sqlite3 regexp 函数添加到我的 Qt 应用程序中(按照 this answer 的建议)。但是当我调用 sqlite3_create_function 函数时,我收到消息 The program has unexpectedly finished. 当我调试时,它终止于 sqlite3_mutex_enter< 中的段错误。下面有一个 MWE,对绝对文件路径表示歉意。

我代码中的 regexp 实现来自 this site ;它也因 msign 函数失败 here . driver()->handle() 的各种检查直接来自 Qt 文档。

顺便说一句,我使用select sqlite_version(); 确定Qt 5.5 使用的是sqlite 版本3.8.8.2。我找到了 that version通过查看 Qt GitHub 存储库中的旧提交。

MWE.pro

QT       += core gui
TARGET = MWE
TEMPLATE = app
QT += sql
SOURCES += main.cpp \
D:\Qt\Qt5.5.0\5.5\Src\3rdparty\sqlite\sqlite3.c

HEADERS += D:\Qt\Qt5.5.0\5.5\Src\3rdparty\sqlite\sqlite3.h

主要.cpp

#include <QtSql>

#include "D:/Qt/Qt5.5.0/5.5/Src/3rdparty/sqlite/sqlite3.h"

void qtregexp(sqlite3_context* ctx, int argc, sqlite3_value** argv)
{
QRegExp regex;
QString str1((const char*)sqlite3_value_text(argv[0]));
QString str2((const char*)sqlite3_value_text(argv[1]));

regex.setPattern(str1);
regex.setCaseSensitivity(Qt::CaseInsensitive);

bool b = str2.contains(regex);

if (b)
{
sqlite3_result_int(ctx, 1);
}
else
{
sqlite3_result_int(ctx, 0);
}
}

int main(int argc, char *argv[])
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my.db");
db.open();

QVariant v = db.driver()->handle();
if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*")==0) {
sqlite3 *db_handle = *static_cast<sqlite3 **>(v.data());
if (db_handle != 0) { // check that it is not NULL
// This shows that the database handle is generally valid:
qDebug() << sqlite3_db_filename(db_handle, "main");
sqlite3_create_function(db_handle, "regexp", 2, SQLITE_UTF8 | SQLITE_DETERMINISTIC, NULL, &qtregexp, NULL, NULL);
qDebug() << "This won't be reached."

QSqlQuery query;
query.prepare("select regexp('p$','tap');");
query.exec();
query.next();
qDebug() << query.value(0).toString();
}
}
db.close();
}

最佳答案

从Qt 获取数据库句柄后需要调用sqlite3_initialize()according to this forum post .

    ...
sqlite3 *db_handle = *static_cast<sqlite3 **>(v.data());
if (db_handle != 0) { // check that it is not NULL
sqlite3_initialize();
...

这解决了问题。

关于qt - 向 Qt 应用程序添加自定义 sqlite 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34415351/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com