-rw-r--r-- | libopie2/opiepim/backend/obackendfactory.h | 24 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 18 | ||||
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend.cpp | 34 | ||||
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend.h | 19 | ||||
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp | 231 | ||||
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend_sql.h | 2 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccesssql.cpp | 2 |
7 files changed, 268 insertions, 62 deletions
diff --git a/libopie2/opiepim/backend/obackendfactory.h b/libopie2/opiepim/backend/obackendfactory.h index 3567687..761ab9a 100644 --- a/libopie2/opiepim/backend/obackendfactory.h +++ b/libopie2/opiepim/backend/obackendfactory.h @@ -18,2 +18,14 @@ * $Log$ + * Revision 1.9 2003/12/22 10:19:26 eilers + * Finishing implementation of sql-backend for datebook. But I have to + * port the PIM datebook application to use it, before I could debug the + * whole stuff. + * Thus, PIM-Database backend is finished, but highly experimental. And some + * parts are still generic. For instance, the "queryByExample()" methods are + * not (or not fully) implemented. Todo: custom-entries not stored. + * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular + * expression search in the database, which is not supported by sqlite ! + * Therefore we need either an extended sqlite or a workaround which would + * be very slow and memory consuming.. + * * Revision 1.8 2003/09/22 14:31:16 eilers @@ -82,2 +94,3 @@ #include "ocontactaccessbackend_sql.h" +#include "odatebookaccessbackend_sql.h" #endif @@ -145,3 +158,3 @@ class OBackendFactory if ( backend == "sql" ) - qWarning ("OBackendFactory:: sql Backend not implemented! Using XML instead!"); + qWarning ("OBackendFactory:: sql Backend for TODO not implemented! Using XML instead!"); #endif @@ -155,3 +168,3 @@ class OBackendFactory if ( backend == "sql" ) - qWarning ("OBackendFactory:: sql Backend not implemented! Using XML instead!"); + qWarning ("OBackendFactory:: sql Backend for CONTACT not implemented! Using XML instead!"); #endif @@ -160,4 +173,9 @@ class OBackendFactory case DATE: +#ifdef __USE_SQL if ( backend == "sql" ) - qWarning("OBackendFactory:: sql Backend not implemented! Using XML instead!"); + return (T*) new ODateBookAccessBackend_SQL(""); +#else + if ( backend == "sql" ) + qWarning("OBackendFactory:: sql Backend for DATEBOOK not implemented! Using XML instead!"); +#endif diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index dd9dbde..a5be4c8 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp @@ -16,2 +16,14 @@ * $Log$ + * Revision 1.4 2003/12/22 10:19:26 eilers + * Finishing implementation of sql-backend for datebook. But I have to + * port the PIM datebook application to use it, before I could debug the + * whole stuff. + * Thus, PIM-Database backend is finished, but highly experimental. And some + * parts are still generic. For instance, the "queryByExample()" methods are + * not (or not fully) implemented. Todo: custom-entries not stored. + * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular + * expression search in the database, which is not supported by sqlite ! + * Therefore we need either an extended sqlite or a workaround which would + * be very slow and memory consuming.. + * * Revision 1.3 2003/12/08 15:18:10 eilers @@ -512,3 +524,3 @@ bool OContactAccessBackend_SQL::save() { - return m_driver->close(); + return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) } @@ -520,4 +532,4 @@ void OContactAccessBackend_SQL::clear () OSQLResult res = m_driver->query( &cle ); - CreateQuery qu; - res = m_driver->query(&qu); + + reload(); } diff --git a/libopie2/opiepim/backend/odatebookaccessbackend.cpp b/libopie2/opiepim/backend/odatebookaccessbackend.cpp index 8fa1a68..f0c5d65 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend.cpp +++ b/libopie2/opiepim/backend/odatebookaccessbackend.cpp @@ -129,3 +129,3 @@ ODateBookAccessBackend::~ODateBookAccessBackend() { } -OEffectiveEvent::ValueList ODateBookAccessBackend::effecticeEvents( const QDate& from, +OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveEvents( const QDate& from, const QDate& to ) { @@ -137,3 +137,3 @@ OEffectiveEvent::ValueList ODateBookAccessBackend::effecticeEvents( const QDate& - list = directRawRepeats(); + list = directRawRepeats(); // Useless, isn't it ? (eilers) @@ -142,4 +142,30 @@ OEffectiveEvent::ValueList ODateBookAccessBackend::effecticeEvents( const QDate& } -OEffectiveEvent::ValueList ODateBookAccessBackend::effecticeEvents( const QDateTime& dt ) { - OEffectiveEvent::ValueList day = effecticeEvents( dt.date(), dt.date() ); +OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveEvents( const QDateTime& dt ) { + OEffectiveEvent::ValueList day = effectiveEvents( dt.date(), dt.date() ); + OEffectiveEvent::ValueList::Iterator it; + + OEffectiveEvent::ValueList tmpList; + QDateTime dtTmp; + for ( it = day.begin(); it != day.end(); ++it ) { + dtTmp = QDateTime( (*it).date(), (*it).startTime() ); + if ( QABS(dt.secsTo(dtTmp) ) < 60 ) + tmpList.append( (*it) ); + } + + return tmpList; +} + +OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDate& from, + const QDate& to ) { + OEffectiveEvent::ValueList tmpList; + OEvent::ValueList list = directNonRepeats(); + + events( tmpList, list, from, to ); + + qHeapSort( tmpList ); + return tmpList; +} + +OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDateTime& dt ) { + OEffectiveEvent::ValueList day = effectiveNonRepeatingEvents( dt.date(), dt.date() ); OEffectiveEvent::ValueList::Iterator it; diff --git a/libopie2/opiepim/backend/odatebookaccessbackend.h b/libopie2/opiepim/backend/odatebookaccessbackend.h index 3c02c42..3472ab3 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend.h +++ b/libopie2/opiepim/backend/odatebookaccessbackend.h @@ -62,3 +62,3 @@ public: */ - virtual OEffectiveEvent::ValueList effecticeEvents( const QDate& from, const QDate& to ); + virtual OEffectiveEvent::ValueList effectiveEvents( const QDate& from, const QDate& to ); @@ -66,5 +66,18 @@ public: * this is an overloaded member function - * @see effecticeEvents + * @see effectiveEvents( const QDate& from, const QDate& to ) */ - virtual OEffectiveEvent::ValueList effecticeEvents( const QDateTime& start ); + virtual OEffectiveEvent::ValueList effectiveEvents( const QDateTime& start ); + + /** + * Effective Events are special event occuring during a time frame. This method does calcualte + * EffectiveEvents bases on the directNonRepeats and directRawRepeats. You may implement this method + * yourself + */ + virtual OEffectiveEvent::ValueList effectiveNonRepeatingEvents( const QDate& from, const QDate& to ); + + /** + * this is an overloaded member function + * @see effectiveNonRepeatingEvents( const QDate& from, const QDate& to ) + */ + virtual OEffectiveEvent::ValueList effectiveNonRepeatingEvents( const QDateTime& start ); diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp index 9769bf7..e893b38 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp @@ -16,2 +16,14 @@ * $Log$ + * Revision 1.2 2003/12/22 10:19:26 eilers + * Finishing implementation of sql-backend for datebook. But I have to + * port the PIM datebook application to use it, before I could debug the + * whole stuff. + * Thus, PIM-Database backend is finished, but highly experimental. And some + * parts are still generic. For instance, the "queryByExample()" methods are + * not (or not fully) implemented. Todo: custom-entries not stored. + * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular + * expression search in the database, which is not supported by sqlite ! + * Therefore we need either an extended sqlite or a workaround which would + * be very slow and memory consuming.. + * * Revision 1.1 2003/12/08 15:18:12 eilers @@ -28,7 +40,5 @@ -#include "orecur.h" -#include "odatebookaccessbackend_sql.h" +#include <qpe/global.h> #include <opie2/osqldriver.h> -#include <opie2/osqlresult.h> #include <opie2/osqlmanager.h> @@ -36,7 +46,6 @@ -namespace { - +#include "orecur.h" +#include "odatebookaccessbackend_sql.h" -}; @@ -46,3 +55,3 @@ ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& , { - m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName; + m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName; @@ -59,2 +68,4 @@ ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& , ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() { + if( m_driver ) + delete m_driver; } @@ -80,3 +91,3 @@ void ODateBookAccessBackend_SQL::initFields() m_fieldMap.insert( OEvent::FRCreated, "RCreated" ); - m_fieldMap.insert( OEvent::FRExeptions, "RExceptions" ); + m_fieldMap.insert( OEvent::FRExceptions, "RExceptions" ); m_fieldMap.insert( OEvent::FStart, "Start" ); @@ -87,2 +98,9 @@ void ODateBookAccessBackend_SQL::initFields() m_fieldMap.insert( OEvent::FRecChildren, "Recchildren" ); + + // Create a map that maps the column name to the id + QMapConstIterator<int, QString> it; + for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ + m_reverseFieldMap.insert( it.data(), it.key() ); + } + } @@ -101,3 +119,3 @@ bool ODateBookAccessBackend_SQL::load() for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ - qu += QString( ",\"%1\" VARCHAR(10)" ).arg( it.data() ); + qu += QString( ",%1 VARCHAR(10)" ).arg( it.data() ); } @@ -107,2 +125,4 @@ bool ODateBookAccessBackend_SQL::load() + qWarning( "command: %s", qu.latin1() ); + OSQLRawQuery raw( qu ); @@ -124,3 +144,3 @@ void ODateBookAccessBackend_SQL::update() if ( res.state() != OSQLResult::Success ){ - m_uids.clear(); + // m_uids.clear(); return; @@ -132,24 +152,5 @@ void ODateBookAccessBackend_SQL::update() -QArray<int> ODateBookAccessBackend_SQL::extractUids( OSQLResult& res ) const -{ - qWarning("extractUids"); - - OSQLResultItem::ValueList list = res.results(); - OSQLResultItem::ValueList::Iterator it; - QArray<int> ints(list.count() ); - qWarning(" count = %d", list.count() ); - - int i = 0; - for (it = list.begin(); it != list.end(); ++it ) { - ints[i] = (*it).data("uid").toInt(); - i++; - } - - return ints; - -} - bool ODateBookAccessBackend_SQL::reload() { - return load(); + return load(); } @@ -158,3 +159,3 @@ bool ODateBookAccessBackend_SQL::save() { - return m_driver->close(); + return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) } @@ -163,3 +164,3 @@ QArray<int> ODateBookAccessBackend_SQL::allRecords()const { - return m_uids; + return m_uids; } @@ -167,3 +168,3 @@ QArray<int> ODateBookAccessBackend_SQL::allRecords()const QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OEvent&, int, const QDateTime& ) { - return QArray<int>(); + return QArray<int>(); } @@ -178,2 +179,3 @@ void ODateBookAccessBackend_SQL::clear() + reload(); } @@ -182,12 +184,86 @@ void ODateBookAccessBackend_SQL::clear() OEvent ODateBookAccessBackend_SQL::find( int uid ) const{ + QString qu = "select *"; + qu += "from datebook where uid = " + QString::number(uid); + + OSQLRawQuery raw( qu ); + OSQLResult res = m_driver->query( &raw ); + + OSQLResultItem resItem = res.first(); + + // Create Map for date event and insert UID + QMap<int,QString> dateEventMap; + dateEventMap.insert( OEvent::FUid, QString::number( uid ) ); + + // Now insert the data out of the columns into the map. + QMapConstIterator<int, QString> it; + for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ + dateEventMap.insert( m_reverseFieldMap[*it], resItem.data( *it ) ); + } + + // Last step: Put map into date event and return it + OEvent retDate( dateEventMap ); + + return retDate; } -bool ODateBookAccessBackend_SQL::add( const OEvent& ev ) { - return true; +bool ODateBookAccessBackend_SQL::add( const OEvent& ev ) +{ + QMap<int,QString> eventMap = ev.toMap(); + + QString qu = "insert into datebook VALUES( " + QString::number( ev.uid() ); + QMap<int, QString>::Iterator it; + for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ + if ( !eventMap[it.key()].isEmpty() ) + qu += QString( ",\"%1\"" ).arg( eventMap[it.key()] ); + else + qu += QString( ",\"\"" ); + } + qu += " );"; + + // Add custom entries + int id = 0; + QMap<QString, QString> customMap = ev.toExtraMap(); + for( QMap<QString, QString>::Iterator it = customMap.begin(); + it != customMap.end(); ++it ){ + qu += "insert into custom_data VALUES(" + + QString::number( ev.uid() ) + + "," + + QString::number( id++ ) + + ",'" + + it.key() //.latin1() + + "'," + + "0" // Priority for future enhancements + + ",'" + + it.data() //.latin1() + + "');"; + } + qWarning("add %s", qu.latin1() ); + + OSQLRawQuery raw( qu ); + OSQLResult res = m_driver->query( &raw ); + if ( res.state() != OSQLResult::Success ){ + return false; + } + + return true; } -bool ODateBookAccessBackend_SQL::remove( int uid ) { - return true; +bool ODateBookAccessBackend_SQL::remove( int uid ) +{ + QString qu = "DELETE from datebook where uid = " + + QString::number( uid ) + ";"; + qu += "DELETE from custom_data where uid = " + + QString::number( uid ) + ";"; + + OSQLRawQuery raw( qu ); + OSQLResult res = m_driver->query( &raw ); + if ( res.state() != OSQLResult::Success ){ + return false; + } + + return true; } -bool ODateBookAccessBackend_SQL::replace( const OEvent& ev ) { + +bool ODateBookAccessBackend_SQL::replace( const OEvent& ev ) +{ remove( ev.uid() ); @@ -195,20 +271,56 @@ bool ODateBookAccessBackend_SQL::replace( const OEvent& ev ) { } -QArray<int> ODateBookAccessBackend_SQL::rawEvents()const { + +QArray<int> ODateBookAccessBackend_SQL::rawEvents()const +{ return allRecords(); } -QArray<int> ODateBookAccessBackend_SQL::rawRepeats()const { - return ints; +QArray<int> ODateBookAccessBackend_SQL::rawRepeats()const +{ + QString qu = "select uid from datebook where RType!=\"\" AND RType!=\"NoRepeat\""; + OSQLRawQuery raw( qu ); + OSQLResult res = m_driver->query( &raw ); + if ( res.state() != OSQLResult::Success ){ + QArray<int> nix; + return nix; + } + + return extractUids( res ); } -QArray<int> ODateBookAccessBackend_SQL::nonRepeats()const { - return ints; +QArray<int> ODateBookAccessBackend_SQL::nonRepeats()const +{ + QString qu = "select uid from datebook where RType=\"\" or RType=\"NoRepeat\""; + OSQLRawQuery raw( qu ); + OSQLResult res = m_driver->query( &raw ); + if ( res.state() != OSQLResult::Success ){ + QArray<int> nix; + return nix; + } + + return extractUids( res ); } -OEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats() { - return list; +OEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats() +{ + QArray<int> nonRepUids = nonRepeats(); + OEvent::ValueList list; + + for (uint i = 0; i < nonRepUids.count(); ++i ){ + list.append( find( nonRepUids[i] ) ); + } + + return list; + } -OEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats() { +OEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats() +{ + QArray<int> rawRepUids = rawRepeats(); + OEvent::ValueList list; - return list; + for (uint i = 0; i < rawRepUids.count(); ++i ){ + list.append( find( rawRepUids[i] ) ); + } + + return list; } @@ -218,4 +330,27 @@ QArray<int> ODateBookAccessBackend_SQL::matchRegexp( const QRegExp &r ) const { + QArray<int> null; + return null; +} + +/* ===== Private Functions ========================================== */ + +QArray<int> ODateBookAccessBackend_SQL::extractUids( OSQLResult& res ) const +{ + qWarning("extractUids"); + QTime t; + t.start(); + OSQLResultItem::ValueList list = res.results(); + OSQLResultItem::ValueList::Iterator it; + QArray<int> ints(list.count() ); + qWarning(" count = %d", list.count() ); + + int i = 0; + for (it = list.begin(); it != list.end(); ++it ) { + ints[i] = (*it).data("uid").toInt(); + i++; + } + qWarning("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() ); + + return ints; - return m_currentQuery; } diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_sql.h b/libopie2/opiepim/backend/odatebookaccessbackend_sql.h index 85e0d4f..f39e154 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend_sql.h +++ b/libopie2/opiepim/backend/odatebookaccessbackend_sql.h @@ -4,2 +4,3 @@ #include <qmap.h> +#include <opie2/osqlresult.h> @@ -47,2 +48,3 @@ private: QMap<int, QString> m_fieldMap; + QMap<QString, int> m_reverseFieldMap; diff --git a/libopie2/opiepim/backend/otodoaccesssql.cpp b/libopie2/opiepim/backend/otodoaccesssql.cpp index 75a0860..3764c7e 100644 --- a/libopie2/opiepim/backend/otodoaccesssql.cpp +++ b/libopie2/opiepim/backend/otodoaccesssql.cpp @@ -332,3 +332,3 @@ bool OTodoAccessBackendSQL::reload(){ bool OTodoAccessBackendSQL::save(){ - return m_driver->close(); + return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) } |