author | brad <brad> | 2004-04-05 19:24:04 (UTC) |
---|---|---|
committer | brad <brad> | 2004-04-05 19:24:04 (UTC) |
commit | cb3097d5249b6bd576d0212394ab57e885f9e9da (patch) (unidiff) | |
tree | f4a25035e43804507bb69d30da5b735082a1e0df /libopie2 | |
parent | 35c73e46c62f60596037c85a5545e13e4488b81f (diff) | |
download | opie-cb3097d5249b6bd576d0212394ab57e885f9e9da.zip opie-cb3097d5249b6bd576d0212394ab57e885f9e9da.tar.gz opie-cb3097d5249b6bd576d0212394ab57e885f9e9da.tar.bz2 |
*Basic* regex caching for massive search speedup (and I mean lots)
Yes, it's ugly. Yes, it's simple. Yes it probably breaks several fundamental coding rules.
Yes, I'm open to suggestions as to how to do it better and more in the Opie way.
-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 | |||
@@ -20,150 +20,157 @@ | |||
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | 28 | ||
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include "osqlquery.h" | 31 | #include "osqlquery.h" |
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 | ||
56 | 58 | ||
57 | OSQLiteDriver::OSQLiteDriver( QLibrary *lib ) | 59 | OSQLiteDriver::OSQLiteDriver( QLibrary *lib ) |
58 | : OSQLDriver( lib ) | 60 | : OSQLDriver( lib ) |
59 | { | 61 | { |
60 | m_sqlite = 0l; | 62 | m_sqlite = 0l; |
61 | } | 63 | } |
62 | 64 | ||
63 | 65 | ||
64 | OSQLiteDriver::~OSQLiteDriver() { | 66 | OSQLiteDriver::~OSQLiteDriver() { |
65 | close(); | 67 | close(); |
66 | } | 68 | } |
67 | 69 | ||
68 | 70 | ||
69 | QString OSQLiteDriver::id()const { | 71 | QString OSQLiteDriver::id()const { |
70 | return QString::fromLatin1("SQLite"); | 72 | return QString::fromLatin1("SQLite"); |
71 | } | 73 | } |
72 | 74 | ||
73 | void OSQLiteDriver::setUserName( const QString& ) {} | 75 | void OSQLiteDriver::setUserName( const QString& ) {} |
74 | 76 | ||
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 |
117 | * and options | 122 | * and options |
118 | */ | 123 | */ |
119 | bool OSQLiteDriver::open() { | 124 | bool OSQLiteDriver::open() { |
120 | char *error; | 125 | char *error; |
121 | qDebug("OSQLiteDriver::open: about to open"); | 126 | qDebug("OSQLiteDriver::open: about to open"); |
122 | m_sqlite = sqlite_open(m_url.local8Bit(), | 127 | m_sqlite = sqlite_open(m_url.local8Bit(), |
123 | 0, | 128 | 0, |
124 | &error ); | 129 | &error ); |
125 | 130 | ||
126 | /* failed to open */ | 131 | /* failed to open */ |
127 | if (m_sqlite == 0l ) { | 132 | if (m_sqlite == 0l ) { |
128 | // FIXME set the last error | 133 | // FIXME set the last error |
129 | qWarning("OSQLiteDriver::open: %s", error ); | 134 | qWarning("OSQLiteDriver::open: %s", error ); |
130 | free( error ); | 135 | free( error ); |
131 | return false; | 136 | return false; |
132 | } | 137 | } |
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; |
158 | query.driver = this; | 165 | query.driver = this; |
159 | char *err; | 166 | char *err; |
160 | /* SQLITE_OK 0 if return code > 0 == failure */ | 167 | /* SQLITE_OK 0 if return code > 0 == failure */ |
161 | if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) { | 168 | if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) { |
162 | qWarning("OSQLiteDriver::query: Error while executing"); | 169 | qWarning("OSQLiteDriver::query: Error while executing"); |
163 | free(err ); | 170 | free(err ); |
164 | // FixMe Errors | 171 | // FixMe Errors |
165 | } | 172 | } |
166 | 173 | ||
167 | OSQLResult result(OSQLResult::Success, | 174 | OSQLResult result(OSQLResult::Success, |
168 | query.items, | 175 | query.items, |
169 | query.errors ); | 176 | query.errors ); |