summaryrefslogtreecommitdiff
authorbrad <brad>2004-04-05 19:24:04 (UTC)
committer brad <brad>2004-04-05 19:24:04 (UTC)
commitcb3097d5249b6bd576d0212394ab57e885f9e9da (patch) (unidiff)
treef4a25035e43804507bb69d30da5b735082a1e0df
parent35c73e46c62f60596037c85a5545e13e4488b81f (diff)
downloadopie-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.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiedb/osqlitedriver.cpp35
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
@@ -1,193 +1,200 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3 3
4 =. 4 =.
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under 8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software 10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License, 11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that 14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more 19..}^=.=       =       ; Library General Public License for more
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
45using namespace Opie::DB; 47using namespace Opie::DB;
46using namespace Opie::DB::Internal; 48using namespace Opie::DB::Internal;
47 49
48namespace { 50namespace {
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
57OSQLiteDriver::OSQLiteDriver( QLibrary *lib ) 59OSQLiteDriver::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
64OSQLiteDriver::~OSQLiteDriver() { 66OSQLiteDriver::~OSQLiteDriver() {
65 close(); 67 close();
66} 68}
67 69
68 70
69QString OSQLiteDriver::id()const { 71QString OSQLiteDriver::id()const {
70 return QString::fromLatin1("SQLite"); 72 return QString::fromLatin1("SQLite");
71} 73}
72 74
73void OSQLiteDriver::setUserName( const QString& ) {} 75void OSQLiteDriver::setUserName( const QString& ) {}
74 76
75 77
76void OSQLiteDriver::setPassword( const QString& ) {} 78void OSQLiteDriver::setPassword( const QString& ) {}
77 79
78 80
79void OSQLiteDriver::setUrl( const QString& url ) { 81void OSQLiteDriver::setUrl( const QString& url ) {
80 m_url = url; 82 m_url = url;
81} 83}
82 84
83 85
84void OSQLiteDriver::setOptions( const QStringList& ) { 86void 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 */
90int sqliteRlikeCompare(const char *zPattern, const char *zString){ 92int 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(&regex_c);
97 res = regcomp(&regex, 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(&regex_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(&regex, zString, 0, NULL, 0)==0); 109 res = (regexec(&regex_c, zString, 0, NULL, 0)==0);
104 regfree(&regex);
105 return res; 110 return res;
106} 111}
107 112
108void rlikeFunc(sqlite_func *context, int arg, const char **argv){ 113void 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 */
119bool OSQLiteDriver::open() { 124bool 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 */
142bool OSQLiteDriver::close() { 147bool 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(&regex_c);
146 return true; 153 return true;
147} 154}
148 155
149 156
150/* Query */ 157/* Query */
151OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { 158OSQLResult 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 );
170 return result; 177 return result;
171} 178}
172 179
173 180
174OSQLTable::ValueList OSQLiteDriver::tables() const { 181OSQLTable::ValueList OSQLiteDriver::tables() const {
175 182
176} 183}
177 184
178 185
179OSQLError OSQLiteDriver::lastError() { 186OSQLError OSQLiteDriver::lastError() {
180 OSQLError error; 187 OSQLError error;
181 return error; 188 return error;
182}; 189};
183 190
184 191
185/* handle a callback add the row to the global 192/* handle a callback add the row to the global
186 * OSQLResultItem 193 * OSQLResultItem
187 */ 194 */
188int OSQLiteDriver::handleCallBack( int, char**, char** ) { 195int OSQLiteDriver::handleCallBack( int, char**, char** ) {
189 return 0; 196 return 0;
190} 197}
191 198
192 199
193/* callback_handler add the values to the list*/ 200/* callback_handler add the values to the list*/