author | brad <brad> | 2004-04-05 19:24:04 (UTC) |
---|---|---|
committer | brad <brad> | 2004-04-05 19:24:04 (UTC) |
commit | cb3097d5249b6bd576d0212394ab57e885f9e9da (patch) (side-by-side diff) | |
tree | f4a25035e43804507bb69d30da5b735082a1e0df | |
parent | 35c73e46c62f60596037c85a5545e13e4488b81f (diff) | |
download | opie-cb3097d5249b6bd576d0212394ab57e885f9e9da.zip opie-cb3097d5249b6bd576d0212394ab57e885f9e9da.tar.gz opie-cb3097d5249b6bd576d0212394ab57e885f9e9da.tar.bz2 |
*Basic* regex caching for massive search speedup (and I mean lots)
Yes, it's ugly. Yes, it's simple. Yes it probably breaks several fundamental coding rules.
Yes, I'm open to suggestions as to how to do it better and more in the Opie way.
-rw-r--r-- | libopie2/opiedb/osqlitedriver.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp index eea1093..4eda9b9 100644 --- a/libopie2/opiedb/osqlitedriver.cpp +++ b/libopie2/opiedb/osqlitedriver.cpp @@ -38,12 +38,14 @@ #include <stdio.h> // fromLocal8Bit() does not work as expected. Thus it // is replaced by fromLatin1() (eilers) #define __BUGGY_LOCAL8BIT_ + char *regex_raw; + regex_t regex_c; using namespace Opie::DB; using namespace Opie::DB::Internal; namespace { struct Query { @@ -81,30 +83,33 @@ void OSQLiteDriver::setUrl( const QString& url ) { } void OSQLiteDriver::setOptions( const QStringList& ) { } -/*------------------------------------------------------------------/* +/* * Functions to patch a regex search into sqlite - * -----------------------------------------------------------------*/ + */ int sqliteRlikeCompare(const char *zPattern, const char *zString){ - regex_t regex; int res; - if ( zPattern==NULL || zString==NULL ) { - printf("One of the args was null!\n"); - return 0; - } - res = regcomp(®ex, zPattern, REG_EXTENDED); - if ( res != 0 ) { - printf("Regcomp failed with code %u on string %s\n",res,zPattern); - + if (regex_raw == NULL || (strcmp (zPattern, regex_raw) != 0)){ + if (regex_raw != NULL) { + free(regex_raw); + regfree(®ex_c); + } + regex_raw = (char *)malloc(strlen(zPattern)+1); + strncpy(regex_raw, zPattern, strlen(zPattern)+1); + res = regcomp(®ex_c, zPattern, REG_EXTENDED); + if ( res != 0 ) { + printf("Regcomp failed with code %u on string %s\n",res,zPattern); + free(regex_raw); + regex_raw=NULL; return 0; + } } - res = (regexec(®ex, zString, 0, NULL, 0)==0); - regfree(®ex); + res = (regexec(®ex_c, zString, 0, NULL, 0)==0); return res; } void rlikeFunc(sqlite_func *context, int arg, const char **argv){ if( argv[0]==0 || argv[1]==0 ) return; sqlite_set_result_int(context, @@ -139,13 +144,15 @@ bool OSQLiteDriver::open() { * sqlite closes them without * telling failure or success */ bool OSQLiteDriver::close() { if (m_sqlite ) sqlite_close( m_sqlite ), m_sqlite=0l; - + free(regex_raw); + regex_raw=NULL; + regfree(®ex_c); return true; } /* Query */ OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { |