summaryrefslogtreecommitdiff
path: root/libopie/pim
Unidiff
Diffstat (limited to 'libopie/pim') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/ocontactaccessbackend_sql.cpp5
-rw-r--r--libopie/pim/ocontactaccessbackend_sql.h10
-rw-r--r--libopie/pim/odatebookaccessbackend_sql.cpp4
-rw-r--r--libopie/pim/odatebookaccessbackend_sql.h7
-rw-r--r--libopie/pim/otodoaccesssql.cpp1
-rw-r--r--libopie/pim/otodoaccesssql.h13
6 files changed, 31 insertions, 9 deletions
diff --git a/libopie/pim/ocontactaccessbackend_sql.cpp b/libopie/pim/ocontactaccessbackend_sql.cpp
index a5be4c8..d20df56 100644
--- a/libopie/pim/ocontactaccessbackend_sql.cpp
+++ b/libopie/pim/ocontactaccessbackend_sql.cpp
@@ -1,252 +1,255 @@
1/* 1/*
2 * SQL Backend for the OPIE-Contact Database. 2 * SQL Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * 5 *
6 * ===================================================================== 6 * =====================================================================
7 *This program is free software; you can redistribute it and/or 7 *This program is free software; you can redistribute it and/or
8 *modify it under the terms of the GNU Library General Public 8 *modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
11 * ===================================================================== 11 * =====================================================================
12 * ===================================================================== 12 * =====================================================================
13 * Version: $Id$ 13 * Version: $Id$
14 * ===================================================================== 14 * =====================================================================
15 * History: 15 * History:
16 * $Log$ 16 * $Log$
17 * Revision 1.5 2004/03/14 13:50:35 alwin
18 * namespace correction
19 *
17 * Revision 1.4 2003/12/22 10:19:26 eilers 20 * Revision 1.4 2003/12/22 10:19:26 eilers
18 * Finishing implementation of sql-backend for datebook. But I have to 21 * Finishing implementation of sql-backend for datebook. But I have to
19 * port the PIM datebook application to use it, before I could debug the 22 * port the PIM datebook application to use it, before I could debug the
20 * whole stuff. 23 * whole stuff.
21 * Thus, PIM-Database backend is finished, but highly experimental. And some 24 * Thus, PIM-Database backend is finished, but highly experimental. And some
22 * parts are still generic. For instance, the "queryByExample()" methods are 25 * parts are still generic. For instance, the "queryByExample()" methods are
23 * not (or not fully) implemented. Todo: custom-entries not stored. 26 * not (or not fully) implemented. Todo: custom-entries not stored.
24 * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular 27 * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular
25 * expression search in the database, which is not supported by sqlite ! 28 * expression search in the database, which is not supported by sqlite !
26 * Therefore we need either an extended sqlite or a workaround which would 29 * Therefore we need either an extended sqlite or a workaround which would
27 * be very slow and memory consuming.. 30 * be very slow and memory consuming..
28 * 31 *
29 * Revision 1.3 2003/12/08 15:18:10 eilers 32 * Revision 1.3 2003/12/08 15:18:10 eilers
30 * Committing unfinished sql implementation before merging to libopie2 starts.. 33 * Committing unfinished sql implementation before merging to libopie2 starts..
31 * 34 *
32 * Revision 1.2 2003/09/29 07:44:26 eilers 35 * Revision 1.2 2003/09/29 07:44:26 eilers
33 * Improvement of PIM-SQL Databases, but search queries are still limited. 36 * Improvement of PIM-SQL Databases, but search queries are still limited.
34 * Addressbook: Changed table layout. Now, we just need 1/3 of disk-space. 37 * Addressbook: Changed table layout. Now, we just need 1/3 of disk-space.
35 * Todo: Started to add new attributes. Some type conversions missing. 38 * Todo: Started to add new attributes. Some type conversions missing.
36 * 39 *
37 * Revision 1.1 2003/09/22 14:31:16 eilers 40 * Revision 1.1 2003/09/22 14:31:16 eilers
38 * Added first experimental incarnation of sql-backend for addressbook. 41 * Added first experimental incarnation of sql-backend for addressbook.
39 * Some modifications to be able to compile the todo sql-backend. 42 * Some modifications to be able to compile the todo sql-backend.
40 * A lot of changes fill follow... 43 * A lot of changes fill follow...
41 * 44 *
42 */ 45 */
43 46
44#include "ocontactaccessbackend_sql.h" 47#include "ocontactaccessbackend_sql.h"
45 48
46#include <qarray.h> 49#include <qarray.h>
47#include <qdatetime.h> 50#include <qdatetime.h>
48#include <qstringlist.h> 51#include <qstringlist.h>
49 52
50#include <qpe/global.h> 53#include <qpe/global.h>
51#include <qpe/recordfields.h> 54#include <qpe/recordfields.h>
52 55
53#include <opie/ocontactfields.h> 56#include <opie/ocontactfields.h>
54#include <opie/oconversion.h> 57#include <opie/oconversion.h>
55#include <opie2/osqldriver.h> 58#include <opie2/osqldriver.h>
56#include <opie2/osqlresult.h> 59#include <opie2/osqlresult.h>
57#include <opie2/osqlmanager.h> 60#include <opie2/osqlmanager.h>
58#include <opie2/osqlquery.h> 61#include <opie2/osqlquery.h>
59 62
60 63using namespace Opie::DB;
61 64
62 65
63// If defined, we use a horizontal table ( uid, attr1, attr2, attr3, ..., attrn ) instead 66// If defined, we use a horizontal table ( uid, attr1, attr2, attr3, ..., attrn ) instead
64// vertical like "uid, type, value". 67// vertical like "uid, type, value".
65// DON'T DEACTIVATE THIS DEFINE IN PRODUCTIVE ENVIRONMENTS !! 68// DON'T DEACTIVATE THIS DEFINE IN PRODUCTIVE ENVIRONMENTS !!
66#define __STORE_HORIZONTAL_ 69#define __STORE_HORIZONTAL_
67 70
68// Distinct loading is not very fast. If I expect that every person has just 71// Distinct loading is not very fast. If I expect that every person has just
69// one (and always one) 'Last Name', I can request all uid's for existing lastnames, 72// one (and always one) 'Last Name', I can request all uid's for existing lastnames,
70// which is faster.. 73// which is faster..
71// But this may not be true for all entries, like company contacts.. 74// But this may not be true for all entries, like company contacts..
72// The current AddressBook application handles this problem, but other may not.. (eilers) 75// The current AddressBook application handles this problem, but other may not.. (eilers)
73#define __USE_SUPERFAST_LOADQUERY 76#define __USE_SUPERFAST_LOADQUERY
74 77
75 78
76/* 79/*
77 * Implementation of used query types 80 * Implementation of used query types
78 * CREATE query 81 * CREATE query
79 * LOAD query 82 * LOAD query
80 * INSERT 83 * INSERT
81 * REMOVE 84 * REMOVE
82 * CLEAR 85 * CLEAR
83 */ 86 */
84namespace { 87namespace {
85 /** 88 /**
86 * CreateQuery for the Todolist Table 89 * CreateQuery for the Todolist Table
87 */ 90 */
88 class CreateQuery : public OSQLQuery { 91 class CreateQuery : public OSQLQuery {
89 public: 92 public:
90 CreateQuery(); 93 CreateQuery();
91 ~CreateQuery(); 94 ~CreateQuery();
92 QString query()const; 95 QString query()const;
93 }; 96 };
94 97
95 /** 98 /**
96 * Clears (delete) a Table 99 * Clears (delete) a Table
97 */ 100 */
98 class ClearQuery : public OSQLQuery { 101 class ClearQuery : public OSQLQuery {
99 public: 102 public:
100 ClearQuery(); 103 ClearQuery();
101 ~ClearQuery(); 104 ~ClearQuery();
102 QString query()const; 105 QString query()const;
103 106
104 }; 107 };
105 108
106 109
107 /** 110 /**
108 * LoadQuery 111 * LoadQuery
109 * this one queries for all uids 112 * this one queries for all uids
110 */ 113 */
111 class LoadQuery : public OSQLQuery { 114 class LoadQuery : public OSQLQuery {
112 public: 115 public:
113 LoadQuery(); 116 LoadQuery();
114 ~LoadQuery(); 117 ~LoadQuery();
115 QString query()const; 118 QString query()const;
116 }; 119 };
117 120
118 /** 121 /**
119 * inserts/adds a OContact to the table 122 * inserts/adds a OContact to the table
120 */ 123 */
121 class InsertQuery : public OSQLQuery { 124 class InsertQuery : public OSQLQuery {
122 public: 125 public:
123 InsertQuery(const OContact& ); 126 InsertQuery(const OContact& );
124 ~InsertQuery(); 127 ~InsertQuery();
125 QString query()const; 128 QString query()const;
126 private: 129 private:
127 OContact m_contact; 130 OContact m_contact;
128 }; 131 };
129 132
130 133
131 /** 134 /**
132 * removes one from the table 135 * removes one from the table
133 */ 136 */
134 class RemoveQuery : public OSQLQuery { 137 class RemoveQuery : public OSQLQuery {
135 public: 138 public:
136 RemoveQuery(int uid ); 139 RemoveQuery(int uid );
137 ~RemoveQuery(); 140 ~RemoveQuery();
138 QString query()const; 141 QString query()const;
139 private: 142 private:
140 int m_uid; 143 int m_uid;
141 }; 144 };
142 145
143 /** 146 /**
144 * a find query for noncustom elements 147 * a find query for noncustom elements
145 */ 148 */
146 class FindQuery : public OSQLQuery { 149 class FindQuery : public OSQLQuery {
147 public: 150 public:
148 FindQuery(int uid); 151 FindQuery(int uid);
149 FindQuery(const QArray<int>& ); 152 FindQuery(const QArray<int>& );
150 ~FindQuery(); 153 ~FindQuery();
151 QString query()const; 154 QString query()const;
152 private: 155 private:
153 QString single()const; 156 QString single()const;
154 QString multi()const; 157 QString multi()const;
155 QArray<int> m_uids; 158 QArray<int> m_uids;
156 int m_uid; 159 int m_uid;
157 }; 160 };
158 161
159 /** 162 /**
160 * a find query for custom elements 163 * a find query for custom elements
161 */ 164 */
162 class FindCustomQuery : public OSQLQuery { 165 class FindCustomQuery : public OSQLQuery {
163 public: 166 public:
164 FindCustomQuery(int uid); 167 FindCustomQuery(int uid);
165 FindCustomQuery(const QArray<int>& ); 168 FindCustomQuery(const QArray<int>& );
166 ~FindCustomQuery(); 169 ~FindCustomQuery();
167 QString query()const; 170 QString query()const;
168 private: 171 private:
169 QString single()const; 172 QString single()const;
170 QString multi()const; 173 QString multi()const;
171 QArray<int> m_uids; 174 QArray<int> m_uids;
172 int m_uid; 175 int m_uid;
173 }; 176 };
174 177
175 178
176 179
177 // We using three tables to store the information: 180 // We using three tables to store the information:
178 // 1. addressbook : It contains General information about the contact (non custom) 181 // 1. addressbook : It contains General information about the contact (non custom)
179 // 2. custom_data : Not official supported entries 182 // 2. custom_data : Not official supported entries
180 // All tables are connected by the uid of the contact. 183 // All tables are connected by the uid of the contact.
181 // Maybe I should add a table for meta-information ? 184 // Maybe I should add a table for meta-information ?
182 CreateQuery::CreateQuery() : OSQLQuery() {} 185 CreateQuery::CreateQuery() : OSQLQuery() {}
183 CreateQuery::~CreateQuery() {} 186 CreateQuery::~CreateQuery() {}
184 QString CreateQuery::query()const { 187 QString CreateQuery::query()const {
185 QString qu; 188 QString qu;
186#ifdef __STORE_HORIZONTAL_ 189#ifdef __STORE_HORIZONTAL_
187 190
188 qu += "create table addressbook( uid PRIMARY KEY "; 191 qu += "create table addressbook( uid PRIMARY KEY ";
189 192
190 QStringList fieldList = OContactFields::untrfields( false ); 193 QStringList fieldList = OContactFields::untrfields( false );
191 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ 194 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
192 qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it ); 195 qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it );
193 } 196 }
194 qu += " );"; 197 qu += " );";
195 198
196 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );"; 199 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );";
197 200
198#else 201#else
199 202
200 qu += "create table addressbook( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id));"; 203 qu += "create table addressbook( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id));";
201 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );"; 204 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );";
202 // qu += "create table dates( uid PRIMARY KEY, type, day, month, year, hour, minute, second );"; 205 // qu += "create table dates( uid PRIMARY KEY, type, day, month, year, hour, minute, second );";
203 206
204#endif // __STORE_HORIZONTAL_ 207#endif // __STORE_HORIZONTAL_
205 return qu; 208 return qu;
206 } 209 }
207 210
208 ClearQuery::ClearQuery() 211 ClearQuery::ClearQuery()
209 : OSQLQuery() {} 212 : OSQLQuery() {}
210 ClearQuery::~ClearQuery() {} 213 ClearQuery::~ClearQuery() {}
211 QString ClearQuery::query()const { 214 QString ClearQuery::query()const {
212 QString qu = "drop table addressbook;"; 215 QString qu = "drop table addressbook;";
213 qu += "drop table custom_data;"; 216 qu += "drop table custom_data;";
214 // qu += "drop table dates;"; 217 // qu += "drop table dates;";
215 return qu; 218 return qu;
216 } 219 }
217 220
218 221
219 LoadQuery::LoadQuery() : OSQLQuery() {} 222 LoadQuery::LoadQuery() : OSQLQuery() {}
220 LoadQuery::~LoadQuery() {} 223 LoadQuery::~LoadQuery() {}
221 QString LoadQuery::query()const { 224 QString LoadQuery::query()const {
222 QString qu; 225 QString qu;
223#ifdef __STORE_HORIZONTAL_ 226#ifdef __STORE_HORIZONTAL_
224 qu += "select uid from addressbook"; 227 qu += "select uid from addressbook";
225#else 228#else
226# ifndef __USE_SUPERFAST_LOADQUERY 229# ifndef __USE_SUPERFAST_LOADQUERY
227 qu += "select distinct uid from addressbook"; 230 qu += "select distinct uid from addressbook";
228# else 231# else
229 qu += "select uid from addressbook where type = 'Last Name'"; 232 qu += "select uid from addressbook where type = 'Last Name'";
230# endif // __USE_SUPERFAST_LOADQUERY 233# endif // __USE_SUPERFAST_LOADQUERY
231#endif // __STORE_HORIZONTAL_ 234#endif // __STORE_HORIZONTAL_
232 235
233 return qu; 236 return qu;
234 } 237 }
235 238
236 239
237 InsertQuery::InsertQuery( const OContact& contact ) 240 InsertQuery::InsertQuery( const OContact& contact )
238 : OSQLQuery(), m_contact( contact ) { 241 : OSQLQuery(), m_contact( contact ) {
239 } 242 }
240 243
241 InsertQuery::~InsertQuery() { 244 InsertQuery::~InsertQuery() {
242 } 245 }
243 246
244 /* 247 /*
245 * converts from a OContact to a query 248 * converts from a OContact to a query
246 */ 249 */
247 QString InsertQuery::query()const{ 250 QString InsertQuery::query()const{
248 251
249#ifdef __STORE_HORIZONTAL_ 252#ifdef __STORE_HORIZONTAL_
250 QString qu; 253 QString qu;
251 qu += "insert into addressbook VALUES( " + 254 qu += "insert into addressbook VALUES( " +
252 QString::number( m_contact.uid() ); 255 QString::number( m_contact.uid() );
diff --git a/libopie/pim/ocontactaccessbackend_sql.h b/libopie/pim/ocontactaccessbackend_sql.h
index b8f1d8d..f553760 100644
--- a/libopie/pim/ocontactaccessbackend_sql.h
+++ b/libopie/pim/ocontactaccessbackend_sql.h
@@ -1,101 +1,107 @@
1/* 1/*
2 * SQL Backend for the OPIE-Contact Database. 2 * SQL Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * 5 *
6 * ===================================================================== 6 * =====================================================================
7 *This program is free software; you can redistribute it and/or 7 *This program is free software; you can redistribute it and/or
8 *modify it under the terms of the GNU Library General Public 8 *modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
11 * ===================================================================== 11 * =====================================================================
12 * 12 *
13 * 13 *
14 * ===================================================================== 14 * =====================================================================
15 * Version: $Id$ 15 * Version: $Id$
16 * ===================================================================== 16 * =====================================================================
17 * History: 17 * History:
18 * $Log$ 18 * $Log$
19 * Revision 1.3 2004/03/14 13:50:35 alwin
20 * namespace correction
21 *
19 * Revision 1.2 2003/12/08 15:18:11 eilers 22 * Revision 1.2 2003/12/08 15:18:11 eilers
20 * Committing unfinished sql implementation before merging to libopie2 starts.. 23 * Committing unfinished sql implementation before merging to libopie2 starts..
21 * 24 *
22 * Revision 1.1 2003/09/22 14:31:16 eilers 25 * Revision 1.1 2003/09/22 14:31:16 eilers
23 * Added first experimental incarnation of sql-backend for addressbook. 26 * Added first experimental incarnation of sql-backend for addressbook.
24 * Some modifications to be able to compile the todo sql-backend. 27 * Some modifications to be able to compile the todo sql-backend.
25 * A lot of changes fill follow... 28 * A lot of changes fill follow...
26 * 29 *
27 * 30 *
28 */ 31 */
29 32
30#ifndef _OContactAccessBackend_SQL_ 33#ifndef _OContactAccessBackend_SQL_
31#define _OContactAccessBackend_SQL_ 34#define _OContactAccessBackend_SQL_
32 35
33#include "ocontactaccessbackend.h" 36#include "ocontactaccessbackend.h"
34#include "ocontactaccess.h" 37#include "ocontactaccess.h"
35 38
36#include <qlist.h> 39#include <qlist.h>
37#include <qdict.h> 40#include <qdict.h>
38 41
42namespace Opie { namespace DB {
39class OSQLDriver; 43class OSQLDriver;
40class OSQLResult; 44class OSQLResult;
41class OSQLResultItem; 45class OSQLResultItem;
42 46
47}}
48
43/* the default xml implementation */ 49/* the default xml implementation */
44/** 50/**
45 * This class is the SQL implementation of a Contact backend 51 * This class is the SQL implementation of a Contact backend
46 * it does implement everything available for OContact. 52 * it does implement everything available for OContact.
47 * @see OPimAccessBackend for more information of available methods 53 * @see OPimAccessBackend for more information of available methods
48 */ 54 */
49class OContactAccessBackend_SQL : public OContactAccessBackend { 55class OContactAccessBackend_SQL : public OContactAccessBackend {
50 public: 56 public:
51 OContactAccessBackend_SQL ( const QString& appname, const QString& filename = QString::null ); 57 OContactAccessBackend_SQL ( const QString& appname, const QString& filename = QString::null );
52 58
53 ~OContactAccessBackend_SQL (); 59 ~OContactAccessBackend_SQL ();
54 60
55 bool save(); 61 bool save();
56 62
57 bool load (); 63 bool load ();
58 64
59 void clear (); 65 void clear ();
60 66
61 bool wasChangedExternally(); 67 bool wasChangedExternally();
62 68
63 QArray<int> allRecords() const; 69 QArray<int> allRecords() const;
64 70
65 OContact find ( int uid ) const; 71 OContact find ( int uid ) const;
66 // FIXME: Add lookahead-cache support ! 72 // FIXME: Add lookahead-cache support !
67 //OContact find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const; 73 //OContact find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const;
68 74
69 QArray<int> queryByExample ( const OContact &query, int settings, 75 QArray<int> queryByExample ( const OContact &query, int settings,
70 const QDateTime& d ); 76 const QDateTime& d );
71 77
72 QArray<int> matchRegexp( const QRegExp &r ) const; 78 QArray<int> matchRegexp( const QRegExp &r ) const;
73 79
74 const uint querySettings(); 80 const uint querySettings();
75 81
76 bool hasQuerySettings (uint querySettings) const; 82 bool hasQuerySettings (uint querySettings) const;
77 83
78 // Currently only asc implemented.. 84 // Currently only asc implemented..
79 QArray<int> sorted( bool asc, int , int , int ); 85 QArray<int> sorted( bool asc, int , int , int );
80 bool add ( const OContact &newcontact ); 86 bool add ( const OContact &newcontact );
81 87
82 bool replace ( const OContact &contact ); 88 bool replace ( const OContact &contact );
83 89
84 bool remove ( int uid ); 90 bool remove ( int uid );
85 bool reload(); 91 bool reload();
86 92
87 private: 93 private:
88 QArray<int> extractUids( OSQLResult& res ) const; 94 QArray<int> extractUids( Opie::DB::OSQLResult& res ) const;
89 QMap<int, QString> requestNonCustom( int uid ) const; 95 QMap<int, QString> requestNonCustom( int uid ) const;
90 QMap<QString, QString> requestCustom( int uid ) const; 96 QMap<QString, QString> requestCustom( int uid ) const;
91 void update(); 97 void update();
92 98
93 protected: 99 protected:
94 bool m_changed; 100 bool m_changed;
95 QString m_fileName; 101 QString m_fileName;
96 QArray<int> m_uids; 102 QArray<int> m_uids;
97 103
98 OSQLDriver* m_driver; 104 Opie::DB::OSQLDriver* m_driver;
99}; 105};
100 106
101#endif 107#endif
diff --git a/libopie/pim/odatebookaccessbackend_sql.cpp b/libopie/pim/odatebookaccessbackend_sql.cpp
index 756f405..44dd2bc 100644
--- a/libopie/pim/odatebookaccessbackend_sql.cpp
+++ b/libopie/pim/odatebookaccessbackend_sql.cpp
@@ -1,244 +1,248 @@
1/* 1/*
2 * SQL Backend for the OPIE-Calender Database. 2 * SQL Backend for the OPIE-Calender Database.
3 * 3 *
4 * Copyright (c) 2003 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2003 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * 5 *
6 * ===================================================================== 6 * =====================================================================
7 *This program is free software; you can redistribute it and/or 7 *This program is free software; you can redistribute it and/or
8 *modify it under the terms of the GNU Library General Public 8 *modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
11 * ===================================================================== 11 * =====================================================================
12 * ===================================================================== 12 * =====================================================================
13 * Version: $Id$ 13 * Version: $Id$
14 * ===================================================================== 14 * =====================================================================
15 * History: 15 * History:
16 * $Log$ 16 * $Log$
17 * Revision 1.4 2004/03/14 13:50:35 alwin
18 * namespace correction
19 *
17 * Revision 1.3 2003/12/22 11:41:39 eilers 20 * Revision 1.3 2003/12/22 11:41:39 eilers
18 * Fixing stupid bug, found by sourcode review.. 21 * Fixing stupid bug, found by sourcode review..
19 * 22 *
20 * Revision 1.2 2003/12/22 10:19:26 eilers 23 * Revision 1.2 2003/12/22 10:19:26 eilers
21 * Finishing implementation of sql-backend for datebook. But I have to 24 * Finishing implementation of sql-backend for datebook. But I have to
22 * port the PIM datebook application to use it, before I could debug the 25 * port the PIM datebook application to use it, before I could debug the
23 * whole stuff. 26 * whole stuff.
24 * Thus, PIM-Database backend is finished, but highly experimental. And some 27 * Thus, PIM-Database backend is finished, but highly experimental. And some
25 * parts are still generic. For instance, the "queryByExample()" methods are 28 * parts are still generic. For instance, the "queryByExample()" methods are
26 * not (or not fully) implemented. Todo: custom-entries not stored. 29 * not (or not fully) implemented. Todo: custom-entries not stored.
27 * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular 30 * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular
28 * expression search in the database, which is not supported by sqlite ! 31 * expression search in the database, which is not supported by sqlite !
29 * Therefore we need either an extended sqlite or a workaround which would 32 * Therefore we need either an extended sqlite or a workaround which would
30 * be very slow and memory consuming.. 33 * be very slow and memory consuming..
31 * 34 *
32 * Revision 1.1 2003/12/08 15:18:12 eilers 35 * Revision 1.1 2003/12/08 15:18:12 eilers
33 * Committing unfinished sql implementation before merging to libopie2 starts.. 36 * Committing unfinished sql implementation before merging to libopie2 starts..
34 * 37 *
35 * 38 *
36 */ 39 */
37 40
38#include <stdio.h> 41#include <stdio.h>
39#include <stdlib.h> 42#include <stdlib.h>
40 43
41#include <qarray.h> 44#include <qarray.h>
42#include <qstringlist.h> 45#include <qstringlist.h>
43 46
44#include <qpe/global.h> 47#include <qpe/global.h>
45 48
46#include <opie2/osqldriver.h> 49#include <opie2/osqldriver.h>
47#include <opie2/osqlmanager.h> 50#include <opie2/osqlmanager.h>
48#include <opie2/osqlquery.h> 51#include <opie2/osqlquery.h>
49 52
50#include "orecur.h" 53#include "orecur.h"
51#include "odatebookaccessbackend_sql.h" 54#include "odatebookaccessbackend_sql.h"
52 55
56using namespace Opie::DB;
53 57
54 58
55ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& , 59ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& ,
56 const QString& fileName ) 60 const QString& fileName )
57 : ODateBookAccessBackend(), m_driver( NULL ) 61 : ODateBookAccessBackend(), m_driver( NULL )
58{ 62{
59 m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName; 63 m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName;
60 64
61 // Get the standart sql-driver from the OSQLManager.. 65 // Get the standart sql-driver from the OSQLManager..
62 OSQLManager man; 66 OSQLManager man;
63 m_driver = man.standard(); 67 m_driver = man.standard();
64 m_driver->setUrl( m_fileName ); 68 m_driver->setUrl( m_fileName );
65 69
66 initFields(); 70 initFields();
67 71
68 load(); 72 load();
69} 73}
70 74
71ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() { 75ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() {
72 if( m_driver ) 76 if( m_driver )
73 delete m_driver; 77 delete m_driver;
74} 78}
75 79
76void ODateBookAccessBackend_SQL::initFields() 80void ODateBookAccessBackend_SQL::initFields()
77{ 81{
78 82
79 // This map contains the translation of the fieldtype id's to 83 // This map contains the translation of the fieldtype id's to
80 // the names of the table columns 84 // the names of the table columns
81 m_fieldMap.insert( OEvent::FUid, "uid" ); 85 m_fieldMap.insert( OEvent::FUid, "uid" );
82 m_fieldMap.insert( OEvent::FCategories, "Categories" ); 86 m_fieldMap.insert( OEvent::FCategories, "Categories" );
83 m_fieldMap.insert( OEvent::FDescription, "Description" ); 87 m_fieldMap.insert( OEvent::FDescription, "Description" );
84 m_fieldMap.insert( OEvent::FLocation, "Location" ); 88 m_fieldMap.insert( OEvent::FLocation, "Location" );
85 m_fieldMap.insert( OEvent::FType, "Type" ); 89 m_fieldMap.insert( OEvent::FType, "Type" );
86 m_fieldMap.insert( OEvent::FAlarm, "Alarm" ); 90 m_fieldMap.insert( OEvent::FAlarm, "Alarm" );
87 m_fieldMap.insert( OEvent::FSound, "Sound" ); 91 m_fieldMap.insert( OEvent::FSound, "Sound" );
88 m_fieldMap.insert( OEvent::FRType, "RType" ); 92 m_fieldMap.insert( OEvent::FRType, "RType" );
89 m_fieldMap.insert( OEvent::FRWeekdays, "RWeekdays" ); 93 m_fieldMap.insert( OEvent::FRWeekdays, "RWeekdays" );
90 m_fieldMap.insert( OEvent::FRPosition, "RPosition" ); 94 m_fieldMap.insert( OEvent::FRPosition, "RPosition" );
91 m_fieldMap.insert( OEvent::FRFreq, "RFreq" ); 95 m_fieldMap.insert( OEvent::FRFreq, "RFreq" );
92 m_fieldMap.insert( OEvent::FRHasEndDate, "RHasEndDate" ); 96 m_fieldMap.insert( OEvent::FRHasEndDate, "RHasEndDate" );
93 m_fieldMap.insert( OEvent::FREndDate, "REndDate" ); 97 m_fieldMap.insert( OEvent::FREndDate, "REndDate" );
94 m_fieldMap.insert( OEvent::FRCreated, "RCreated" ); 98 m_fieldMap.insert( OEvent::FRCreated, "RCreated" );
95 m_fieldMap.insert( OEvent::FRExceptions, "RExceptions" ); 99 m_fieldMap.insert( OEvent::FRExceptions, "RExceptions" );
96 m_fieldMap.insert( OEvent::FStart, "Start" ); 100 m_fieldMap.insert( OEvent::FStart, "Start" );
97 m_fieldMap.insert( OEvent::FEnd, "End" ); 101 m_fieldMap.insert( OEvent::FEnd, "End" );
98 m_fieldMap.insert( OEvent::FNote, "Note" ); 102 m_fieldMap.insert( OEvent::FNote, "Note" );
99 m_fieldMap.insert( OEvent::FTimeZone, "TimeZone" ); 103 m_fieldMap.insert( OEvent::FTimeZone, "TimeZone" );
100 m_fieldMap.insert( OEvent::FRecParent, "RecParent" ); 104 m_fieldMap.insert( OEvent::FRecParent, "RecParent" );
101 m_fieldMap.insert( OEvent::FRecChildren, "Recchildren" ); 105 m_fieldMap.insert( OEvent::FRecChildren, "Recchildren" );
102 106
103 // Create a map that maps the column name to the id 107 // Create a map that maps the column name to the id
104 QMapConstIterator<int, QString> it; 108 QMapConstIterator<int, QString> it;
105 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ 109 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){
106 m_reverseFieldMap.insert( it.data(), it.key() ); 110 m_reverseFieldMap.insert( it.data(), it.key() );
107 } 111 }
108 112
109} 113}
110 114
111bool ODateBookAccessBackend_SQL::load() 115bool ODateBookAccessBackend_SQL::load()
112{ 116{
113 if (!m_driver->open() ) 117 if (!m_driver->open() )
114 return false; 118 return false;
115 119
116 // Don't expect that the database exists. 120 // Don't expect that the database exists.
117 // It is save here to create the table, even if it 121 // It is save here to create the table, even if it
118 // do exist. ( Is that correct for all databases ?? ) 122 // do exist. ( Is that correct for all databases ?? )
119 QStringqu = "create table datebook( uid INTEGER PRIMARY KEY "; 123 QStringqu = "create table datebook( uid INTEGER PRIMARY KEY ";
120 124
121 QMap<int, QString>::Iterator it; 125 QMap<int, QString>::Iterator it;
122 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ 126 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){
123 qu += QString( ",%1 VARCHAR(10)" ).arg( it.data() ); 127 qu += QString( ",%1 VARCHAR(10)" ).arg( it.data() );
124 } 128 }
125 qu += " );"; 129 qu += " );";
126 130
127 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );"; 131 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );";
128 132
129 qWarning( "command: %s", qu.latin1() ); 133 qWarning( "command: %s", qu.latin1() );
130 134
131 OSQLRawQuery raw( qu ); 135 OSQLRawQuery raw( qu );
132 OSQLResult res = m_driver->query( &raw ); 136 OSQLResult res = m_driver->query( &raw );
133 if ( res.state() != OSQLResult::Success ) 137 if ( res.state() != OSQLResult::Success )
134 return false; 138 return false;
135 139
136 update(); 140 update();
137 141
138 return true; 142 return true;
139} 143}
140 144
141void ODateBookAccessBackend_SQL::update() 145void ODateBookAccessBackend_SQL::update()
142{ 146{
143 147
144 QString qu = "select uid from datebook"; 148 QString qu = "select uid from datebook";
145 OSQLRawQuery raw( qu ); 149 OSQLRawQuery raw( qu );
146 OSQLResult res = m_driver->query( &raw ); 150 OSQLResult res = m_driver->query( &raw );
147 if ( res.state() != OSQLResult::Success ){ 151 if ( res.state() != OSQLResult::Success ){
148 // m_uids.clear(); 152 // m_uids.clear();
149 return; 153 return;
150 } 154 }
151 155
152 m_uids = extractUids( res ); 156 m_uids = extractUids( res );
153 157
154} 158}
155 159
156bool ODateBookAccessBackend_SQL::reload() 160bool ODateBookAccessBackend_SQL::reload()
157{ 161{
158 return load(); 162 return load();
159} 163}
160 164
161bool ODateBookAccessBackend_SQL::save() 165bool ODateBookAccessBackend_SQL::save()
162{ 166{
163 return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) 167 return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
164} 168}
165 169
166QArray<int> ODateBookAccessBackend_SQL::allRecords()const 170QArray<int> ODateBookAccessBackend_SQL::allRecords()const
167{ 171{
168 return m_uids; 172 return m_uids;
169} 173}
170 174
171QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OEvent&, int, const QDateTime& ) { 175QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OEvent&, int, const QDateTime& ) {
172 return QArray<int>(); 176 return QArray<int>();
173} 177}
174 178
175void ODateBookAccessBackend_SQL::clear() 179void ODateBookAccessBackend_SQL::clear()
176{ 180{
177 QString qu = "drop table datebook;"; 181 QString qu = "drop table datebook;";
178 qu += "drop table custom_data;"; 182 qu += "drop table custom_data;";
179 183
180 OSQLRawQuery raw( qu ); 184 OSQLRawQuery raw( qu );
181 OSQLResult res = m_driver->query( &raw ); 185 OSQLResult res = m_driver->query( &raw );
182 186
183 reload(); 187 reload();
184} 188}
185 189
186 190
187OEvent ODateBookAccessBackend_SQL::find( int uid ) const{ 191OEvent ODateBookAccessBackend_SQL::find( int uid ) const{
188 QString qu = "select *"; 192 QString qu = "select *";
189 qu += "from datebook where uid = " + QString::number(uid); 193 qu += "from datebook where uid = " + QString::number(uid);
190 194
191 OSQLRawQuery raw( qu ); 195 OSQLRawQuery raw( qu );
192 OSQLResult res = m_driver->query( &raw ); 196 OSQLResult res = m_driver->query( &raw );
193 197
194 OSQLResultItem resItem = res.first(); 198 OSQLResultItem resItem = res.first();
195 199
196 // Create Map for date event and insert UID 200 // Create Map for date event and insert UID
197 QMap<int,QString> dateEventMap; 201 QMap<int,QString> dateEventMap;
198 dateEventMap.insert( OEvent::FUid, QString::number( uid ) ); 202 dateEventMap.insert( OEvent::FUid, QString::number( uid ) );
199 203
200 // Now insert the data out of the columns into the map. 204 // Now insert the data out of the columns into the map.
201 QMapConstIterator<int, QString> it; 205 QMapConstIterator<int, QString> it;
202 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ 206 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){
203 dateEventMap.insert( m_reverseFieldMap[*it], resItem.data( *it ) ); 207 dateEventMap.insert( m_reverseFieldMap[*it], resItem.data( *it ) );
204 } 208 }
205 209
206 // Last step: Put map into date event and return it 210 // Last step: Put map into date event and return it
207 OEvent retDate( dateEventMap ); 211 OEvent retDate( dateEventMap );
208 212
209 return retDate; 213 return retDate;
210} 214}
211 215
212// FIXME: Speed up update of uid's.. 216// FIXME: Speed up update of uid's..
213bool ODateBookAccessBackend_SQL::add( const OEvent& ev ) 217bool ODateBookAccessBackend_SQL::add( const OEvent& ev )
214{ 218{
215 QMap<int,QString> eventMap = ev.toMap(); 219 QMap<int,QString> eventMap = ev.toMap();
216 220
217 QString qu = "insert into datebook VALUES( " + QString::number( ev.uid() ); 221 QString qu = "insert into datebook VALUES( " + QString::number( ev.uid() );
218 QMap<int, QString>::Iterator it; 222 QMap<int, QString>::Iterator it;
219 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ 223 for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){
220 if ( !eventMap[it.key()].isEmpty() ) 224 if ( !eventMap[it.key()].isEmpty() )
221 qu += QString( ",\"%1\"" ).arg( eventMap[it.key()] ); 225 qu += QString( ",\"%1\"" ).arg( eventMap[it.key()] );
222 else 226 else
223 qu += QString( ",\"\"" ); 227 qu += QString( ",\"\"" );
224 } 228 }
225 qu += " );"; 229 qu += " );";
226 230
227 // Add custom entries 231 // Add custom entries
228 int id = 0; 232 int id = 0;
229 QMap<QString, QString> customMap = ev.toExtraMap(); 233 QMap<QString, QString> customMap = ev.toExtraMap();
230 for( QMap<QString, QString>::Iterator it = customMap.begin(); 234 for( QMap<QString, QString>::Iterator it = customMap.begin();
231 it != customMap.end(); ++it ){ 235 it != customMap.end(); ++it ){
232 qu += "insert into custom_data VALUES(" 236 qu += "insert into custom_data VALUES("
233 + QString::number( ev.uid() ) 237 + QString::number( ev.uid() )
234 + "," 238 + ","
235 + QString::number( id++ ) 239 + QString::number( id++ )
236 + ",'" 240 + ",'"
237 + it.key() //.latin1() 241 + it.key() //.latin1()
238 + "'," 242 + "',"
239 + "0" // Priority for future enhancements 243 + "0" // Priority for future enhancements
240 + ",'" 244 + ",'"
241 + it.data() //.latin1() 245 + it.data() //.latin1()
242 + "');"; 246 + "');";
243 } 247 }
244 qWarning("add %s", qu.latin1() ); 248 qWarning("add %s", qu.latin1() );
diff --git a/libopie/pim/odatebookaccessbackend_sql.h b/libopie/pim/odatebookaccessbackend_sql.h
index f39e154..ba514bc 100644
--- a/libopie/pim/odatebookaccessbackend_sql.h
+++ b/libopie/pim/odatebookaccessbackend_sql.h
@@ -1,62 +1,65 @@
1#ifndef OPIE_DATE_BOOK_ACCESS_BACKEND_SQL__H 1#ifndef OPIE_DATE_BOOK_ACCESS_BACKEND_SQL__H
2#define OPIE_DATE_BOOK_ACCESS_BACKEND_SQL__H 2#define OPIE_DATE_BOOK_ACCESS_BACKEND_SQL__H
3 3
4#include <qmap.h> 4#include <qmap.h>
5#include <opie2/osqlresult.h> 5#include <opie2/osqlresult.h>
6 6
7#include "odatebookaccessbackend.h" 7#include "odatebookaccessbackend.h"
8 8
9namespace Opie { namespace DB {
9class OSQLDriver; 10class OSQLDriver;
10 11
12}}
13
11/** 14/**
12 * This is the default SQL implementation for DateBoook SQL storage 15 * This is the default SQL implementation for DateBoook SQL storage
13 * It fully implements the interface 16 * It fully implements the interface
14 * @see ODateBookAccessBackend 17 * @see ODateBookAccessBackend
15 * @see OPimAccessBackend 18 * @see OPimAccessBackend
16 */ 19 */
17class ODateBookAccessBackend_SQL : public ODateBookAccessBackend { 20class ODateBookAccessBackend_SQL : public ODateBookAccessBackend {
18public: 21public:
19 ODateBookAccessBackend_SQL( const QString& appName, 22 ODateBookAccessBackend_SQL( const QString& appName,
20 const QString& fileName = QString::null); 23 const QString& fileName = QString::null);
21 ~ODateBookAccessBackend_SQL(); 24 ~ODateBookAccessBackend_SQL();
22 25
23 bool load(); 26 bool load();
24 bool reload(); 27 bool reload();
25 bool save(); 28 bool save();
26 29
27 QArray<int> allRecords()const; 30 QArray<int> allRecords()const;
28 QArray<int> matchRegexp(const QRegExp &r) const; 31 QArray<int> matchRegexp(const QRegExp &r) const;
29 QArray<int> queryByExample( const OEvent&, int, const QDateTime& d = QDateTime() ); 32 QArray<int> queryByExample( const OEvent&, int, const QDateTime& d = QDateTime() );
30 OEvent find( int uid )const; 33 OEvent find( int uid )const;
31 void clear(); 34 void clear();
32 bool add( const OEvent& ev ); 35 bool add( const OEvent& ev );
33 bool remove( int uid ); 36 bool remove( int uid );
34 bool replace( const OEvent& ev ); 37 bool replace( const OEvent& ev );
35 38
36 QArray<UID> rawEvents()const; 39 QArray<UID> rawEvents()const;
37 QArray<UID> rawRepeats()const; 40 QArray<UID> rawRepeats()const;
38 QArray<UID> nonRepeats()const; 41 QArray<UID> nonRepeats()const;
39 42
40 OEvent::ValueList directNonRepeats(); 43 OEvent::ValueList directNonRepeats();
41 OEvent::ValueList directRawRepeats(); 44 OEvent::ValueList directRawRepeats();
42 45
43private: 46private:
44 bool loadFile(); 47 bool loadFile();
45 QString m_fileName; 48 QString m_fileName;
46 QArray<int> m_uids; 49 QArray<int> m_uids;
47 50
48 QMap<int, QString> m_fieldMap; 51 QMap<int, QString> m_fieldMap;
49 QMap<QString, int> m_reverseFieldMap; 52 QMap<QString, int> m_reverseFieldMap;
50 53
51 OSQLDriver* m_driver; 54 Opie::DB::OSQLDriver* m_driver;
52 55
53 class Private; 56 class Private;
54 Private *d; 57 Private *d;
55 58
56 void initFields(); 59 void initFields();
57 void update(); 60 void update();
58 QArray<int> extractUids( OSQLResult& res ) const; 61 QArray<int> extractUids( Opie::DB::OSQLResult& res ) const;
59 62
60}; 63};
61 64
62#endif 65#endif
diff --git a/libopie/pim/otodoaccesssql.cpp b/libopie/pim/otodoaccesssql.cpp
index 3764c7e..fd01a42 100644
--- a/libopie/pim/otodoaccesssql.cpp
+++ b/libopie/pim/otodoaccesssql.cpp
@@ -1,207 +1,208 @@
1 1
2#include <qdatetime.h> 2#include <qdatetime.h>
3 3
4#include <qpe/global.h> 4#include <qpe/global.h>
5 5
6#include <opie2/osqldriver.h> 6#include <opie2/osqldriver.h>
7#include <opie2/osqlresult.h> 7#include <opie2/osqlresult.h>
8#include <opie2/osqlmanager.h> 8#include <opie2/osqlmanager.h>
9#include <opie2/osqlquery.h> 9#include <opie2/osqlquery.h>
10 10
11#include "otodoaccesssql.h" 11#include "otodoaccesssql.h"
12#include "opimstate.h" 12#include "opimstate.h"
13#include "opimnotifymanager.h" 13#include "opimnotifymanager.h"
14#include "orecur.h" 14#include "orecur.h"
15 15
16using namespace Opie::DB;
16/* 17/*
17 * first some query 18 * first some query
18 * CREATE query 19 * CREATE query
19 * LOAD query 20 * LOAD query
20 * INSERT 21 * INSERT
21 * REMOVE 22 * REMOVE
22 * CLEAR 23 * CLEAR
23 */ 24 */
24namespace { 25namespace {
25 /** 26 /**
26 * CreateQuery for the Todolist Table 27 * CreateQuery for the Todolist Table
27 */ 28 */
28 class CreateQuery : public OSQLQuery { 29 class CreateQuery : public OSQLQuery {
29 public: 30 public:
30 CreateQuery(); 31 CreateQuery();
31 ~CreateQuery(); 32 ~CreateQuery();
32 QString query()const; 33 QString query()const;
33 }; 34 };
34 35
35 /** 36 /**
36 * LoadQuery 37 * LoadQuery
37 * this one queries for all uids 38 * this one queries for all uids
38 */ 39 */
39 class LoadQuery : public OSQLQuery { 40 class LoadQuery : public OSQLQuery {
40 public: 41 public:
41 LoadQuery(); 42 LoadQuery();
42 ~LoadQuery(); 43 ~LoadQuery();
43 QString query()const; 44 QString query()const;
44 }; 45 };
45 46
46 /** 47 /**
47 * inserts/adds a OTodo to the table 48 * inserts/adds a OTodo to the table
48 */ 49 */
49 class InsertQuery : public OSQLQuery { 50 class InsertQuery : public OSQLQuery {
50 public: 51 public:
51 InsertQuery(const OTodo& ); 52 InsertQuery(const OTodo& );
52 ~InsertQuery(); 53 ~InsertQuery();
53 QString query()const; 54 QString query()const;
54 private: 55 private:
55 OTodo m_todo; 56 OTodo m_todo;
56 }; 57 };
57 58
58 /** 59 /**
59 * removes one from the table 60 * removes one from the table
60 */ 61 */
61 class RemoveQuery : public OSQLQuery { 62 class RemoveQuery : public OSQLQuery {
62 public: 63 public:
63 RemoveQuery(int uid ); 64 RemoveQuery(int uid );
64 ~RemoveQuery(); 65 ~RemoveQuery();
65 QString query()const; 66 QString query()const;
66 private: 67 private:
67 int m_uid; 68 int m_uid;
68 }; 69 };
69 70
70 /** 71 /**
71 * Clears (delete) a Table 72 * Clears (delete) a Table
72 */ 73 */
73 class ClearQuery : public OSQLQuery { 74 class ClearQuery : public OSQLQuery {
74 public: 75 public:
75 ClearQuery(); 76 ClearQuery();
76 ~ClearQuery(); 77 ~ClearQuery();
77 QString query()const; 78 QString query()const;
78 79
79 }; 80 };
80 81
81 /** 82 /**
82 * a find query 83 * a find query
83 */ 84 */
84 class FindQuery : public OSQLQuery { 85 class FindQuery : public OSQLQuery {
85 public: 86 public:
86 FindQuery(int uid); 87 FindQuery(int uid);
87 FindQuery(const QArray<int>& ); 88 FindQuery(const QArray<int>& );
88 ~FindQuery(); 89 ~FindQuery();
89 QString query()const; 90 QString query()const;
90 private: 91 private:
91 QString single()const; 92 QString single()const;
92 QString multi()const; 93 QString multi()const;
93 QArray<int> m_uids; 94 QArray<int> m_uids;
94 int m_uid; 95 int m_uid;
95 }; 96 };
96 97
97 /** 98 /**
98 * overdue query 99 * overdue query
99 */ 100 */
100 class OverDueQuery : public OSQLQuery { 101 class OverDueQuery : public OSQLQuery {
101 public: 102 public:
102 OverDueQuery(); 103 OverDueQuery();
103 ~OverDueQuery(); 104 ~OverDueQuery();
104 QString query()const; 105 QString query()const;
105 }; 106 };
106 class EffQuery : public OSQLQuery { 107 class EffQuery : public OSQLQuery {
107 public: 108 public:
108 EffQuery( const QDate&, const QDate&, bool inc ); 109 EffQuery( const QDate&, const QDate&, bool inc );
109 ~EffQuery(); 110 ~EffQuery();
110 QString query()const; 111 QString query()const;
111 private: 112 private:
112 QString with()const; 113 QString with()const;
113 QString out()const; 114 QString out()const;
114 QDate m_start; 115 QDate m_start;
115 QDate m_end; 116 QDate m_end;
116 bool m_inc :1; 117 bool m_inc :1;
117 }; 118 };
118 119
119 120
120 CreateQuery::CreateQuery() : OSQLQuery() {} 121 CreateQuery::CreateQuery() : OSQLQuery() {}
121 CreateQuery::~CreateQuery() {} 122 CreateQuery::~CreateQuery() {}
122 QString CreateQuery::query()const { 123 QString CreateQuery::query()const {
123 QString qu; 124 QString qu;
124 qu += "create table todolist( uid PRIMARY KEY, categories, completed, "; 125 qu += "create table todolist( uid PRIMARY KEY, categories, completed, ";
125 qu += "description, summary, priority, DueDate, progress , state, "; 126 qu += "description, summary, priority, DueDate, progress , state, ";
126 // This is the recurrance-stuff .. Exceptions are currently not supported (see ORecur.cpp) ! (eilers) 127 // This is the recurrance-stuff .. Exceptions are currently not supported (see ORecur.cpp) ! (eilers)
127 qu += "RType, RWeekdays, RPosition, RFreq, RHasEndDate, EndDate, Created, Exceptions, "; 128 qu += "RType, RWeekdays, RPosition, RFreq, RHasEndDate, EndDate, Created, Exceptions, ";
128 qu += "reminders, alarms, maintainer, startdate, completeddate);"; 129 qu += "reminders, alarms, maintainer, startdate, completeddate);";
129 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; 130 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
130 return qu; 131 return qu;
131 } 132 }
132 133
133 LoadQuery::LoadQuery() : OSQLQuery() {} 134 LoadQuery::LoadQuery() : OSQLQuery() {}
134 LoadQuery::~LoadQuery() {} 135 LoadQuery::~LoadQuery() {}
135 QString LoadQuery::query()const { 136 QString LoadQuery::query()const {
136 QString qu; 137 QString qu;
137 // We do not need "distinct" here. The primary key is always unique.. 138 // We do not need "distinct" here. The primary key is always unique..
138 //qu += "select distinct uid from todolist"; 139 //qu += "select distinct uid from todolist";
139 qu += "select uid from todolist"; 140 qu += "select uid from todolist";
140 141
141 return qu; 142 return qu;
142 } 143 }
143 144
144 InsertQuery::InsertQuery( const OTodo& todo ) 145 InsertQuery::InsertQuery( const OTodo& todo )
145 : OSQLQuery(), m_todo( todo ) { 146 : OSQLQuery(), m_todo( todo ) {
146 } 147 }
147 InsertQuery::~InsertQuery() { 148 InsertQuery::~InsertQuery() {
148 } 149 }
149 /* 150 /*
150 * converts from a OTodo to a query 151 * converts from a OTodo to a query
151 * we leave out X-Ref + Alarms 152 * we leave out X-Ref + Alarms
152 */ 153 */
153 QString InsertQuery::query()const{ 154 QString InsertQuery::query()const{
154 155
155 int year, month, day; 156 int year, month, day;
156 year = month = day = 0; 157 year = month = day = 0;
157 if (m_todo.hasDueDate() ) { 158 if (m_todo.hasDueDate() ) {
158 QDate date = m_todo.dueDate(); 159 QDate date = m_todo.dueDate();
159 year = date.year(); 160 year = date.year();
160 month = date.month(); 161 month = date.month();
161 day = date.day(); 162 day = date.day();
162 } 163 }
163 int sYear = 0, sMonth = 0, sDay = 0; 164 int sYear = 0, sMonth = 0, sDay = 0;
164 if( m_todo.hasStartDate() ){ 165 if( m_todo.hasStartDate() ){
165 QDate sDate = m_todo.startDate(); 166 QDate sDate = m_todo.startDate();
166 sYear = sDate.year(); 167 sYear = sDate.year();
167 sMonth= sDate.month(); 168 sMonth= sDate.month();
168 sDay = sDate.day(); 169 sDay = sDate.day();
169 } 170 }
170 171
171 int eYear = 0, eMonth = 0, eDay = 0; 172 int eYear = 0, eMonth = 0, eDay = 0;
172 if( m_todo.hasCompletedDate() ){ 173 if( m_todo.hasCompletedDate() ){
173 QDate eDate = m_todo.completedDate(); 174 QDate eDate = m_todo.completedDate();
174 eYear = eDate.year(); 175 eYear = eDate.year();
175 eMonth= eDate.month(); 176 eMonth= eDate.month();
176 eDay = eDate.day(); 177 eDay = eDate.day();
177 } 178 }
178 QString qu; 179 QString qu;
179 QMap<int, QString> recMap = m_todo.recurrence().toMap(); 180 QMap<int, QString> recMap = m_todo.recurrence().toMap();
180 qu = "insert into todolist VALUES(" 181 qu = "insert into todolist VALUES("
181 + QString::number( m_todo.uid() ) + "," 182 + QString::number( m_todo.uid() ) + ","
182 + "'" + m_todo.idsToString( m_todo.categories() ) + "'" + "," 183 + "'" + m_todo.idsToString( m_todo.categories() ) + "'" + ","
183 + QString::number( m_todo.isCompleted() ) + "," 184 + QString::number( m_todo.isCompleted() ) + ","
184 + "'" + m_todo.description() + "'" + "," 185 + "'" + m_todo.description() + "'" + ","
185 + "'" + m_todo.summary() + "'" + "," 186 + "'" + m_todo.summary() + "'" + ","
186 + QString::number(m_todo.priority() ) + "," 187 + QString::number(m_todo.priority() ) + ","
187 + "'" + QString::number(year) + "-" 188 + "'" + QString::number(year) + "-"
188 + QString::number(month) 189 + QString::number(month)
189 + "-" + QString::number( day ) + "'" + "," 190 + "-" + QString::number( day ) + "'" + ","
190 + QString::number( m_todo.progress() ) + "," 191 + QString::number( m_todo.progress() ) + ","
191 + QString::number( m_todo.state().state() ) + "," 192 + QString::number( m_todo.state().state() ) + ","
192 + "'" + recMap[ ORecur::RType ] + "'" + "," 193 + "'" + recMap[ ORecur::RType ] + "'" + ","
193 + "'" + recMap[ ORecur::RWeekdays ] + "'" + "," 194 + "'" + recMap[ ORecur::RWeekdays ] + "'" + ","
194 + "'" + recMap[ ORecur::RPosition ] + "'" + "," 195 + "'" + recMap[ ORecur::RPosition ] + "'" + ","
195 + "'" + recMap[ ORecur::RFreq ] + "'" + "," 196 + "'" + recMap[ ORecur::RFreq ] + "'" + ","
196 + "'" + recMap[ ORecur::RHasEndDate ] + "'" + "," 197 + "'" + recMap[ ORecur::RHasEndDate ] + "'" + ","
197 + "'" + recMap[ ORecur::EndDate ] + "'" + "," 198 + "'" + recMap[ ORecur::EndDate ] + "'" + ","
198 + "'" + recMap[ ORecur::Created ] + "'" + "," 199 + "'" + recMap[ ORecur::Created ] + "'" + ","
199 + "'" + recMap[ ORecur::Exceptions ] + "'" + ","; 200 + "'" + recMap[ ORecur::Exceptions ] + "'" + ",";
200 201
201 if ( m_todo.hasNotifiers() ) { 202 if ( m_todo.hasNotifiers() ) {
202 OPimNotifyManager manager = m_todo.notifiers(); 203 OPimNotifyManager manager = m_todo.notifiers();
203 qu += "'" + manager.remindersToString() + "'" + "," 204 qu += "'" + manager.remindersToString() + "'" + ","
204 + "'" + manager.alarmsToString() + "'" + ","; 205 + "'" + manager.alarmsToString() + "'" + ",";
205 } 206 }
206 else{ 207 else{
207 qu += QString( "''" ) + "," 208 qu += QString( "''" ) + ","
diff --git a/libopie/pim/otodoaccesssql.h b/libopie/pim/otodoaccesssql.h
index 1c55567..72214de 100644
--- a/libopie/pim/otodoaccesssql.h
+++ b/libopie/pim/otodoaccesssql.h
@@ -1,56 +1,61 @@
1#ifndef OPIE_PIM_ACCESS_SQL_H 1#ifndef OPIE_PIM_ACCESS_SQL_H
2#define OPIE_PIM_ACCESS_SQL_H 2#define OPIE_PIM_ACCESS_SQL_H
3 3
4#include <qasciidict.h> 4#include <qasciidict.h>
5 5
6#include "otodoaccessbackend.h" 6#include "otodoaccessbackend.h"
7 7
8namespace Opie{
9namespace DB {
8class OSQLDriver; 10class OSQLDriver;
9class OSQLResult; 11class OSQLResult;
10class OSQLResultItem; 12class OSQLResultItem;
13}
14}
15
11class OTodoAccessBackendSQL : public OTodoAccessBackend { 16class OTodoAccessBackendSQL : public OTodoAccessBackend {
12public: 17public:
13 OTodoAccessBackendSQL( const QString& file ); 18 OTodoAccessBackendSQL( const QString& file );
14 ~OTodoAccessBackendSQL(); 19 ~OTodoAccessBackendSQL();
15 20
16 bool load(); 21 bool load();
17 bool reload(); 22 bool reload();
18 bool save(); 23 bool save();
19 QArray<int> allRecords()const; 24 QArray<int> allRecords()const;
20 25
21 QArray<int> queryByExample( const OTodo& t, int settings, const QDateTime& d = QDateTime() ); 26 QArray<int> queryByExample( const OTodo& t, int settings, const QDateTime& d = QDateTime() );
22 OTodo find(int uid)const; 27 OTodo find(int uid)const;
23 OTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const; 28 OTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const;
24 void clear(); 29 void clear();
25 bool add( const OTodo& t ); 30 bool add( const OTodo& t );
26 bool remove( int uid ); 31 bool remove( int uid );
27 bool replace( const OTodo& t ); 32 bool replace( const OTodo& t );
28 33
29 QArray<int> overDue(); 34 QArray<int> overDue();
30 QArray<int> effectiveToDos( const QDate& start, 35 QArray<int> effectiveToDos( const QDate& start,
31 const QDate& end, bool includeNoDates ); 36 const QDate& end, bool includeNoDates );
32 QArray<int> sorted(bool asc, int sortOrder, int sortFilter, int cat ); 37 QArray<int> sorted(bool asc, int sortOrder, int sortFilter, int cat );
33 38
34 QBitArray supports()const; 39 QBitArray supports()const;
35 QArray<int> matchRegexp( const QRegExp &r ) const; 40 QArray<int> matchRegexp( const QRegExp &r ) const;
36 void removeAllCompleted(); 41 void removeAllCompleted();
37 42
38 43
39private: 44private:
40 void update()const; 45 void update()const;
41 void fillDict(); 46 void fillDict();
42 inline bool date( QDate& date, const QString& )const; 47 inline bool date( QDate& date, const QString& )const;
43 inline OTodo todo( const OSQLResult& )const; 48 inline OTodo todo( const Opie::DB::OSQLResult& )const;
44 inline OTodo todo( OSQLResultItem& )const; 49 inline OTodo todo( Opie::DB::OSQLResultItem& )const;
45 inline QArray<int> uids( const OSQLResult& )const; 50 inline QArray<int> uids( const Opie::DB::OSQLResult& )const;
46 OTodo todo( int uid )const; 51 OTodo todo( int uid )const;
47 QBitArray sup() const; 52 QBitArray sup() const;
48 53
49 QAsciiDict<int> m_dict; 54 QAsciiDict<int> m_dict;
50 OSQLDriver* m_driver; 55 Opie::DB::OSQLDriver* m_driver;
51 QArray<int> m_uids; 56 QArray<int> m_uids;
52 bool m_dirty : 1; 57 bool m_dirty : 1;
53}; 58};
54 59
55 60
56#endif 61#endif