summaryrefslogtreecommitdiff
authorzecke <zecke>2002-10-10 20:16:15 (UTC)
committer zecke <zecke>2002-10-10 20:16:15 (UTC)
commit48b06312289a90ad38278d3adb0bce5e9e0bd67e (patch) (unidiff)
treee5123b76d501eeb669ac6b43b8da746eae36e638
parentc90676c42c7be606a9fc690278b67909ba6a9c99 (diff)
downloadopie-48b06312289a90ad38278d3adb0bce5e9e0bd67e.zip
opie-48b06312289a90ad38278d3adb0bce5e9e0bd67e.tar.gz
opie-48b06312289a90ad38278d3adb0bce5e9e0bd67e.tar.bz2
Implement read ahead on the XML resource...
Scrolling is now noticeable faster with 10.000 items but not as fast the XML backend... OPimCache can be tuned and Query->OTodo too
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/opimcache.h4
-rw-r--r--libopie/pim/otodoaccesssql.cpp81
-rw-r--r--libopie/pim/otodoaccesssql.h3
-rw-r--r--libopie2/opiepim/backend/otodoaccesssql.cpp81
-rw-r--r--libopie2/opiepim/backend/otodoaccesssql.h3
-rw-r--r--libopie2/opiepim/core/opimcache.h4
6 files changed, 162 insertions, 14 deletions
diff --git a/libopie/pim/opimcache.h b/libopie/pim/opimcache.h
index 067f6e7..839550c 100644
--- a/libopie/pim/opimcache.h
+++ b/libopie/pim/opimcache.h
@@ -62,5 +62,7 @@ void OPimCacheItem<T>::setRecord( const T& t ) {
62// Cache 62// Cache
63template <class T> 63template <class T>
64OPimCache<T>::OPimCache() { 64OPimCache<T>::OPimCache()
65 : m_cache(100, 53 )
66{
65 m_cache.setAutoDelete( TRUE ); 67 m_cache.setAutoDelete( TRUE );
66} 68}
diff --git a/libopie/pim/otodoaccesssql.cpp b/libopie/pim/otodoaccesssql.cpp
index 8add9f7..a059dab 100644
--- a/libopie/pim/otodoaccesssql.cpp
+++ b/libopie/pim/otodoaccesssql.cpp
@@ -82,7 +82,11 @@ namespace {
82 public: 82 public:
83 FindQuery(int uid); 83 FindQuery(int uid);
84 FindQuery(const QArray<int>& );
84 ~FindQuery(); 85 ~FindQuery();
85 QString query()const; 86 QString query()const;
86 private: 87 private:
88 QString single()const;
89 QString multi()const;
90 QArray<int> m_uids;
87 int m_uid; 91 int m_uid;
88 }; 92 };
@@ -139,4 +143,5 @@ namespace {
139 */ 143 */
140 QString InsertQuery::query()const{ 144 QString InsertQuery::query()const{
145
141 int year, month, day; 146 int year, month, day;
142 year = month = day = 0; 147 year = month = day = 0;
@@ -176,11 +181,29 @@ namespace {
176 : OSQLQuery(), m_uid(uid ) { 181 : OSQLQuery(), m_uid(uid ) {
177 } 182 }
183 FindQuery::FindQuery(const QArray<int>& ints)
184 : OSQLQuery(), m_uids(ints){
185 }
178 FindQuery::~FindQuery() { 186 FindQuery::~FindQuery() {
179 } 187 }
180 QString FindQuery::query()const{ 188 QString FindQuery::query()const{
189 if (m_uids.count() == 0 )
190 return single();
191 else
192 return multi();
193 }
194 QString FindQuery::single()const{
181 QString qu = "select uid, categories, completed, progress, summary, "; 195 QString qu = "select uid, categories, completed, progress, summary, ";
182 qu += "DueDate, priority, description from todolist where uid = " + QString::number(m_uid); 196 qu += "DueDate, priority, description from todolist where uid = " + QString::number(m_uid);
183 return qu; 197 return qu;
184 } 198 }
199 QString FindQuery::multi()const {
200 QString qu = "select uid, categories, completed, progress, summary, ";
201 qu += "DueDate, priority, description from todolist where ";
202 for (uint i = 0; i < m_uids.count(); i++ ) {
203 qu += " UID = " + QString::number( m_uids[i] ) + " OR";
204 }
205 qu.remove( qu.length()-2, 2 );
206 return qu;
207 }
185 208
186 OverDueQuery::OverDueQuery(): OSQLQuery() {} 209 OverDueQuery::OverDueQuery(): OSQLQuery() {}
@@ -262,4 +285,37 @@ OTodo OTodoAccessBackendSQL::find(int uid ) const{
262 285
263} 286}
287OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints,
288 uint cur, Frontend::CacheDirection dir ) const{
289 qWarning("searching for %d", uid );
290 QArray<int> search( 8 );
291 uint size =0;
292 OTodo to;
293
294 // we try to cache 8 items
295 switch( dir ) {
296 /* forward */
297 case 0:
298 for (uint i = cur; i < ints.count() && size < 8; i++ ) {
299 qWarning("size %d %d", size, ints[i] );
300 search[size] = ints[i];
301 size++;
302 }
303 break;
304 /* reverse */
305 case 1:
306 for (uint i = cur; i >= 0 && size < 8; i-- ) {
307 search[size] = ints[i];
308 size++;
309 }
310 break;
311 }
312 search.resize( size );
313 FindQuery query( search );
314 OSQLResult res = m_driver->query( &query );
315 if ( res.state() != OSQLResult::Success )
316 return to;
317
318 return todo( res );
319}
264void OTodoAccessBackendSQL::clear() { 320void OTodoAccessBackendSQL::clear() {
265 ClearQuery cle; 321 ClearQuery cle;
@@ -394,12 +450,25 @@ OTodo OTodoAccessBackendSQL::todo( const OSQLResult& res) const{
394 OSQLResultItem::ValueList list = res.results(); 450 OSQLResultItem::ValueList list = res.results();
395 OSQLResultItem::ValueList::Iterator it = list.begin(); 451 OSQLResultItem::ValueList::Iterator it = list.begin();
396 452 qWarning("todo1");
453 OTodo to = todo( (*it) );
454 cache( to );
455 ++it;
456
457 for ( ; it != list.end(); ++it ) {
458 qWarning("caching");
459 cache( todo( (*it) ) );
460 }
461 return to;
462}
463OTodo OTodoAccessBackendSQL::todo( OSQLResultItem& item )const {
464 qWarning("todo");
397 bool has = false; QDate da = QDate::currentDate(); 465 bool has = false; QDate da = QDate::currentDate();
398 has = date( da, (*it).data("DueDate") ); 466 has = date( da, item.data("DueDate") );
399 QStringList cats = QStringList::split(";", (*it).data("categories") ); 467 QStringList cats = QStringList::split(";", item.data("categories") );
400 468
401 OTodo to( (bool)(*it).data("completed").toInt(), (*it).data("priority").toInt(), 469 OTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(),
402 cats, (*it).data("summary"), (*it).data("description"), 470 cats, item.data("summary"), item.data("description"),
403 (*it).data("progress").toUShort(), has, da, (*it).data("uid").toInt() ); 471 item.data("progress").toUShort(), has, da,
472 item.data("uid").toInt() );
404 return to; 473 return to;
405} 474}
diff --git a/libopie/pim/otodoaccesssql.h b/libopie/pim/otodoaccesssql.h
index 6c5f50a..c1aa2ed 100644
--- a/libopie/pim/otodoaccesssql.h
+++ b/libopie/pim/otodoaccesssql.h
@@ -8,4 +8,5 @@
8class OSQLDriver; 8class OSQLDriver;
9class OSQLResult; 9class OSQLResult;
10class OSQLResultItem;
10class OTodoAccessBackendSQL : public OTodoAccessBackend { 11class OTodoAccessBackendSQL : public OTodoAccessBackend {
11public: 12public:
@@ -20,4 +21,5 @@ public:
20 QArray<int> queryByExample( const OTodo& t, int sort ); 21 QArray<int> queryByExample( const OTodo& t, int sort );
21 OTodo find(int uid)const; 22 OTodo find(int uid)const;
23 OTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const;
22 void clear(); 24 void clear();
23 bool add( const OTodo& t ); 25 bool add( const OTodo& t );
@@ -35,4 +37,5 @@ private:
35 inline bool date( QDate& date, const QString& )const; 37 inline bool date( QDate& date, const QString& )const;
36 inline OTodo todo( const OSQLResult& )const; 38 inline OTodo todo( const OSQLResult& )const;
39 inline OTodo todo( OSQLResultItem& )const;
37 inline QArray<int> uids( const OSQLResult& )const; 40 inline QArray<int> uids( const OSQLResult& )const;
38 OTodo todo( int uid )const; 41 OTodo todo( int uid )const;
diff --git a/libopie2/opiepim/backend/otodoaccesssql.cpp b/libopie2/opiepim/backend/otodoaccesssql.cpp
index 8add9f7..a059dab 100644
--- a/libopie2/opiepim/backend/otodoaccesssql.cpp
+++ b/libopie2/opiepim/backend/otodoaccesssql.cpp
@@ -82,7 +82,11 @@ namespace {
82 public: 82 public:
83 FindQuery(int uid); 83 FindQuery(int uid);
84 FindQuery(const QArray<int>& );
84 ~FindQuery(); 85 ~FindQuery();
85 QString query()const; 86 QString query()const;
86 private: 87 private:
88 QString single()const;
89 QString multi()const;
90 QArray<int> m_uids;
87 int m_uid; 91 int m_uid;
88 }; 92 };
@@ -139,4 +143,5 @@ namespace {
139 */ 143 */
140 QString InsertQuery::query()const{ 144 QString InsertQuery::query()const{
145
141 int year, month, day; 146 int year, month, day;
142 year = month = day = 0; 147 year = month = day = 0;
@@ -176,11 +181,29 @@ namespace {
176 : OSQLQuery(), m_uid(uid ) { 181 : OSQLQuery(), m_uid(uid ) {
177 } 182 }
183 FindQuery::FindQuery(const QArray<int>& ints)
184 : OSQLQuery(), m_uids(ints){
185 }
178 FindQuery::~FindQuery() { 186 FindQuery::~FindQuery() {
179 } 187 }
180 QString FindQuery::query()const{ 188 QString FindQuery::query()const{
189 if (m_uids.count() == 0 )
190 return single();
191 else
192 return multi();
193 }
194 QString FindQuery::single()const{
181 QString qu = "select uid, categories, completed, progress, summary, "; 195 QString qu = "select uid, categories, completed, progress, summary, ";
182 qu += "DueDate, priority, description from todolist where uid = " + QString::number(m_uid); 196 qu += "DueDate, priority, description from todolist where uid = " + QString::number(m_uid);
183 return qu; 197 return qu;
184 } 198 }
199 QString FindQuery::multi()const {
200 QString qu = "select uid, categories, completed, progress, summary, ";
201 qu += "DueDate, priority, description from todolist where ";
202 for (uint i = 0; i < m_uids.count(); i++ ) {
203 qu += " UID = " + QString::number( m_uids[i] ) + " OR";
204 }
205 qu.remove( qu.length()-2, 2 );
206 return qu;
207 }
185 208
186 OverDueQuery::OverDueQuery(): OSQLQuery() {} 209 OverDueQuery::OverDueQuery(): OSQLQuery() {}
@@ -262,4 +285,37 @@ OTodo OTodoAccessBackendSQL::find(int uid ) const{
262 285
263} 286}
287OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints,
288 uint cur, Frontend::CacheDirection dir ) const{
289 qWarning("searching for %d", uid );
290 QArray<int> search( 8 );
291 uint size =0;
292 OTodo to;
293
294 // we try to cache 8 items
295 switch( dir ) {
296 /* forward */
297 case 0:
298 for (uint i = cur; i < ints.count() && size < 8; i++ ) {
299 qWarning("size %d %d", size, ints[i] );
300 search[size] = ints[i];
301 size++;
302 }
303 break;
304 /* reverse */
305 case 1:
306 for (uint i = cur; i >= 0 && size < 8; i-- ) {
307 search[size] = ints[i];
308 size++;
309 }
310 break;
311 }
312 search.resize( size );
313 FindQuery query( search );
314 OSQLResult res = m_driver->query( &query );
315 if ( res.state() != OSQLResult::Success )
316 return to;
317
318 return todo( res );
319}
264void OTodoAccessBackendSQL::clear() { 320void OTodoAccessBackendSQL::clear() {
265 ClearQuery cle; 321 ClearQuery cle;
@@ -394,12 +450,25 @@ OTodo OTodoAccessBackendSQL::todo( const OSQLResult& res) const{
394 OSQLResultItem::ValueList list = res.results(); 450 OSQLResultItem::ValueList list = res.results();
395 OSQLResultItem::ValueList::Iterator it = list.begin(); 451 OSQLResultItem::ValueList::Iterator it = list.begin();
396 452 qWarning("todo1");
453 OTodo to = todo( (*it) );
454 cache( to );
455 ++it;
456
457 for ( ; it != list.end(); ++it ) {
458 qWarning("caching");
459 cache( todo( (*it) ) );
460 }
461 return to;
462}
463OTodo OTodoAccessBackendSQL::todo( OSQLResultItem& item )const {
464 qWarning("todo");
397 bool has = false; QDate da = QDate::currentDate(); 465 bool has = false; QDate da = QDate::currentDate();
398 has = date( da, (*it).data("DueDate") ); 466 has = date( da, item.data("DueDate") );
399 QStringList cats = QStringList::split(";", (*it).data("categories") ); 467 QStringList cats = QStringList::split(";", item.data("categories") );
400 468
401 OTodo to( (bool)(*it).data("completed").toInt(), (*it).data("priority").toInt(), 469 OTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(),
402 cats, (*it).data("summary"), (*it).data("description"), 470 cats, item.data("summary"), item.data("description"),
403 (*it).data("progress").toUShort(), has, da, (*it).data("uid").toInt() ); 471 item.data("progress").toUShort(), has, da,
472 item.data("uid").toInt() );
404 return to; 473 return to;
405} 474}
diff --git a/libopie2/opiepim/backend/otodoaccesssql.h b/libopie2/opiepim/backend/otodoaccesssql.h
index 6c5f50a..c1aa2ed 100644
--- a/libopie2/opiepim/backend/otodoaccesssql.h
+++ b/libopie2/opiepim/backend/otodoaccesssql.h
@@ -8,4 +8,5 @@
8class OSQLDriver; 8class OSQLDriver;
9class OSQLResult; 9class OSQLResult;
10class OSQLResultItem;
10class OTodoAccessBackendSQL : public OTodoAccessBackend { 11class OTodoAccessBackendSQL : public OTodoAccessBackend {
11public: 12public:
@@ -20,4 +21,5 @@ public:
20 QArray<int> queryByExample( const OTodo& t, int sort ); 21 QArray<int> queryByExample( const OTodo& t, int sort );
21 OTodo find(int uid)const; 22 OTodo find(int uid)const;
23 OTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const;
22 void clear(); 24 void clear();
23 bool add( const OTodo& t ); 25 bool add( const OTodo& t );
@@ -35,4 +37,5 @@ private:
35 inline bool date( QDate& date, const QString& )const; 37 inline bool date( QDate& date, const QString& )const;
36 inline OTodo todo( const OSQLResult& )const; 38 inline OTodo todo( const OSQLResult& )const;
39 inline OTodo todo( OSQLResultItem& )const;
37 inline QArray<int> uids( const OSQLResult& )const; 40 inline QArray<int> uids( const OSQLResult& )const;
38 OTodo todo( int uid )const; 41 OTodo todo( int uid )const;
diff --git a/libopie2/opiepim/core/opimcache.h b/libopie2/opiepim/core/opimcache.h
index 067f6e7..839550c 100644
--- a/libopie2/opiepim/core/opimcache.h
+++ b/libopie2/opiepim/core/opimcache.h
@@ -62,5 +62,7 @@ void OPimCacheItem<T>::setRecord( const T& t ) {
62// Cache 62// Cache
63template <class T> 63template <class T>
64OPimCache<T>::OPimCache() { 64OPimCache<T>::OPimCache()
65 : m_cache(100, 53 )
66{
65 m_cache.setAutoDelete( TRUE ); 67 m_cache.setAutoDelete( TRUE );
66} 68}