挖井

类库大魔王的挖井日记

挖一口属于自己的井


让Qt的sqlite插件支持REGEXP查询

仍然是日志查看程序,突然想要加个按正则表达式的查询,记得sqlite是支持REGEXP的,不过sqlite官方文档上说了,需要程序自己提供一个进行正则匹配的函数,然后调用sqlite3_create_function来实现。

在Qt中实现需要以下几步:

  1. 获取sqlite3 *
  2. 调用sqlite3_initialize,这个函数到底什么作用我也不清楚,看文档也没看明白,只说在嵌入式系统上要调,工作站系统上没必要,但这里如果不调用的话,下一步调用sqlite3_create_function就会crash,囧;
  3. 实现正则表达式匹配函数,供sqlite3回调;
  4. 将上一步实现的函数注册到sqlite3中,通过调用sqlite3_create_function完成;
  5. 编译链接时要提供与Qt使用的相同版本的sqlite3.c和sqlite3.h,因为这里调用了sqlite的C接口函数,而Qt虽然封装了sqlite,却没有暴露这些函数出来,只能自己链接一份了。Qt 5.7用的是3.11.1.0版本,如果版本不一致,则数据库打开后不能close,或者close就crash。

代码如下:


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

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

    bool b = text.contains(regex);

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

/////////////////////////////////////////////////////////////

    QSqlDatabase db = QSqlDatabase::database(m_dbFile, true);
    if (!db.isValid()) {
        db = QSqlDatabase::addDatabase("QSQLITE", m_dbFile);
        db.setDatabaseName(m_dbFile);
    }

    if (!db.isOpen())
    {
        if (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)
                {
                    sqlite3_initialize();
                    // must use the same sqlite3 version with the one Qt ships, aka. Qt 5.7 uses sqlite3 3.11.1.0
                    // http://www.sqlite.org/2016/sqlite-amalgamation-3110100.zip
                    sqlite3_create_function_v2(db_handle, "regexp", 2, SQLITE_UTF8 | SQLITE_DETERMINISTIC, NULL, &qtregexp, NULL, NULL, NULL);
                }
            }
        }
    }

本文地址:

https://minidump.info/blog/2016/06/qt-sqlite-plugin-supports-regexp-select/

上一篇

某日志查看程序开发小结

这几天写了个查看日志的程序,日志是公司里产品项目用户log4cxx生成的,用于定位问题。以前看到过其他同事自己开发的这类程序,但都只限于他们自己使用,等他们离职了,就基本失传了,尽管他们是交接给其他同事了。曾经想动过这个念头,想自己写一个,主要的理念是,定位问题的时候,往往会在几个日志文件中搜...…

Qt 全文阅读
下一篇

Nexus5出问题了

周四周五的时候妹子跟我说她的Nexus 5屏幕在抖动,当时我也没放在心上,只想着可能是系统或某个app的缘故,等抽空把数据备份一下,然后还原出厂设置试一下。结果拖延症一拖也就过去了,昨天妹子出去参加什么沙龙去了,晚上回来手机已经抖得几乎没法用了,我就着急想把数据备份一下,主要就是(垃圾)微信聊...…

Mobile 全文阅读