summaryrefslogtreecommitdiff
authorbrad <brad>2004-04-05 10:58:32 (UTC)
committer brad <brad>2004-04-05 10:58:32 (UTC)
commit0b481957a2eebf28b05d9803780d05ad4232aa00 (patch) (side-by-side diff)
tree85b6b3123f8bbb86a79806ab07d9189c041730ce
parent900fb3d498891d9aca81c362b2ea3460d1dc3f59 (diff)
downloadopie-0b481957a2eebf28b05d9803780d05ad4232aa00.zip
opie-0b481957a2eebf28b05d9803780d05ad4232aa00.tar.gz
opie-0b481957a2eebf28b05d9803780d05ad4232aa00.tar.bz2
Regex support for sqlite (finally)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiedb/osqlitedriver.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp
index 2c53248..eea1093 100644
--- a/libopie2/opiedb/osqlitedriver.cpp
+++ b/libopie2/opiedb/osqlitedriver.cpp
@@ -35,4 +35,6 @@
#include <stdlib.h>
+#include <regex.h>
+#include <stdio.h>
// fromLocal8Bit() does not work as expected. Thus it
@@ -83,4 +85,31 @@ 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(&regex, zPattern, REG_EXTENDED);
+ if ( res != 0 ) {
+ printf("Regcomp failed with code %u on string %s\n",res,zPattern);
+
+ return 0;
+ }
+ res = (regexec(&regex, zString, 0, NULL, 0)==0);
+ regfree(&regex);
+ 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,
+ sqliteRlikeCompare((const char*)argv[0],
+ (const char*)argv[1]));
+}
/*
@@ -102,4 +131,5 @@ bool OSQLiteDriver::open() {
return false;
}
+ sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,NULL);
return true;
}