summaryrefslogtreecommitdiff
path: root/libopie2
authorbrad <brad>2004-04-06 10:38:36 (UTC)
committer brad <brad>2004-04-06 10:38:36 (UTC)
commit4738d39e8168e24cbaae8a7ea3c71f00552d5dac (patch) (unidiff)
tree3404a879fb4275d899af2939bfb54f751e3cacfe /libopie2
parent8981e35697647315d88cdf95e912b0fe2f9d5375 (diff)
downloadopie-4738d39e8168e24cbaae8a7ea3c71f00552d5dac.zip
opie-4738d39e8168e24cbaae8a7ea3c71f00552d5dac.tar.gz
opie-4738d39e8168e24cbaae8a7ea3c71f00552d5dac.tar.bz2
Made sqlite regex cache "instance safe". Further work will continue as I figure out
how to do it :p)
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiedb/osqlitedriver.cpp44
-rw-r--r--libopie2/opiedb/osqlitedriver.h8
2 files changed, 32 insertions, 20 deletions
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp
index 4eda9b9..f07d520 100644
--- a/libopie2/opiedb/osqlitedriver.cpp
+++ b/libopie2/opiedb/osqlitedriver.cpp
@@ -43,5 +43,2 @@
43 43
44 char *regex_raw;
45 regex_t regex_c;
46
47using namespace Opie::DB; 44using namespace Opie::DB;
@@ -91,16 +88,17 @@ void OSQLiteDriver::setOptions( const QStringList& ) {
91 */ 88 */
92int sqliteRlikeCompare(const char *zPattern, const char *zString){ 89int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){
93 int res; 90 int res;
94 if (regex_raw == NULL || (strcmp (zPattern, regex_raw) != 0)){ 91
95 if (regex_raw != NULL) { 92 if (reg->regex_raw == NULL || (strcmp (zPattern, reg->regex_raw) != 0)){
96 free(regex_raw); 93 if (reg->regex_raw != NULL) {
97 regfree(&regex_c); 94 free(reg->regex_raw);
95 regfree(&reg->regex_c);
98 } 96 }
99 regex_raw = (char *)malloc(strlen(zPattern)+1); 97 reg->regex_raw = (char *)malloc(strlen(zPattern)+1);
100 strncpy(regex_raw, zPattern, strlen(zPattern)+1); 98 strncpy(reg->regex_raw, zPattern, strlen(zPattern)+1);
101 res = regcomp(&regex_c, zPattern, REG_EXTENDED); 99 res = regcomp(&reg->regex_c, zPattern, REG_EXTENDED);
102 if ( res != 0 ) { 100 if ( res != 0 ) {
103 printf("Regcomp failed with code %u on string %s\n",res,zPattern); 101 printf("Regcomp failed with code %u on string %s\n",res,zPattern);
104 free(regex_raw); 102 free(reg->regex_raw);
105 regex_raw=NULL; 103 reg->regex_raw=NULL;
106 return 0; 104 return 0;
@@ -108,3 +106,3 @@ int sqliteRlikeCompare(const char *zPattern, const char *zString){
108 } 106 }
109 res = (regexec(&regex_c, zString, 0, NULL, 0)==0); 107 res = (regexec(&reg->regex_c, zString, 0, NULL, 0)==0);
110 return res; 108 return res;
@@ -113,6 +111,9 @@ int sqliteRlikeCompare(const char *zPattern, const char *zString){
113void rlikeFunc(sqlite_func *context, int arg, const char **argv){ 111void rlikeFunc(sqlite_func *context, int arg, const char **argv){
114 if( argv[0]==0 || argv[1]==0 ) return; 112 if( argv[0]==0 || argv[1]==0 || argv[2]==0){
113 printf("One of arguments Null!!\n");
114 return;
115 }
115 sqlite_set_result_int(context, 116 sqlite_set_result_int(context,
116 sqliteRlikeCompare((const char*)argv[0], 117 sqliteRlikeCompare((const char*)argv[0],
117 (const char*)argv[1])); 118 (const char*)argv[1], (sqregex*)argv[2]));
118} 119}
@@ -137,3 +138,4 @@ bool OSQLiteDriver::open() {
137 } 138 }
138 sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,NULL); 139 sqreg = (sqregex *)malloc(sizeof(sqreg));
140 sqlite_create_function(m_sqlite,"rlike",3,rlikeFunc,&sqreg);
139 return true; 141 return true;
@@ -149,5 +151,7 @@ bool OSQLiteDriver::close() {
149 sqlite_close( m_sqlite ), m_sqlite=0l; 151 sqlite_close( m_sqlite ), m_sqlite=0l;
150 free(regex_raw); 152 if (sqreg->regex_raw != NULL){
151 regex_raw=NULL; 153 free(sqreg->regex_raw);
152 regfree(&regex_c); 154 sqreg->regex_raw=NULL;
155 regfree(&sqreg->regex_c);
156 }
153 return true; 157 return true;
diff --git a/libopie2/opiedb/osqlitedriver.h b/libopie2/opiedb/osqlitedriver.h
index 9064e52..95c9e2f 100644
--- a/libopie2/opiedb/osqlitedriver.h
+++ b/libopie2/opiedb/osqlitedriver.h
@@ -4,2 +4,3 @@
4#include <sqlite.h> 4#include <sqlite.h>
5#include <regex.h>
5 6
@@ -13,2 +14,7 @@ namespace Internal {
13 14
15struct sqregex {
16 char *regex_raw;
17 regex_t regex_c;
18};
19
14class OSQLiteDriver : public OSQLDriver { 20class OSQLiteDriver : public OSQLDriver {
@@ -28,2 +34,3 @@ public:
28 OSQLTable::ValueList tables()const; 34 OSQLTable::ValueList tables()const;
35
29private: 36private:
@@ -36,2 +43,3 @@ private:
36 sqlite *m_sqlite; 43 sqlite *m_sqlite;
44 sqregex *sqreg;
37}; 45};