summaryrefslogtreecommitdiff
authorbrad <brad>2004-04-11 12:43:55 (UTC)
committer brad <brad>2004-04-11 12:43:55 (UTC)
commit9716f8c5672a8596306a9b432d9fabc4361baea5 (patch) (side-by-side diff)
tree2b4f23f7e1291ff9f3ff7788068918e31ed63bef
parent40c0415fe7afeeb03de7441e2f667495e81edfa7 (diff)
downloadopie-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.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiedb/osqlitedriver.cpp19
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp4
2 files changed, 14 insertions, 9 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
@@ -83,17 +83,16 @@ 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, sqregex *reg){
int res;
-
if (reg->regex_raw == NULL || (strcmp (zPattern, reg->regex_raw) != 0)){
if (reg->regex_raw != NULL) {
free(reg->regex_raw);
regfree(&reg->regex_c);
}
reg->regex_raw = (char *)malloc(strlen(zPattern)+1);
strncpy(reg->regex_raw, zPattern, strlen(zPattern)+1);
res = regcomp(&reg->regex_c, zPattern, REG_EXTENDED);
@@ -104,57 +103,63 @@ int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){
return 0;
}
}
res = (regexec(&reg->regex_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 || 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) ));
}
/*
* try to open a db specified via setUrl
* and options
*/
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 );
/* failed to open */
if (m_sqlite == 0l ) {
// FIXME set the last error
qWarning("OSQLiteDriver::open: %s", error );
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;
}
/* close the db
* sqlite closes them without
* telling failure or success
*/
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);
}
return true;
}
/* Query */
@@ -164,17 +169,17 @@ OSQLResult OSQLiteDriver::query( OSQLQuery* qu) {
OSQLResult result( OSQLResult::Failure );
return result;
}
Query query;
query.driver = this;
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
}
OSQLResult result(OSQLResult::Success,
query.items,
query.errors );
return result;
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
index bb5c99b..401a3c1 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
@@ -596,30 +596,30 @@ QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &qu
QArray<int> list = extractUids( res );
return list;
}
QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
{
-#if 1
+#if 0
QArray<int> nix(0);
return nix;
#else
QString qu = "SELECT uid FROM addressbook WHERE (";
QString searchlist;
QStringList fieldList = OPimContactFields::untrfields( false );
// QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
if ( !searchlist.isEmpty() )
searchlist += " OR ";
- searchlist += "\"" + *it + "\" rlike(\"" + r.pattern() + "\") ";
+ searchlist += " rlike(\""+ r.pattern() + "\",\"" + *it + "\") ";
}
qu = qu + searchlist + ")";
qDebug( "query: %s", qu.latin1() );
OSQLRawQuery raw( qu );
OSQLResult res = m_driver->query( &raw );