author | eilers <eilers> | 2004-05-08 12:38:51 (UTC) |
---|---|---|
committer | eilers <eilers> | 2004-05-08 12:38:51 (UTC) |
commit | 81bc0cecdeb7c49f4f2950c1e5649bad05593d0c (patch) (unidiff) | |
tree | b687e3562c432414df407d5d4e776b7c785588a3 | |
parent | 91eccd3d535a8fb0022865bd1e1c100628a65431 (diff) | |
download | opie-81bc0cecdeb7c49f4f2950c1e5649bad05593d0c.zip opie-81bc0cecdeb7c49f4f2950c1e5649bad05593d0c.tar.gz opie-81bc0cecdeb7c49f4f2950c1e5649bad05593d0c.tar.bz2 |
Fixed a lot of worse bugs in the databook-backend for SQL.
It was found by doing equivalence checks between events, moved between xml
and sql backend, using opimconverter..
More bugfixes will follow..
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp | 2 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimevent.cpp | 36 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimevent.h | 2 |
3 files changed, 24 insertions, 16 deletions
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp index 6c32b40..f4f3c94 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp | |||
@@ -125,33 +125,33 @@ void ODateBookAccessBackend_SQL::initFields() | |||
125 | m_fieldMap.insert( OPimEvent::FRWeekdays, "RWeekdays" ); | 125 | m_fieldMap.insert( OPimEvent::FRWeekdays, "RWeekdays" ); |
126 | m_fieldMap.insert( OPimEvent::FRPosition, "RPosition" ); | 126 | m_fieldMap.insert( OPimEvent::FRPosition, "RPosition" ); |
127 | m_fieldMap.insert( OPimEvent::FRFreq, "RFreq" ); | 127 | m_fieldMap.insert( OPimEvent::FRFreq, "RFreq" ); |
128 | m_fieldMap.insert( OPimEvent::FRHasEndDate, "RHasEndDate" ); | 128 | m_fieldMap.insert( OPimEvent::FRHasEndDate, "RHasEndDate" ); |
129 | m_fieldMap.insert( OPimEvent::FREndDate, "REndDate" ); | 129 | m_fieldMap.insert( OPimEvent::FREndDate, "REndDate" ); |
130 | m_fieldMap.insert( OPimEvent::FRCreated, "RCreated" ); | 130 | m_fieldMap.insert( OPimEvent::FRCreated, "RCreated" ); |
131 | m_fieldMap.insert( OPimEvent::FRExceptions, "RExceptions" ); | 131 | m_fieldMap.insert( OPimEvent::FRExceptions, "RExceptions" ); |
132 | m_fieldMap.insert( OPimEvent::FStart, "Start" ); | 132 | m_fieldMap.insert( OPimEvent::FStart, "Start" ); |
133 | m_fieldMap.insert( OPimEvent::FEnd, "End" ); | 133 | m_fieldMap.insert( OPimEvent::FEnd, "End" ); |
134 | m_fieldMap.insert( OPimEvent::FNote, "Note" ); | 134 | m_fieldMap.insert( OPimEvent::FNote, "Note" ); |
135 | m_fieldMap.insert( OPimEvent::FTimeZone, "TimeZone" ); | 135 | m_fieldMap.insert( OPimEvent::FTimeZone, "TimeZone" ); |
136 | m_fieldMap.insert( OPimEvent::FRecParent, "RecParent" ); | 136 | m_fieldMap.insert( OPimEvent::FRecParent, "RecParent" ); |
137 | m_fieldMap.insert( OPimEvent::FRecChildren, "Recchildren" ); | 137 | m_fieldMap.insert( OPimEvent::FRecChildren, "Recchildren" ); |
138 | 138 | ||
139 | // Create a map that maps the column name to the id | 139 | // Create a map that maps the column name to the id |
140 | QMapConstIterator<int, QString> it; | 140 | QMapConstIterator<int, QString> it; |
141 | for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ | 141 | for ( it = m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ |
142 | m_reverseFieldMap.insert( it.data(), it.key() ); | 142 | m_reverseFieldMap.insert( it.data(), it.key() ); |
143 | } | 143 | } |
144 | 144 | ||
145 | } | 145 | } |
146 | 146 | ||
147 | bool ODateBookAccessBackend_SQL::load() | 147 | bool ODateBookAccessBackend_SQL::load() |
148 | { | 148 | { |
149 | if (!m_driver->open() ) | 149 | if (!m_driver->open() ) |
150 | return false; | 150 | return false; |
151 | 151 | ||
152 | // Don't expect that the database exists. | 152 | // Don't expect that the database exists. |
153 | // It is save here to create the table, even if it | 153 | // It is save here to create the table, even if it |
154 | // do exist. ( Is that correct for all databases ?? ) | 154 | // do exist. ( Is that correct for all databases ?? ) |
155 | QStringqu = "create table datebook( uid INTEGER PRIMARY KEY "; | 155 | QStringqu = "create table datebook( uid INTEGER PRIMARY KEY "; |
156 | 156 | ||
157 | QMap<int, QString>::Iterator it; | 157 | QMap<int, QString>::Iterator it; |
diff --git a/libopie2/opiepim/core/opimevent.cpp b/libopie2/opiepim/core/opimevent.cpp index 8bf8b25..9d46651 100644 --- a/libopie2/opiepim/core/opimevent.cpp +++ b/libopie2/opiepim/core/opimevent.cpp | |||
@@ -542,35 +542,38 @@ void OPimEvent::deref() | |||
542 | } | 542 | } |
543 | } | 543 | } |
544 | // Exporting Event data to map. Using the same | 544 | // Exporting Event data to map. Using the same |
545 | // encoding as ODateBookAccessBackend_xml does.. | 545 | // encoding as ODateBookAccessBackend_xml does.. |
546 | // Thus, we could remove the stuff there and use this | 546 | // Thus, we could remove the stuff there and use this |
547 | // for it and for all other places.. | 547 | // for it and for all other places.. |
548 | // Encoding should happen at one place, only ! (eilers) | 548 | // Encoding should happen at one place, only ! (eilers) |
549 | QMap<int, QString> OPimEvent::toMap() const | 549 | QMap<int, QString> OPimEvent::toMap() const |
550 | { | 550 | { |
551 | QMap<int, QString> retMap; | 551 | QMap<int, QString> retMap; |
552 | 552 | ||
553 | retMap.insert( OPimEvent::FUid, QString::number( uid() ) ); | 553 | retMap.insert( OPimEvent::FUid, QString::number( uid() ) ); |
554 | retMap.insert( OPimEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) ) ); | 554 | retMap.insert( OPimEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) ) ); |
555 | retMap.insert( OPimEvent::FDescription, Qtopia::escapeString( description() ) ); | 555 | retMap.insert( OPimEvent::FDescription, Qtopia::escapeString( description() ) ); |
556 | retMap.insert( OPimEvent::FLocation, Qtopia::escapeString( location() ) ); | 556 | retMap.insert( OPimEvent::FLocation, Qtopia::escapeString( location() ) ); |
557 | retMap.insert( OPimEvent::FType, isAllDay() ? "AllDay" : "" ); | 557 | retMap.insert( OPimEvent::FType, isAllDay() ? "AllDay" : "" ); |
558 | OPimAlarm alarm = notifiers().alarms() [ 0 ]; | 558 | if ( notifiers().alarms().count() ){ |
559 | retMap.insert( OPimEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) ); | 559 | // Currently we just support one alarm.. (eilers) |
560 | retMap.insert( OPimEvent::FSound, ( alarm.sound() == OPimAlarm::Loud ) ? "loud" : "silent" ); | 560 | OPimAlarm alarm = notifiers().alarms() [ 0 ]; |
561 | retMap.insert( OPimEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) ); | ||
562 | retMap.insert( OPimEvent::FSound, ( alarm.sound() == OPimAlarm::Loud ) ? "loud" : "silent" ); | ||
563 | } | ||
561 | 564 | ||
562 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); | 565 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); |
563 | retMap.insert( OPimEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OPimTimeZone::utc() ) ) ) ); | 566 | retMap.insert( OPimEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OPimTimeZone::utc() ) ) ) ); |
564 | retMap.insert( OPimEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OPimTimeZone::utc() ) ) ) ); | 567 | retMap.insert( OPimEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OPimTimeZone::utc() ) ) ) ); |
565 | retMap.insert( OPimEvent::FNote, Qtopia::escapeString( note() ) ); | 568 | retMap.insert( OPimEvent::FNote, Qtopia::escapeString( note() ) ); |
566 | retMap.insert( OPimEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() ); | 569 | retMap.insert( OPimEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() ); |
567 | if ( parent() ) | 570 | if ( parent() ) |
568 | retMap.insert( OPimEvent::FRecParent, QString::number( parent() ) ); | 571 | retMap.insert( OPimEvent::FRecParent, QString::number( parent() ) ); |
569 | if ( children().count() ) | 572 | if ( children().count() ) |
570 | { | 573 | { |
571 | QArray<int> childr = children(); | 574 | QArray<int> childr = children(); |
572 | QString buf; | 575 | QString buf; |
573 | for ( uint i = 0; i < childr.count(); i++ ) | 576 | for ( uint i = 0; i < childr.count(); i++ ) |
574 | { | 577 | { |
575 | if ( i != 0 ) buf += " "; | 578 | if ( i != 0 ) buf += " "; |
576 | buf += QString::number( childr[ i ] ); | 579 | buf += QString::number( childr[ i ] ); |
@@ -606,72 +609,77 @@ QMap<int, QString> OPimEvent::toMap() const | |||
606 | void OPimEvent::fromMap( const QMap<int, QString>& map ) | 609 | void OPimEvent::fromMap( const QMap<int, QString>& map ) |
607 | { | 610 | { |
608 | 611 | ||
609 | // We just want to set the UID if it is really stored. | 612 | // We just want to set the UID if it is really stored. |
610 | if ( !map[ OPimEvent::FUid ].isEmpty() ) | 613 | if ( !map[ OPimEvent::FUid ].isEmpty() ) |
611 | setUid( map[ OPimEvent::FUid ].toInt() ); | 614 | setUid( map[ OPimEvent::FUid ].toInt() ); |
612 | 615 | ||
613 | setCategories( idsFromString( map[ OPimEvent::FCategories ] ) ); | 616 | setCategories( idsFromString( map[ OPimEvent::FCategories ] ) ); |
614 | setDescription( map[ OPimEvent::FDescription ] ); | 617 | setDescription( map[ OPimEvent::FDescription ] ); |
615 | setLocation( map[ OPimEvent::FLocation ] ); | 618 | setLocation( map[ OPimEvent::FLocation ] ); |
616 | 619 | ||
617 | if ( map[ OPimEvent::FType ] == "AllDay" ) | 620 | if ( map[ OPimEvent::FType ] == "AllDay" ) |
618 | setAllDay( true ); | 621 | setAllDay( true ); |
619 | else | 622 | else |
620 | setAllDay( false ); | 623 | setAllDay( false ); |
621 | 624 | ||
622 | int alarmTime = -1; | ||
623 | if ( !map[ OPimEvent::FAlarm ].isEmpty() ) | ||
624 | alarmTime = map[ OPimEvent::FAlarm ].toInt(); | ||
625 | |||
626 | int sound = ( ( map[ OPimEvent::FSound ] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent ); | ||
627 | if ( ( alarmTime != -1 ) ) | ||
628 | { | ||
629 | QDateTime dt = startDateTime().addSecs( -1 * alarmTime * 60 ); | ||
630 | OPimAlarm al( sound , dt ); | ||
631 | notifiers().add( al ); | ||
632 | } | ||
633 | if ( !map[ OPimEvent::FTimeZone ].isEmpty() && ( map[ OPimEvent::FTimeZone ] != "None" ) ) | 625 | if ( !map[ OPimEvent::FTimeZone ].isEmpty() && ( map[ OPimEvent::FTimeZone ] != "None" ) ) |
634 | { | 626 | { |
635 | setTimeZone( map[ OPimEvent::FTimeZone ] ); | 627 | setTimeZone( map[ OPimEvent::FTimeZone ] ); |
636 | } | 628 | } |
637 | 629 | ||
638 | time_t start = ( time_t ) map[ OPimEvent::FStart ].toLong(); | 630 | time_t start = ( time_t ) map[ OPimEvent::FStart ].toLong(); |
639 | time_t end = ( time_t ) map[ OPimEvent::FEnd ].toLong(); | 631 | time_t end = ( time_t ) map[ OPimEvent::FEnd ].toLong(); |
640 | 632 | ||
641 | /* AllDay is always in UTC */ | 633 | /* AllDay is always in UTC */ |
642 | if ( isAllDay() ) | 634 | if ( isAllDay() ) |
643 | { | 635 | { |
644 | OPimTimeZone utc = OPimTimeZone::utc(); | 636 | OPimTimeZone utc = OPimTimeZone::utc(); |
645 | setStartDateTime( utc.fromUTCDateTime( start ) ); | 637 | setStartDateTime( utc.fromUTCDateTime( start ) ); |
646 | setEndDateTime ( utc.fromUTCDateTime( end ) ); | 638 | setEndDateTime ( utc.fromUTCDateTime( end ) ); |
647 | setTimeZone( "UTC" ); // make sure it is really utc | 639 | setTimeZone( "UTC" ); // make sure it is really utc |
648 | } | 640 | } |
649 | else | 641 | else |
650 | { | 642 | { |
651 | /* to current date time */ | 643 | /* to current date time */ |
652 | // qWarning(" Start is %d", start ); | 644 | // qWarning(" Start is %d", start ); |
653 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); | 645 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); |
654 | QDateTime date = zone.toDateTime( start ); | 646 | QDateTime date = zone.toDateTime( start ); |
655 | qWarning( " Start is %s", date.toString().latin1() ); | 647 | qWarning( " Start is %s", date.toString().latin1() ); |
656 | setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) ); | 648 | setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) ); |
657 | 649 | ||
658 | date = zone.toDateTime( end ); | 650 | date = zone.toDateTime( end ); |
659 | setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) ); | 651 | setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) ); |
660 | } | 652 | } |
661 | 653 | ||
654 | int alarmTime = -1; | ||
655 | if ( !map[ OPimEvent::FAlarm ].isEmpty() ) | ||
656 | alarmTime = map[ OPimEvent::FAlarm ].toInt(); | ||
657 | |||
658 | int sound = ( ( map[ OPimEvent::FSound ] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent ); | ||
659 | if ( ( alarmTime != -1 ) ) | ||
660 | { | ||
661 | QDateTime dt = startDateTime().addSecs( -1 * alarmTime * 60 ); | ||
662 | OPimAlarm al( sound , dt ); | ||
663 | notifiers().add( al ); | ||
664 | } | ||
665 | |||
666 | |||
667 | if ( !map[ OPimEvent::FNote ].isEmpty() ) | ||
668 | setNote( map[ OPimEvent::FNote ] ); | ||
669 | |||
662 | if ( !map[ OPimEvent::FRecParent ].isEmpty() ) | 670 | if ( !map[ OPimEvent::FRecParent ].isEmpty() ) |
663 | setParent( map[ OPimEvent::FRecParent ].toInt() ); | 671 | setParent( map[ OPimEvent::FRecParent ].toInt() ); |
664 | 672 | ||
665 | if ( !map[ OPimEvent::FRecChildren ].isEmpty() ) | 673 | if ( !map[ OPimEvent::FRecChildren ].isEmpty() ) |
666 | { | 674 | { |
667 | QStringList list = QStringList::split( ' ', map[ OPimEvent::FRecChildren ] ); | 675 | QStringList list = QStringList::split( ' ', map[ OPimEvent::FRecChildren ] ); |
668 | for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) | 676 | for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) |
669 | { | 677 | { |
670 | addChild( ( *it ).toInt() ); | 678 | addChild( ( *it ).toInt() ); |
671 | } | 679 | } |
672 | } | 680 | } |
673 | 681 | ||
674 | // Fill recurrence stuff and put it directly into the OPimRecurrence-Object using fromMap.. | 682 | // Fill recurrence stuff and put it directly into the OPimRecurrence-Object using fromMap.. |
675 | if ( !map[ OPimEvent::FRType ].isEmpty() ) | 683 | if ( !map[ OPimEvent::FRType ].isEmpty() ) |
676 | { | 684 | { |
677 | QMap<int, QString> recFields; | 685 | QMap<int, QString> recFields; |
diff --git a/libopie2/opiepim/core/opimevent.h b/libopie2/opiepim/core/opimevent.h index 56fe917..5553cac 100644 --- a/libopie2/opiepim/core/opimevent.h +++ b/libopie2/opiepim/core/opimevent.h | |||
@@ -66,33 +66,33 @@ class OPimRecurrence; | |||
66 | /** | 66 | /** |
67 | * This is the container for all Events. It encapsules all | 67 | * This is the container for all Events. It encapsules all |
68 | * available information for a single Event | 68 | * available information for a single Event |
69 | * @short container for events. | 69 | * @short container for events. |
70 | */ | 70 | */ |
71 | class OPimEvent : public OPimRecord | 71 | class OPimEvent : public OPimRecord |
72 | { | 72 | { |
73 | public: | 73 | public: |
74 | typedef QValueList<OPimEvent> ValueList; | 74 | typedef QValueList<OPimEvent> ValueList; |
75 | /** | 75 | /** |
76 | * RecordFields contain possible attributes | 76 | * RecordFields contain possible attributes |
77 | * used in the Results of toMap().. | 77 | * used in the Results of toMap().. |
78 | */ | 78 | */ |
79 | enum RecordFields { | 79 | enum RecordFields { |
80 | FUid = Qtopia::UID_ID, | 80 | FUid = Qtopia::UID_ID, |
81 | FCategories = Qtopia::CATEGORY_ID, | 81 | FCategories = Qtopia::CATEGORY_ID, |
82 | FDescription = 0, | 82 | FDescription /* = 0 Why this ? (eilers) */, |
83 | FLocation, | 83 | FLocation, |
84 | FType, | 84 | FType, |
85 | FAlarm, | 85 | FAlarm, |
86 | FSound, | 86 | FSound, |
87 | FRType, | 87 | FRType, |
88 | FRWeekdays, | 88 | FRWeekdays, |
89 | FRPosition, | 89 | FRPosition, |
90 | FRFreq, | 90 | FRFreq, |
91 | FRHasEndDate, | 91 | FRHasEndDate, |
92 | FREndDate, | 92 | FREndDate, |
93 | FRCreated, | 93 | FRCreated, |
94 | FRExceptions, | 94 | FRExceptions, |
95 | FStart, | 95 | FStart, |
96 | FEnd, | 96 | FEnd, |
97 | FNote, | 97 | FNote, |
98 | FTimeZone, | 98 | FTimeZone, |