-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 | |||
@@ -32,24 +32,26 @@ | |||
32 | #include "osqlitedriver.h" | 32 | #include "osqlitedriver.h" |
33 | 33 | ||
34 | #include <opie2/odebug.h> | 34 | #include <opie2/odebug.h> |
35 | 35 | ||
36 | #include <stdlib.h> | 36 | #include <stdlib.h> |
37 | #include <regex.h> | 37 | #include <regex.h> |
38 | #include <stdio.h> | 38 | #include <stdio.h> |
39 | 39 | ||
40 | // fromLocal8Bit() does not work as expected. Thus it | 40 | // fromLocal8Bit() does not work as expected. Thus it |
41 | // is replaced by fromLatin1() (eilers) | 41 | // is replaced by fromLatin1() (eilers) |
42 | #define __BUGGY_LOCAL8BIT_ | 42 | #define __BUGGY_LOCAL8BIT_ |
43 | 43 | ||
44 | char *regex_raw; | ||
45 | regex_t regex_c; | ||
44 | 46 | ||
45 | using namespace Opie::DB; | 47 | using namespace Opie::DB; |
46 | using namespace Opie::DB::Internal; | 48 | using namespace Opie::DB::Internal; |
47 | 49 | ||
48 | namespace { | 50 | namespace { |
49 | struct Query { | 51 | struct Query { |
50 | OSQLError::ValueList errors; | 52 | OSQLError::ValueList errors; |
51 | OSQLResultItem::ValueList items; | 53 | OSQLResultItem::ValueList items; |
52 | OSQLiteDriver *driver; | 54 | OSQLiteDriver *driver; |
53 | }; | 55 | }; |
54 | } | 56 | } |
55 | 57 | ||
@@ -75,42 +77,45 @@ void OSQLiteDriver::setUserName( const QString& ) {} | |||
75 | 77 | ||
76 | void OSQLiteDriver::setPassword( const QString& ) {} | 78 | void OSQLiteDriver::setPassword( const QString& ) {} |
77 | 79 | ||
78 | 80 | ||
79 | void OSQLiteDriver::setUrl( const QString& url ) { | 81 | void OSQLiteDriver::setUrl( const QString& url ) { |
80 | m_url = url; | 82 | m_url = url; |
81 | } | 83 | } |
82 | 84 | ||
83 | 85 | ||
84 | void OSQLiteDriver::setOptions( const QStringList& ) { | 86 | void OSQLiteDriver::setOptions( const QStringList& ) { |
85 | } | 87 | } |
86 | 88 | ||
87 | /*------------------------------------------------------------------/* | 89 | /* |
88 | * Functions to patch a regex search into sqlite | 90 | * Functions to patch a regex search into sqlite |
89 | * -----------------------------------------------------------------*/ | 91 | */ |
90 | int sqliteRlikeCompare(const char *zPattern, const char *zString){ | 92 | int sqliteRlikeCompare(const char *zPattern, const char *zString){ |
91 | regex_t regex; | ||
92 | int res; | 93 | int res; |
93 | if ( zPattern==NULL || zString==NULL ) { | 94 | if (regex_raw == NULL || (strcmp (zPattern, regex_raw) != 0)){ |
94 | printf("One of the args was null!\n"); | 95 | if (regex_raw != NULL) { |
95 | return 0; | 96 | free(regex_raw); |
96 | } | 97 | regfree(®ex_c); |
97 | res = regcomp(®ex, zPattern, REG_EXTENDED); | 98 | } |
98 | if ( res != 0 ) { | 99 | regex_raw = (char *)malloc(strlen(zPattern)+1); |
99 | printf("Regcomp failed with code %u on string %s\n",res,zPattern); | 100 | strncpy(regex_raw, zPattern, strlen(zPattern)+1); |
100 | 101 | res = regcomp(®ex_c, zPattern, REG_EXTENDED); | |
102 | if ( res != 0 ) { | ||
103 | printf("Regcomp failed with code %u on string %s\n",res,zPattern); | ||
104 | free(regex_raw); | ||
105 | regex_raw=NULL; | ||
101 | return 0; | 106 | return 0; |
107 | } | ||
102 | } | 108 | } |
103 | res = (regexec(®ex, zString, 0, NULL, 0)==0); | 109 | res = (regexec(®ex_c, zString, 0, NULL, 0)==0); |
104 | regfree(®ex); | ||
105 | return res; | 110 | return res; |
106 | } | 111 | } |
107 | 112 | ||
108 | void rlikeFunc(sqlite_func *context, int arg, const char **argv){ | 113 | void rlikeFunc(sqlite_func *context, int arg, const char **argv){ |
109 | if( argv[0]==0 || argv[1]==0 ) return; | 114 | if( argv[0]==0 || argv[1]==0 ) return; |
110 | sqlite_set_result_int(context, | 115 | sqlite_set_result_int(context, |
111 | sqliteRlikeCompare((const char*)argv[0], | 116 | sqliteRlikeCompare((const char*)argv[0], |
112 | (const char*)argv[1])); | 117 | (const char*)argv[1])); |
113 | } | 118 | } |
114 | 119 | ||
115 | /* | 120 | /* |
116 | * try to open a db specified via setUrl | 121 | * try to open a db specified via setUrl |
@@ -133,25 +138,27 @@ bool OSQLiteDriver::open() { | |||
133 | sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,NULL); | 138 | sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,NULL); |
134 | return true; | 139 | return true; |
135 | } | 140 | } |
136 | 141 | ||
137 | 142 | ||
138 | /* close the db | 143 | /* close the db |
139 | * sqlite closes them without | 144 | * sqlite closes them without |
140 | * telling failure or success | 145 | * telling failure or success |
141 | */ | 146 | */ |
142 | bool OSQLiteDriver::close() { | 147 | bool OSQLiteDriver::close() { |
143 | if (m_sqlite ) | 148 | if (m_sqlite ) |
144 | sqlite_close( m_sqlite ), m_sqlite=0l; | 149 | sqlite_close( m_sqlite ), m_sqlite=0l; |
145 | 150 | free(regex_raw); | |
151 | regex_raw=NULL; | ||
152 | regfree(®ex_c); | ||
146 | return true; | 153 | return true; |
147 | } | 154 | } |
148 | 155 | ||
149 | 156 | ||
150 | /* Query */ | 157 | /* Query */ |
151 | OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { | 158 | OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { |
152 | if ( !m_sqlite ) { | 159 | if ( !m_sqlite ) { |
153 | // FIXME set error code | 160 | // FIXME set error code |
154 | OSQLResult result( OSQLResult::Failure ); | 161 | OSQLResult result( OSQLResult::Failure ); |
155 | return result; | 162 | return result; |
156 | } | 163 | } |
157 | Query query; | 164 | Query query; |