summaryrefslogtreecommitdiff
path: root/libopie2
Side-by-side diff
Diffstat (limited to 'libopie2') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiedb/osqlitedriver.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp
index 2c53248..eea1093 100644
--- a/libopie2/opiedb/osqlitedriver.cpp
+++ b/libopie2/opiedb/osqlitedriver.cpp
@@ -21,32 +21,34 @@
 :     =  ...= . :.=-
 -.   .:....=;==+<; You should have received a copy of the GNU
  -_. . .   )=.  = Library General Public License along with
    --        :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "osqlquery.h"
#include "osqlitedriver.h"
#include <opie2/odebug.h>
#include <stdlib.h>
+#include <regex.h>
+#include <stdio.h>
// fromLocal8Bit() does not work as expected. Thus it
// is replaced by fromLatin1() (eilers)
#define __BUGGY_LOCAL8BIT_
using namespace Opie::DB;
using namespace Opie::DB::Internal;
namespace {
struct Query {
OSQLError::ValueList errors;
OSQLResultItem::ValueList items;
OSQLiteDriver *driver;
};
}
@@ -69,51 +71,79 @@ QString OSQLiteDriver::id()const {
}
void OSQLiteDriver::setUserName( const QString& ) {}
void OSQLiteDriver::setPassword( const QString& ) {}
void OSQLiteDriver::setUrl( const QString& url ) {
m_url = url;
}
void OSQLiteDriver::setOptions( const QStringList& ) {
}
+/*------------------------------------------------------------------/*
+ * Functions to patch a regex search into sqlite
+ * -----------------------------------------------------------------*/
+int sqliteRlikeCompare(const char *zPattern, const char *zString){
+ regex_t regex;
+ int res;
+ if ( zPattern==NULL || zString==NULL ) {
+ printf("One of the args was null!\n");
+ return 0;
+ }
+ res = regcomp(&regex, zPattern, REG_EXTENDED);
+ if ( res != 0 ) {
+ printf("Regcomp failed with code %u on string %s\n",res,zPattern);
+
+ return 0;
+ }
+ res = (regexec(&regex, zString, 0, NULL, 0)==0);
+ regfree(&regex);
+ return res;
+}
+
+void rlikeFunc(sqlite_func *context, int arg, const char **argv){
+ if( argv[0]==0 || argv[1]==0 ) return;
+ sqlite_set_result_int(context,
+ sqliteRlikeCompare((const char*)argv[0],
+ (const char*)argv[1]));
+}
/*
* try to open a db specified via setUrl
* and options
*/
bool OSQLiteDriver::open() {
char *error;
qDebug("OSQLiteDriver::open: about to open");
m_sqlite = sqlite_open(m_url.local8Bit(),
0,
&error );
/* failed to open */
if (m_sqlite == 0l ) {
// FIXME set the last error
qWarning("OSQLiteDriver::open: %s", error );
free( error );
return false;
}
+ sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,NULL);
return true;
}
/* close the db
* sqlite closes them without
* telling failure or success
*/
bool OSQLiteDriver::close() {
if (m_sqlite )
sqlite_close( m_sqlite ), m_sqlite=0l;
return true;
}