Russian Qt Forum

Qt => Базы данных => Тема начата: Setner от Ноябрь 19, 2012, 01:33



Название: Sqlite и regexp
Отправлено: Setner от Ноябрь 19, 2012, 01:33
Здравствуйте.
Поддерживается ли на данный момент regexp в кютешном sqlite драйвере?
Пробую, что то никак.
Есть ли опыт у других?


Название: Re: Sqlite и regexp
Отправлено: mitrich от Ноябрь 19, 2012, 14:26
Нет. В SQLite по умолчанию оператор REGEXP есть, но он ничего хорошего не делает, если не зарегистрировать собственную функцию regexp()
Цитировать
The REGEXP operator is a special syntax for the regexp() user function. No regexp() user function is defined by default and so use of the REGEXP operator will normally result in an error message. If a application-defined SQL function named "regexp" is added at run-time, that function will be called in order to implement the REGEXP operator.

Функция может выглядеть например так:
Код
C++ (Qt)
void sqlregexp(sqlite3_context* ctx, int argc, sqlite3_value** argv)
{
   QRegExp regex;
   QString arg0((const char*)sqlite3_value_text(argv[0]));
   QString arg1((const char*)sqlite3_value_text(argv[1]));
 
   regex.setPattern(arg0);
   regex.setCaseSensitivity(Qt::CaseInsensitive);
 
   if(arg1.contains(regex))
       sqlite3_result_int(ctx, 1);
   else
       sqlite3_result_int(ctx, 0);
}
 

Регистрируется так:
Код
C++ (Qt)
sqlite3_create_function(handle, "regexp", 2, SQLITE_UTF8, NULL, &sqlregexp, NULL, NULL);
 
Где handle - база данных SQLite (тип sqlite3 *) - значение, возвращаемое QSqlDriver::handle()

Наверное, наиболее правильным способом будет вставить реализацию этой функции (и её регистрацию) в драйвер SQLite, как например тут (http://www.prog.org.ru/index.php?topic=16418.msg109092#msg109092) и пересобрать его.


Название: Re: Sqlite и regexp
Отправлено: Setner от Ноябрь 20, 2012, 01:07
Попробую. Благодарю за содействие!