summaryrefslogtreecommitdiff
path: root/libopie2/opiedb/osqlitedriver.cpp
authorbrad <brad>2004-04-11 12:43:55 (UTC)
committer brad <brad>2004-04-11 12:43:55 (UTC)
commit9716f8c5672a8596306a9b432d9fabc4361baea5 (patch) (unidiff)
tree2b4f23f7e1291ff9f3ff7788068918e31ed63bef /libopie2/opiedb/osqlitedriver.cpp
parent40c0415fe7afeeb03de7441e2f667495e81edfa7 (diff)
downloadopie-9716f8c5672a8596306a9b432d9fabc4361baea5.zip
opie-9716f8c5672a8596306a9b432d9fabc4361baea5.tar.gz
opie-9716f8c5672a8596306a9b432d9fabc4361baea5.tar.bz2
Fixes for sqlite regex driver. Function must be implemented as
rlike("pattern","match") instead of "where uid rlike("99")" you must use "where rlike("99",uid). My mistake. Also fixes for pointer math for context regex caching.
Diffstat (limited to 'libopie2/opiedb/osqlitedriver.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiedb/osqlitedriver.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp
index ccac2f8..588fc8f 100644
--- a/libopie2/opiedb/osqlitedriver.cpp
+++ b/libopie2/opiedb/osqlitedriver.cpp
@@ -87,9 +87,8 @@ void OSQLiteDriver::setOptions( const QStringList& ) {
87 * Functions to patch a regex search into sqlite 87 * Functions to patch a regex search into sqlite
88 */ 88 */
89int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){ 89int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){
90 int res; 90 int res;
91
92 if (reg->regex_raw == NULL || (strcmp (zPattern, reg->regex_raw) != 0)){ 91 if (reg->regex_raw == NULL || (strcmp (zPattern, reg->regex_raw) != 0)){
93 if (reg->regex_raw != NULL) { 92 if (reg->regex_raw != NULL) {
94 free(reg->regex_raw); 93 free(reg->regex_raw);
95 regfree(&reg->regex_c); 94 regfree(&reg->regex_c);
@@ -108,24 +107,25 @@ int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){
108 return res; 107 return res;
109} 108}
110 109
111void rlikeFunc(sqlite_func *context, int arg, const char **argv){ 110void rlikeFunc(sqlite_func *context, int arg, const char **argv){
112 if( argv[0]==0 || argv[1]==0 || argv[2]==0){ 111 if( argv[0]==0 || argv[1]==0 ){
113 printf("One of arguments Null!!\n"); 112 printf("One of arguments Null!!\n");
114 return; 113 return;
115 } 114 }
116 sqlite_set_result_int(context, 115 sqlite_set_result_int(context,
117 sqliteRlikeCompare((const char*)argv[0], 116 sqliteRlikeCompare((const char*)argv[0],
118 (const char*)argv[1], (sqregex*)argv[2])); 117 (const char*)argv[1], (sqregex *)sqlite_user_data(context) ));
119} 118}
120 119
121/* 120/*
122 * try to open a db specified via setUrl 121 * try to open a db specified via setUrl
123 * and options 122 * and options
124 */ 123 */
125bool OSQLiteDriver::open() { 124bool OSQLiteDriver::open() {
126 char *error; 125 char *error;
127 qDebug("OSQLiteDriver::open: about to open"); 126
127 qDebug("OSQLiteDriver::open: about to open");
128 m_sqlite = sqlite_open(m_url.local8Bit(), 128 m_sqlite = sqlite_open(m_url.local8Bit(),
129 0, 129 0,
130 &error ); 130 &error );
131 131
@@ -135,9 +135,13 @@ bool OSQLiteDriver::open() {
135 qWarning("OSQLiteDriver::open: %s", error ); 135 qWarning("OSQLiteDriver::open: %s", error );
136 free( error ); 136 free( error );
137 return false; 137 return false;
138 } 138 }
139 sqlite_create_function(m_sqlite,"rlike",3,rlikeFunc,&sqreg); 139 if (sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,&sqreg) != 0)
140 odebug << "Unable to create user defined function!" << oendl;
141 if (sqlite_function_type(m_sqlite,"rlike",SQLITE_NUMERIC) != 0)
142 odebug << "Unable to set rlike function result type!" << oendl;
143 sqreg.regex_raw = NULL;
140 return true; 144 return true;
141} 145}
142 146
143 147
@@ -148,9 +152,10 @@ bool OSQLiteDriver::open() {
148bool OSQLiteDriver::close() { 152bool OSQLiteDriver::close() {
149 if (m_sqlite ) 153 if (m_sqlite )
150 sqlite_close( m_sqlite ), m_sqlite=0l; 154 sqlite_close( m_sqlite ), m_sqlite=0l;
151 if (sqreg.regex_raw != NULL){ 155 if (sqreg.regex_raw != NULL){
152 free(sqreg.regex_raw); 156 odebug << "Freeing regex on close" << oendl;
157 free(sqreg.regex_raw);
153 sqreg.regex_raw=NULL; 158 sqreg.regex_raw=NULL;
154 regfree(&sqreg.regex_c); 159 regfree(&sqreg.regex_c);
155 } 160 }
156 return true; 161 return true;
@@ -168,9 +173,9 @@ OSQLResult OSQLiteDriver::query( OSQLQuery* qu) {
168 query.driver = this; 173 query.driver = this;
169 char *err; 174 char *err;
170 /* SQLITE_OK 0 if return code > 0 == failure */ 175 /* SQLITE_OK 0 if return code > 0 == failure */
171 if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) { 176 if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) {
172 qWarning("OSQLiteDriver::query: Error while executing"); 177 qWarning("OSQLiteDriver::query: Error while executing %s",err);
173 free(err ); 178 free(err );
174 // FixMe Errors 179 // FixMe Errors
175 } 180 }
176 181