author | brad <brad> | 2004-04-11 12:43:55 (UTC) |
---|---|---|
committer | brad <brad> | 2004-04-11 12:43:55 (UTC) |
commit | 9716f8c5672a8596306a9b432d9fabc4361baea5 (patch) (side-by-side diff) | |
tree | 2b4f23f7e1291ff9f3ff7788068918e31ed63bef /libopie2/opiedb | |
parent | 40c0415fe7afeeb03de7441e2f667495e81edfa7 (diff) | |
download | opie-9716f8c5672a8596306a9b432d9fabc4361baea5.zip opie-9716f8c5672a8596306a9b432d9fabc4361baea5.tar.gz opie-9716f8c5672a8596306a9b432d9fabc4361baea5.tar.bz2 |
Fixes for sqlite regex driver. Function must be implemented as
rlike("pattern","match") instead of "where uid rlike("99")" you must
use "where rlike("99",uid). My mistake. Also fixes for pointer math for
context regex caching.
-rw-r--r-- | libopie2/opiedb/osqlitedriver.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp index ccac2f8..588fc8f 100644 --- a/libopie2/opiedb/osqlitedriver.cpp +++ b/libopie2/opiedb/osqlitedriver.cpp @@ -88,7 +88,6 @@ void OSQLiteDriver::setOptions( const QStringList& ) { */ int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){ int res; - if (reg->regex_raw == NULL || (strcmp (zPattern, reg->regex_raw) != 0)){ if (reg->regex_raw != NULL) { free(reg->regex_raw); @@ -109,13 +108,13 @@ int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){ } void rlikeFunc(sqlite_func *context, int arg, const char **argv){ - if( argv[0]==0 || argv[1]==0 || argv[2]==0){ + if( argv[0]==0 || argv[1]==0 ){ printf("One of arguments Null!!\n"); return; } sqlite_set_result_int(context, sqliteRlikeCompare((const char*)argv[0], - (const char*)argv[1], (sqregex*)argv[2])); + (const char*)argv[1], (sqregex *)sqlite_user_data(context) )); } /* @@ -124,7 +123,8 @@ void rlikeFunc(sqlite_func *context, int arg, const char **argv){ */ bool OSQLiteDriver::open() { char *error; - qDebug("OSQLiteDriver::open: about to open"); + + qDebug("OSQLiteDriver::open: about to open"); m_sqlite = sqlite_open(m_url.local8Bit(), 0, &error ); @@ -136,7 +136,11 @@ bool OSQLiteDriver::open() { free( error ); return false; } - sqlite_create_function(m_sqlite,"rlike",3,rlikeFunc,&sqreg); + if (sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,&sqreg) != 0) + odebug << "Unable to create user defined function!" << oendl; + if (sqlite_function_type(m_sqlite,"rlike",SQLITE_NUMERIC) != 0) + odebug << "Unable to set rlike function result type!" << oendl; + sqreg.regex_raw = NULL; return true; } @@ -149,7 +153,8 @@ bool OSQLiteDriver::close() { if (m_sqlite ) sqlite_close( m_sqlite ), m_sqlite=0l; if (sqreg.regex_raw != NULL){ - free(sqreg.regex_raw); + odebug << "Freeing regex on close" << oendl; + free(sqreg.regex_raw); sqreg.regex_raw=NULL; regfree(&sqreg.regex_c); } @@ -169,7 +174,7 @@ OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { char *err; /* SQLITE_OK 0 if return code > 0 == failure */ if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) { - qWarning("OSQLiteDriver::query: Error while executing"); + qWarning("OSQLiteDriver::query: Error while executing %s",err); free(err ); // FixMe Errors } |