summaryrefslogtreecommitdiff
path: root/libopie2
authorbrad <brad>2004-04-05 19:24:04 (UTC)
committer brad <brad>2004-04-05 19:24:04 (UTC)
commitcb3097d5249b6bd576d0212394ab57e885f9e9da (patch) (unidiff)
treef4a25035e43804507bb69d30da5b735082a1e0df /libopie2
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 (limited to 'libopie2') (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
@@ -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
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 );