summaryrefslogtreecommitdiff
authorzecke <zecke>2002-10-10 20:16:15 (UTC)
committer zecke <zecke>2002-10-10 20:16:15 (UTC)
commit48b06312289a90ad38278d3adb0bce5e9e0bd67e (patch) (side-by-side diff)
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
@@ -63,3 +63,5 @@ void OPimCacheItem<T>::setRecord( const T& t ) {
template <class T>
-OPimCache<T>::OPimCache() {
+OPimCache<T>::OPimCache()
+ : m_cache(100, 53 )
+{
m_cache.setAutoDelete( TRUE );
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
@@ -83,2 +83,3 @@ namespace {
FindQuery(int uid);
+ FindQuery(const QArray<int>& );
~FindQuery();
@@ -86,2 +87,5 @@ namespace {
private:
+ QString single()const;
+ QString multi()const;
+ QArray<int> m_uids;
int m_uid;
@@ -140,2 +144,3 @@ namespace {
QString InsertQuery::query()const{
+
int year, month, day;
@@ -177,2 +182,5 @@ namespace {
}
+ FindQuery::FindQuery(const QArray<int>& ints)
+ : OSQLQuery(), m_uids(ints){
+ }
FindQuery::~FindQuery() {
@@ -180,2 +188,8 @@ namespace {
QString FindQuery::query()const{
+ if (m_uids.count() == 0 )
+ return single();
+ else
+ return multi();
+ }
+ QString FindQuery::single()const{
QString qu = "select uid, categories, completed, progress, summary, ";
@@ -184,2 +198,11 @@ namespace {
}
+ QString FindQuery::multi()const {
+ QString qu = "select uid, categories, completed, progress, summary, ";
+ qu += "DueDate, priority, description from todolist where ";
+ for (uint i = 0; i < m_uids.count(); i++ ) {
+ qu += " UID = " + QString::number( m_uids[i] ) + " OR";
+ }
+ qu.remove( qu.length()-2, 2 );
+ return qu;
+ }
@@ -263,2 +286,35 @@ OTodo OTodoAccessBackendSQL::find(int uid ) const{
}
+OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints,
+ uint cur, Frontend::CacheDirection dir ) const{
+ qWarning("searching for %d", uid );
+ QArray<int> search( 8 );
+ uint size =0;
+ OTodo to;
+
+ // we try to cache 8 items
+ switch( dir ) {
+ /* forward */
+ case 0:
+ for (uint i = cur; i < ints.count() && size < 8; i++ ) {
+ qWarning("size %d %d", size, ints[i] );
+ search[size] = ints[i];
+ size++;
+ }
+ break;
+ /* reverse */
+ case 1:
+ for (uint i = cur; i >= 0 && size < 8; i-- ) {
+ search[size] = ints[i];
+ size++;
+ }
+ break;
+ }
+ search.resize( size );
+ FindQuery query( search );
+ OSQLResult res = m_driver->query( &query );
+ if ( res.state() != OSQLResult::Success )
+ return to;
+
+ return todo( res );
+}
void OTodoAccessBackendSQL::clear() {
@@ -395,10 +451,23 @@ OTodo OTodoAccessBackendSQL::todo( const OSQLResult& res) const{
OSQLResultItem::ValueList::Iterator it = list.begin();
-
+ qWarning("todo1");
+ OTodo to = todo( (*it) );
+ cache( to );
+ ++it;
+
+ for ( ; it != list.end(); ++it ) {
+ qWarning("caching");
+ cache( todo( (*it) ) );
+ }
+ return to;
+}
+OTodo OTodoAccessBackendSQL::todo( OSQLResultItem& item )const {
+ qWarning("todo");
bool has = false; QDate da = QDate::currentDate();
- has = date( da, (*it).data("DueDate") );
- QStringList cats = QStringList::split(";", (*it).data("categories") );
+ has = date( da, item.data("DueDate") );
+ QStringList cats = QStringList::split(";", item.data("categories") );
- OTodo to( (bool)(*it).data("completed").toInt(), (*it).data("priority").toInt(),
- cats, (*it).data("summary"), (*it).data("description"),
- (*it).data("progress").toUShort(), has, da, (*it).data("uid").toInt() );
+ OTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(),
+ cats, item.data("summary"), item.data("description"),
+ item.data("progress").toUShort(), has, da,
+ item.data("uid").toInt() );
return to;
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
@@ -9,2 +9,3 @@ class OSQLDriver;
class OSQLResult;
+class OSQLResultItem;
class OTodoAccessBackendSQL : public OTodoAccessBackend {
@@ -21,2 +22,3 @@ public:
OTodo find(int uid)const;
+ OTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const;
void clear();
@@ -36,2 +38,3 @@ private:
inline OTodo todo( const OSQLResult& )const;
+ inline OTodo todo( OSQLResultItem& )const;
inline QArray<int> uids( const OSQLResult& )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
@@ -83,2 +83,3 @@ namespace {
FindQuery(int uid);
+ FindQuery(const QArray<int>& );
~FindQuery();
@@ -86,2 +87,5 @@ namespace {
private:
+ QString single()const;
+ QString multi()const;
+ QArray<int> m_uids;
int m_uid;
@@ -140,2 +144,3 @@ namespace {
QString InsertQuery::query()const{
+
int year, month, day;
@@ -177,2 +182,5 @@ namespace {
}
+ FindQuery::FindQuery(const QArray<int>& ints)
+ : OSQLQuery(), m_uids(ints){
+ }
FindQuery::~FindQuery() {
@@ -180,2 +188,8 @@ namespace {
QString FindQuery::query()const{
+ if (m_uids.count() == 0 )
+ return single();
+ else
+ return multi();
+ }
+ QString FindQuery::single()const{
QString qu = "select uid, categories, completed, progress, summary, ";
@@ -184,2 +198,11 @@ namespace {
}
+ QString FindQuery::multi()const {
+ QString qu = "select uid, categories, completed, progress, summary, ";
+ qu += "DueDate, priority, description from todolist where ";
+ for (uint i = 0; i < m_uids.count(); i++ ) {
+ qu += " UID = " + QString::number( m_uids[i] ) + " OR";
+ }
+ qu.remove( qu.length()-2, 2 );
+ return qu;
+ }
@@ -263,2 +286,35 @@ OTodo OTodoAccessBackendSQL::find(int uid ) const{
}
+OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints,
+ uint cur, Frontend::CacheDirection dir ) const{
+ qWarning("searching for %d", uid );
+ QArray<int> search( 8 );
+ uint size =0;
+ OTodo to;
+
+ // we try to cache 8 items
+ switch( dir ) {
+ /* forward */
+ case 0:
+ for (uint i = cur; i < ints.count() && size < 8; i++ ) {
+ qWarning("size %d %d", size, ints[i] );
+ search[size] = ints[i];
+ size++;
+ }
+ break;
+ /* reverse */
+ case 1:
+ for (uint i = cur; i >= 0 && size < 8; i-- ) {
+ search[size] = ints[i];
+ size++;
+ }
+ break;
+ }
+ search.resize( size );
+ FindQuery query( search );
+ OSQLResult res = m_driver->query( &query );
+ if ( res.state() != OSQLResult::Success )
+ return to;
+
+ return todo( res );
+}
void OTodoAccessBackendSQL::clear() {
@@ -395,10 +451,23 @@ OTodo OTodoAccessBackendSQL::todo( const OSQLResult& res) const{
OSQLResultItem::ValueList::Iterator it = list.begin();
-
+ qWarning("todo1");
+ OTodo to = todo( (*it) );
+ cache( to );
+ ++it;
+
+ for ( ; it != list.end(); ++it ) {
+ qWarning("caching");
+ cache( todo( (*it) ) );
+ }
+ return to;
+}
+OTodo OTodoAccessBackendSQL::todo( OSQLResultItem& item )const {
+ qWarning("todo");
bool has = false; QDate da = QDate::currentDate();
- has = date( da, (*it).data("DueDate") );
- QStringList cats = QStringList::split(";", (*it).data("categories") );
+ has = date( da, item.data("DueDate") );
+ QStringList cats = QStringList::split(";", item.data("categories") );
- OTodo to( (bool)(*it).data("completed").toInt(), (*it).data("priority").toInt(),
- cats, (*it).data("summary"), (*it).data("description"),
- (*it).data("progress").toUShort(), has, da, (*it).data("uid").toInt() );
+ OTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(),
+ cats, item.data("summary"), item.data("description"),
+ item.data("progress").toUShort(), has, da,
+ item.data("uid").toInt() );
return to;
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
@@ -9,2 +9,3 @@ class OSQLDriver;
class OSQLResult;
+class OSQLResultItem;
class OTodoAccessBackendSQL : public OTodoAccessBackend {
@@ -21,2 +22,3 @@ public:
OTodo find(int uid)const;
+ OTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const;
void clear();
@@ -36,2 +38,3 @@ private:
inline OTodo todo( const OSQLResult& )const;
+ inline OTodo todo( OSQLResultItem& )const;
inline QArray<int> uids( const OSQLResult& )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
@@ -63,3 +63,5 @@ void OPimCacheItem<T>::setRecord( const T& t ) {
template <class T>
-OPimCache<T>::OPimCache() {
+OPimCache<T>::OPimCache()
+ : m_cache(100, 53 )
+{
m_cache.setAutoDelete( TRUE );