-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 5 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.h | 4 | ||||
-rw-r--r-- | libopie2/opiepim/backend/opimaccessbackend.h | 22 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccesssql.cpp | 20 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccesssql.h | 2 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimaccesstemplate.h | 4 |
6 files changed, 25 insertions, 32 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index abfd944..221e977 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | |||
@@ -749,202 +749,205 @@ QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) | |||
749 | 749 | ||
750 | // odebug << "sorted query is: " << query << "" << oendl; | 750 | // odebug << "sorted query is: " << query << "" << oendl; |
751 | 751 | ||
752 | OSQLRawQuery raw( query ); | 752 | OSQLRawQuery raw( query ); |
753 | OSQLResult res = m_driver->query( &raw ); | 753 | OSQLResult res = m_driver->query( &raw ); |
754 | if ( res.state() != OSQLResult::Success ){ | 754 | if ( res.state() != OSQLResult::Success ){ |
755 | QArray<int> empty; | 755 | QArray<int> empty; |
756 | return empty; | 756 | return empty; |
757 | } | 757 | } |
758 | 758 | ||
759 | QArray<int> list = extractUids( res ); | 759 | QArray<int> list = extractUids( res ); |
760 | 760 | ||
761 | odebug << "sorted needed " << t.elapsed() << " ms!" << oendl; | 761 | odebug << "sorted needed " << t.elapsed() << " ms!" << oendl; |
762 | return list; | 762 | return list; |
763 | } | 763 | } |
764 | 764 | ||
765 | 765 | ||
766 | void OPimContactAccessBackend_SQL::update() | 766 | void OPimContactAccessBackend_SQL::update() |
767 | { | 767 | { |
768 | odebug << "Update starts" << oendl; | 768 | odebug << "Update starts" << oendl; |
769 | QTime t; | 769 | QTime t; |
770 | t.start(); | 770 | t.start(); |
771 | 771 | ||
772 | // Now load the database set and extract the uid's | 772 | // Now load the database set and extract the uid's |
773 | // which will be held locally | 773 | // which will be held locally |
774 | 774 | ||
775 | LoadQuery lo; | 775 | LoadQuery lo; |
776 | OSQLResult res = m_driver->query(&lo); | 776 | OSQLResult res = m_driver->query(&lo); |
777 | if ( res.state() != OSQLResult::Success ) | 777 | if ( res.state() != OSQLResult::Success ) |
778 | return; | 778 | return; |
779 | 779 | ||
780 | m_uids = extractUids( res ); | 780 | m_uids = extractUids( res ); |
781 | 781 | ||
782 | m_changed = false; | 782 | m_changed = false; |
783 | 783 | ||
784 | odebug << "Update ends " << t.elapsed() << " ms" << oendl; | 784 | odebug << "Update ends " << t.elapsed() << " ms" << oendl; |
785 | } | 785 | } |
786 | 786 | ||
787 | QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const | 787 | QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const |
788 | { | 788 | { |
789 | odebug << "extractUids" << oendl; | 789 | odebug << "extractUids" << oendl; |
790 | QTime t; | 790 | QTime t; |
791 | t.start(); | 791 | t.start(); |
792 | OSQLResultItem::ValueList list = res.results(); | 792 | OSQLResultItem::ValueList list = res.results(); |
793 | OSQLResultItem::ValueList::Iterator it; | 793 | OSQLResultItem::ValueList::Iterator it; |
794 | QArray<int> ints(list.count() ); | 794 | QArray<int> ints(list.count() ); |
795 | odebug << " count = " << list.count() << "" << oendl; | 795 | odebug << " count = " << list.count() << "" << oendl; |
796 | 796 | ||
797 | int i = 0; | 797 | int i = 0; |
798 | for (it = list.begin(); it != list.end(); ++it ) { | 798 | for (it = list.begin(); it != list.end(); ++it ) { |
799 | ints[i] = (*it).data("uid").toInt(); | 799 | ints[i] = (*it).data("uid").toInt(); |
800 | i++; | 800 | i++; |
801 | } | 801 | } |
802 | odebug << "extractUids ready: count2 = " << i << " needs " << t.elapsed() << " ms" << oendl; | 802 | odebug << "extractUids ready: count2 = " << i << " needs " << t.elapsed() << " ms" << oendl; |
803 | 803 | ||
804 | return ints; | 804 | return ints; |
805 | 805 | ||
806 | } | 806 | } |
807 | 807 | ||
808 | QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const | 808 | QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const |
809 | { | 809 | { |
810 | QTime t; | 810 | QTime t; |
811 | t.start(); | 811 | t.start(); |
812 | 812 | ||
813 | int t2needed = 0; | 813 | int t2needed = 0; |
814 | int t3needed = 0; | 814 | int t3needed = 0; |
815 | QTime t2; | 815 | QTime t2; |
816 | t2.start(); | 816 | t2.start(); |
817 | FindQuery query( uid ); | 817 | FindQuery query( uid ); |
818 | OSQLResult res_noncustom = m_driver->query( &query ); | 818 | OSQLResult res_noncustom = m_driver->query( &query ); |
819 | t2needed = t2.elapsed(); | 819 | t2needed = t2.elapsed(); |
820 | 820 | ||
821 | OSQLResultItem resItem = res_noncustom.first(); | 821 | OSQLResultItem resItem = res_noncustom.first(); |
822 | 822 | ||
823 | QMap<int, QString> nonCustomMap; | 823 | QMap<int, QString> nonCustomMap; |
824 | QTime t3; | 824 | QTime t3; |
825 | t3.start(); | 825 | t3.start(); |
826 | nonCustomMap = fillNonCustomMap( resItem ); | 826 | nonCustomMap = fillNonCustomMap( resItem ); |
827 | t3needed = t3.elapsed(); | 827 | t3needed = t3.elapsed(); |
828 | 828 | ||
829 | 829 | ||
830 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; | 830 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; |
831 | odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed | 831 | odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed |
832 | << " ms, mapping: " << t3needed << " ms" << oendl; | 832 | << " ms, mapping: " << t3needed << " ms" << oendl; |
833 | 833 | ||
834 | return nonCustomMap; | 834 | return nonCustomMap; |
835 | } | 835 | } |
836 | 836 | ||
837 | /* Returns contact requested by uid and fills cache with contacts requested by uids in the cachelist */ | 837 | /* Returns contact requested by uid and fills cache with contacts requested by uids in the cachelist */ |
838 | OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const QArray<int>& uidlist )const | 838 | OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const QArray<int>& uidlist )const |
839 | { | 839 | { |
840 | // We want to get all contacts with one query. | 840 | // We want to get all contacts with one query. |
841 | // We don't have to add the given uid to the uidlist, it is expected to be there already (see opimrecordlist.h). | 841 | // We don't have to add the given uid to the uidlist, it is expected to be there already (see opimrecordlist.h). |
842 | // All contacts will be stored in the cache, afterwards the contact with the user id "uid" will be returned | 842 | // All contacts will be stored in the cache, afterwards the contact with the user id "uid" will be returned |
843 | // by using the cache.. | 843 | // by using the cache.. |
844 | QArray<int> cachelist = uidlist; | 844 | QArray<int> cachelist = uidlist; |
845 | OPimContact retContact; | ||
845 | 846 | ||
846 | odebug << "Reqest and cache" << cachelist.size() << "elements !" << oendl; | 847 | odebug << "Reqest and cache" << cachelist.size() << "elements !" << oendl; |
847 | 848 | ||
848 | QTime t; | 849 | QTime t; |
849 | t.start(); | 850 | t.start(); |
850 | 851 | ||
851 | int t2needed = 0; | 852 | int t2needed = 0; |
852 | int t3needed = 0; | 853 | int t3needed = 0; |
853 | QTime t2; | 854 | QTime t2; |
854 | t2.start(); | 855 | t2.start(); |
855 | FindQuery query( cachelist ); | 856 | FindQuery query( cachelist ); |
856 | OSQLResult res_noncustom = m_driver->query( &query ); | 857 | OSQLResult res_noncustom = m_driver->query( &query ); |
857 | t2needed = t2.elapsed(); | 858 | t2needed = t2.elapsed(); |
858 | 859 | ||
859 | QMap<int, QString> nonCustomMap; | 860 | QMap<int, QString> nonCustomMap; |
860 | QTime t3; | 861 | QTime t3; |
861 | t3.start(); | 862 | t3.start(); |
862 | OSQLResultItem resItem = res_noncustom.first(); | 863 | OSQLResultItem resItem = res_noncustom.first(); |
863 | do { | 864 | do { |
864 | OPimContact contact( fillNonCustomMap( resItem ) ); | 865 | OPimContact contact( fillNonCustomMap( resItem ) ); |
865 | contact.setExtraMap( requestCustom( contact.uid() ) ); | 866 | contact.setExtraMap( requestCustom( contact.uid() ) ); |
866 | odebug << "Caching uid: " << contact.uid() << oendl; | 867 | odebug << "Caching uid: " << contact.uid() << oendl; |
867 | cache( contact ); | 868 | cache( contact ); |
869 | if ( contact.uid() == uid ) | ||
870 | retContact = contact; | ||
868 | resItem = res_noncustom.next(); | 871 | resItem = res_noncustom.next(); |
869 | } while ( ! res_noncustom.atEnd() ); //atEnd() is true if we are past(!) the list !! | 872 | } while ( ! res_noncustom.atEnd() ); //atEnd() is true if we are past(!) the list !! |
870 | t3needed = t3.elapsed(); | 873 | t3needed = t3.elapsed(); |
871 | 874 | ||
872 | 875 | ||
873 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; | 876 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; |
874 | odebug << "RequestContactsAndCache needed: insg.:" << t.elapsed() << " ms, query: " << t2needed | 877 | odebug << "RequestContactsAndCache needed: insg.:" << t.elapsed() << " ms, query: " << t2needed |
875 | << " ms, mapping: " << t3needed << " ms" << oendl; | 878 | << " ms, mapping: " << t3needed << " ms" << oendl; |
876 | 879 | ||
877 | return cacheFind( uid ); | 880 | return retContact; |
878 | } | 881 | } |
879 | 882 | ||
880 | QMap<int, QString> OPimContactAccessBackend_SQL::fillNonCustomMap( const OSQLResultItem& resultItem ) const | 883 | QMap<int, QString> OPimContactAccessBackend_SQL::fillNonCustomMap( const OSQLResultItem& resultItem ) const |
881 | { | 884 | { |
882 | QMap<int, QString> nonCustomMap; | 885 | QMap<int, QString> nonCustomMap; |
883 | 886 | ||
884 | // Now loop through all columns | 887 | // Now loop through all columns |
885 | QStringList fieldList = OPimContactFields::untrfields( false ); | 888 | QStringList fieldList = OPimContactFields::untrfields( false ); |
886 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); | 889 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); |
887 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ | 890 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ |
888 | // Get data for the selected column and store it with the | 891 | // Get data for the selected column and store it with the |
889 | // corresponding id into the map.. | 892 | // corresponding id into the map.. |
890 | 893 | ||
891 | int id = translate[*it]; | 894 | int id = translate[*it]; |
892 | QString value = resultItem.data( (*it) ); | 895 | QString value = resultItem.data( (*it) ); |
893 | 896 | ||
894 | // odebug << "Reading " << (*it) << "... found: " << value << "" << oendl; | 897 | // odebug << "Reading " << (*it) << "... found: " << value << "" << oendl; |
895 | 898 | ||
896 | switch( id ){ | 899 | switch( id ){ |
897 | case Qtopia::Birthday: | 900 | case Qtopia::Birthday: |
898 | case Qtopia::Anniversary:{ | 901 | case Qtopia::Anniversary:{ |
899 | // Birthday and Anniversary are encoded special ( yyyy-mm-dd ) | 902 | // Birthday and Anniversary are encoded special ( yyyy-mm-dd ) |
900 | QStringList list = QStringList::split( '-', value ); | 903 | QStringList list = QStringList::split( '-', value ); |
901 | QStringList::Iterator lit = list.begin(); | 904 | QStringList::Iterator lit = list.begin(); |
902 | int year = (*lit).toInt(); | 905 | int year = (*lit).toInt(); |
903 | int month = (*(++lit)).toInt(); | 906 | int month = (*(++lit)).toInt(); |
904 | int day = (*(++lit)).toInt(); | 907 | int day = (*(++lit)).toInt(); |
905 | if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){ | 908 | if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){ |
906 | QDate date( year, month, day ); | 909 | QDate date( year, month, day ); |
907 | nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) ); | 910 | nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) ); |
908 | } | 911 | } |
909 | } | 912 | } |
910 | break; | 913 | break; |
911 | case Qtopia::AddressCategory: | 914 | case Qtopia::AddressCategory: |
912 | odebug << "Category is: " << value << "" << oendl; | 915 | odebug << "Category is: " << value << "" << oendl; |
913 | default: | 916 | default: |
914 | nonCustomMap.insert( id, value ); | 917 | nonCustomMap.insert( id, value ); |
915 | } | 918 | } |
916 | } | 919 | } |
917 | 920 | ||
918 | nonCustomMap.insert( Qtopia::AddressUid, resultItem.data( "uid" ) ); | 921 | nonCustomMap.insert( Qtopia::AddressUid, resultItem.data( "uid" ) ); |
919 | 922 | ||
920 | return nonCustomMap; | 923 | return nonCustomMap; |
921 | } | 924 | } |
922 | 925 | ||
923 | 926 | ||
924 | QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const | 927 | QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const |
925 | { | 928 | { |
926 | QTime t; | 929 | QTime t; |
927 | t.start(); | 930 | t.start(); |
928 | 931 | ||
929 | QMap<QString, QString> customMap; | 932 | QMap<QString, QString> customMap; |
930 | 933 | ||
931 | FindCustomQuery query( uid ); | 934 | FindCustomQuery query( uid ); |
932 | OSQLResult res_custom = m_driver->query( &query ); | 935 | OSQLResult res_custom = m_driver->query( &query ); |
933 | 936 | ||
934 | if ( res_custom.state() == OSQLResult::Failure ) { | 937 | if ( res_custom.state() == OSQLResult::Failure ) { |
935 | owarn << "OSQLResult::Failure in find query !!" << oendl; | 938 | owarn << "OSQLResult::Failure in find query !!" << oendl; |
936 | QMap<QString, QString> empty; | 939 | QMap<QString, QString> empty; |
937 | return empty; | 940 | return empty; |
938 | } | 941 | } |
939 | 942 | ||
940 | OSQLResultItem::ValueList list = res_custom.results(); | 943 | OSQLResultItem::ValueList list = res_custom.results(); |
941 | OSQLResultItem::ValueList::Iterator it = list.begin(); | 944 | OSQLResultItem::ValueList::Iterator it = list.begin(); |
942 | for ( ; it != list.end(); ++it ) { | 945 | for ( ; it != list.end(); ++it ) { |
943 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); | 946 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); |
944 | } | 947 | } |
945 | 948 | ||
946 | odebug << "RequestCustom needed: " << t.elapsed() << " ms" << oendl; | 949 | odebug << "RequestCustom needed: " << t.elapsed() << " ms" << oendl; |
947 | return customMap; | 950 | return customMap; |
948 | } | 951 | } |
949 | 952 | ||
950 | } | 953 | } |
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h index 4f81735..28d9746 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h | |||
@@ -1,114 +1,114 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) | 3 | Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | /* | 29 | /* |
30 | * SQL Backend for the OPIE-Contact Database. | 30 | * SQL Backend for the OPIE-Contact Database. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #ifndef _OPimContactAccessBackend_SQL_ | 33 | #ifndef _OPimContactAccessBackend_SQL_ |
34 | #define _OPimContactAccessBackend_SQL_ | 34 | #define _OPimContactAccessBackend_SQL_ |
35 | 35 | ||
36 | #include <opie2/ocontactaccessbackend.h> | 36 | #include <opie2/ocontactaccessbackend.h> |
37 | #include <opie2/ocontactaccess.h> | 37 | #include <opie2/ocontactaccess.h> |
38 | 38 | ||
39 | #include <qlist.h> | 39 | #include <qlist.h> |
40 | #include <qdict.h> | 40 | #include <qdict.h> |
41 | 41 | ||
42 | /* aren't in namespace Opie yet - alwin */ | 42 | /* aren't in namespace Opie yet - alwin */ |
43 | namespace Opie { | 43 | namespace Opie { |
44 | namespace DB { | 44 | namespace DB { |
45 | class OSQLDriver; | 45 | class OSQLDriver; |
46 | class OSQLResult; | 46 | class OSQLResult; |
47 | class OSQLResultItem; | 47 | class OSQLResultItem; |
48 | } | 48 | } |
49 | } | 49 | } |
50 | 50 | ||
51 | namespace Opie { | 51 | namespace Opie { |
52 | 52 | ||
53 | /* the default xml implementation */ | 53 | /* the default xml implementation */ |
54 | /** | 54 | /** |
55 | * This class is the SQL implementation of a Contact backend | 55 | * This class is the SQL implementation of a Contact backend |
56 | * it does implement everything available for OPimContact. | 56 | * it does implement everything available for OPimContact. |
57 | * @see OPimAccessBackend for more information of available methods | 57 | * @see OPimAccessBackend for more information of available methods |
58 | */ | 58 | */ |
59 | class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { | 59 | class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { |
60 | public: | 60 | public: |
61 | OPimContactAccessBackend_SQL ( const QString& appname, const QString& filename = QString::null ); | 61 | OPimContactAccessBackend_SQL ( const QString& appname, const QString& filename = QString::null ); |
62 | 62 | ||
63 | ~OPimContactAccessBackend_SQL (); | 63 | ~OPimContactAccessBackend_SQL (); |
64 | 64 | ||
65 | bool save(); | 65 | bool save(); |
66 | 66 | ||
67 | bool load (); | 67 | bool load (); |
68 | 68 | ||
69 | void clear (); | 69 | void clear (); |
70 | 70 | ||
71 | bool wasChangedExternally(); | 71 | bool wasChangedExternally(); |
72 | 72 | ||
73 | QArray<int> allRecords() const; | 73 | QArray<int> allRecords() const; |
74 | 74 | ||
75 | OPimContact find ( int uid ) const; | 75 | OPimContact find( int uid ) const; |
76 | OPimContact find( int uid, const QArray<int>&, uint cur, Frontend::CacheDirection ) const; | 76 | OPimContact find( int uid, const QArray<int>& items, uint cur, Frontend::CacheDirection ) const; |
77 | 77 | ||
78 | QArray<int> queryByExample ( const OPimContact &query, int settings, | 78 | QArray<int> queryByExample ( const OPimContact &query, int settings, |
79 | const QDateTime& d ); | 79 | const QDateTime& d ); |
80 | 80 | ||
81 | QArray<int> matchRegexp( const QRegExp &r ) const; | 81 | QArray<int> matchRegexp( const QRegExp &r ) const; |
82 | 82 | ||
83 | const uint querySettings(); | 83 | const uint querySettings(); |
84 | 84 | ||
85 | bool hasQuerySettings (uint querySettings) const; | 85 | bool hasQuerySettings (uint querySettings) const; |
86 | 86 | ||
87 | // Currently only asc implemented.. | 87 | // Currently only asc implemented.. |
88 | QArray<int> sorted( bool asc, int , int , int ); | 88 | QArray<int> sorted( bool asc, int , int , int ); |
89 | bool add ( const OPimContact &newcontact ); | 89 | bool add ( const OPimContact &newcontact ); |
90 | 90 | ||
91 | bool replace ( const OPimContact &contact ); | 91 | bool replace ( const OPimContact &contact ); |
92 | 92 | ||
93 | bool remove ( int uid ); | 93 | bool remove ( int uid ); |
94 | bool reload(); | 94 | bool reload(); |
95 | 95 | ||
96 | private: | 96 | private: |
97 | QArray<int> extractUids( Opie::DB::OSQLResult& res ) const; | 97 | QArray<int> extractUids( Opie::DB::OSQLResult& res ) const; |
98 | QMap<int, QString> requestNonCustom( int uid ) const; | 98 | QMap<int, QString> requestNonCustom( int uid ) const; |
99 | QMap<QString, QString> requestCustom( int uid ) const; | 99 | QMap<QString, QString> requestCustom( int uid ) const; |
100 | QMap<int, QString> fillNonCustomMap( const Opie::DB::OSQLResultItem& resultItem ) const; | 100 | QMap<int, QString> fillNonCustomMap( const Opie::DB::OSQLResultItem& resultItem ) const; |
101 | OPimContact requestContactsAndCache( int uid, const QArray<int>& cachelist ) const; | 101 | OPimContact requestContactsAndCache( int uid, const QArray<int>& cachelist ) const; |
102 | void update(); | 102 | void update(); |
103 | 103 | ||
104 | protected: | 104 | protected: |
105 | bool m_changed; | 105 | bool m_changed; |
106 | QString m_fileName; | 106 | QString m_fileName; |
107 | QArray<int> m_uids; | 107 | QArray<int> m_uids; |
108 | 108 | ||
109 | Opie::DB::OSQLDriver* m_driver; | 109 | Opie::DB::OSQLDriver* m_driver; |
110 | }; | 110 | }; |
111 | 111 | ||
112 | } | 112 | } |
113 | 113 | ||
114 | #endif | 114 | #endif |
diff --git a/libopie2/opiepim/backend/opimaccessbackend.h b/libopie2/opiepim/backend/opimaccessbackend.h index 15a7b7f..26af762 100644 --- a/libopie2/opiepim/backend/opimaccessbackend.h +++ b/libopie2/opiepim/backend/opimaccessbackend.h | |||
@@ -1,212 +1,196 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) The Main Author <main-author@whereever.org> | 3 | Copyright (C) The Main Author <main-author@whereever.org> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | #ifndef OPIE_PIM_ACCESS_BACKEND | 29 | #ifndef OPIE_PIM_ACCESS_BACKEND |
30 | #define OPIE_PIM_ACCESS_BACKEND | 30 | #define OPIE_PIM_ACCESS_BACKEND |
31 | 31 | ||
32 | #include <qarray.h> | 32 | #include <qarray.h> |
33 | #include <qdatetime.h> | 33 | #include <qdatetime.h> |
34 | 34 | ||
35 | #include <opie2/opimtemplatebase.h> | 35 | #include <opie2/opimtemplatebase.h> |
36 | #include <opie2/opimrecord.h> | 36 | #include <opie2/opimrecord.h> |
37 | 37 | ||
38 | 38 | ||
39 | namespace Opie { | 39 | namespace Opie { |
40 | class OPimAccessBackendPrivate; | 40 | class OPimAccessBackendPrivate; |
41 | /** | 41 | /** |
42 | * OPimAccessBackend is the base class | 42 | * OPimAccessBackend is the base class |
43 | * for all private backends | 43 | * for all private backends |
44 | * it operates on OPimRecord as the base class | 44 | * it operates on OPimRecord as the base class |
45 | * and it's responsible for fast manipulating | 45 | * and it's responsible for fast manipulating |
46 | * the resource the implementation takes care | 46 | * the resource the implementation takes care |
47 | * of | 47 | * of |
48 | */ | 48 | */ |
49 | template <class T = OPimRecord> | 49 | template <class T = OPimRecord> |
50 | class OPimAccessBackend { | 50 | class OPimAccessBackend { |
51 | public: | 51 | public: |
52 | typedef OTemplateBase<T> Frontend; | 52 | typedef OTemplateBase<T> Frontend; |
53 | 53 | ||
54 | /** The access hint from the frontend */ | 54 | /** The access hint from the frontend */ |
55 | OPimAccessBackend(int access = 0); | 55 | OPimAccessBackend(int access = 0); |
56 | virtual ~OPimAccessBackend(); | 56 | virtual ~OPimAccessBackend(); |
57 | 57 | ||
58 | /** | 58 | /** |
59 | * load the resource | 59 | * load the resource |
60 | */ | 60 | */ |
61 | virtual bool load() = 0; | 61 | virtual bool load() = 0; |
62 | 62 | ||
63 | /** | 63 | /** |
64 | * reload the resource | 64 | * reload the resource |
65 | */ | 65 | */ |
66 | virtual bool reload() = 0; | 66 | virtual bool reload() = 0; |
67 | 67 | ||
68 | /** | 68 | /** |
69 | * save the resource and | 69 | * save the resource and |
70 | * all it's changes | 70 | * all it's changes |
71 | */ | 71 | */ |
72 | virtual bool save() = 0; | 72 | virtual bool save() = 0; |
73 | 73 | ||
74 | /** | 74 | /** |
75 | * return an array of | 75 | * return an array of |
76 | * all available uids | 76 | * all available uids |
77 | */ | 77 | */ |
78 | virtual QArray<int> allRecords()const = 0; | 78 | virtual QArray<int> allRecords()const = 0; |
79 | 79 | ||
80 | /** | 80 | /** |
81 | * return a List of records | 81 | * return a List of records |
82 | * that match the regex | 82 | * that match the regex |
83 | */ | 83 | */ |
84 | virtual QArray<int> matchRegexp(const QRegExp &r) const = 0; | 84 | virtual QArray<int> matchRegexp(const QRegExp &r) const = 0; |
85 | 85 | ||
86 | /** | 86 | /** |
87 | * queryByExample for T with the given Settings | 87 | * queryByExample for T with the given Settings |
88 | * | 88 | * |
89 | */ | 89 | */ |
90 | virtual QArray<int> queryByExample( const T& t, int settings, const QDateTime& d = QDateTime() ) = 0; | 90 | virtual QArray<int> queryByExample( const T& t, int settings, const QDateTime& d = QDateTime() ) = 0; |
91 | 91 | ||
92 | /** | 92 | /** |
93 | * find the OPimRecord with uid @param uid | 93 | * find the OPimRecord with uid @param uid |
94 | * returns T and T.isEmpty() if nothing was found | 94 | * returns T and T.isEmpty() if nothing was found |
95 | */ | 95 | */ |
96 | virtual T find(int uid )const = 0; | 96 | virtual T find( int uid )const = 0; |
97 | 97 | ||
98 | virtual T find(int uid, const QArray<int>& items, | 98 | virtual T find( int uid, const QArray<int>& items, |
99 | uint current, typename Frontend::CacheDirection ) const; | 99 | uint current, typename Frontend::CacheDirection ) const; |
100 | /** | 100 | /** |
101 | * clear the back end | 101 | * clear the back end |
102 | */ | 102 | */ |
103 | virtual void clear() = 0; | 103 | virtual void clear() = 0; |
104 | 104 | ||
105 | /** | 105 | /** |
106 | * add T | 106 | * add T |
107 | */ | 107 | */ |
108 | virtual bool add( const T& t ) = 0; | 108 | virtual bool add( const T& t ) = 0; |
109 | 109 | ||
110 | /** | 110 | /** |
111 | * remove | 111 | * remove |
112 | */ | 112 | */ |
113 | virtual bool remove( int uid ) = 0; | 113 | virtual bool remove( int uid ) = 0; |
114 | 114 | ||
115 | /** | 115 | /** |
116 | * replace a record with T.uid() | 116 | * replace a record with T.uid() |
117 | */ | 117 | */ |
118 | virtual bool replace( const T& t ) = 0; | 118 | virtual bool replace( const T& t ) = 0; |
119 | 119 | ||
120 | /* | 120 | /* |
121 | * setTheFrontEnd!!! | 121 | * setTheFrontEnd!!! |
122 | */ | 122 | */ |
123 | void setFrontend( Frontend* front ); | 123 | void setFrontend( Frontend* front ); |
124 | 124 | ||
125 | /** | 125 | /** |
126 | * set the read ahead count | 126 | * set the read ahead count |
127 | */ | 127 | */ |
128 | void setReadAhead( uint count ); | 128 | void setReadAhead( uint count ); |
129 | protected: | 129 | protected: |
130 | int access()const; | 130 | int access()const; |
131 | 131 | ||
132 | void cache( const T& t )const; | 132 | void cache( const T& t )const; |
133 | 133 | ||
134 | /** | ||
135 | * Returns the element with given uid out of the cache. | ||
136 | * Returns empty element if nothing was found. | ||
137 | * <b>Attention:</b> This just works if we have a frontend which contains the cache ! | ||
138 | */ | ||
139 | T cacheFind( int uid ) const; | ||
140 | |||
141 | /** | 134 | /** |
142 | * use a prime number here! | 135 | * use a prime number here! |
143 | */ | 136 | */ |
144 | void setSaneCacheSize( int ); | 137 | void setSaneCacheSize( int ); |
145 | 138 | ||
146 | uint readAhead()const; | 139 | uint readAhead()const; |
147 | 140 | ||
148 | private: | 141 | private: |
149 | OPimAccessBackendPrivate *d; | 142 | OPimAccessBackendPrivate *d; |
150 | Frontend* m_front; | 143 | Frontend* m_front; |
151 | uint m_read; | 144 | uint m_read; |
152 | int m_acc; | 145 | int m_acc; |
153 | 146 | ||
154 | }; | 147 | }; |
155 | 148 | ||
156 | template <class T> | 149 | template <class T> |
157 | OPimAccessBackend<T>::OPimAccessBackend(int acc) | 150 | OPimAccessBackend<T>::OPimAccessBackend(int acc) |
158 | : m_acc( acc ) | 151 | : m_acc( acc ) |
159 | { | 152 | { |
160 | m_front = 0l; | 153 | m_front = 0l; |
161 | } | 154 | } |
162 | template <class T> | 155 | template <class T> |
163 | OPimAccessBackend<T>::~OPimAccessBackend() { | 156 | OPimAccessBackend<T>::~OPimAccessBackend() { |
164 | 157 | ||
165 | } | 158 | } |
166 | template <class T> | 159 | template <class T> |
167 | void OPimAccessBackend<T>::setFrontend( Frontend* fr ) { | 160 | void OPimAccessBackend<T>::setFrontend( Frontend* fr ) { |
168 | m_front = fr; | 161 | m_front = fr; |
169 | } | 162 | } |
170 | template <class T> | 163 | template <class T> |
171 | void OPimAccessBackend<T>::cache( const T& t )const { | 164 | void OPimAccessBackend<T>::cache( const T& t )const { |
172 | if ( m_front ) | 165 | if ( m_front ) |
173 | m_front->cache( t ); | 166 | m_front->cache( t ); |
174 | } | 167 | } |
175 | 168 | ||
176 | template <class T> | ||
177 | T OPimAccessBackend<T>::cacheFind( int uid )const { | ||
178 | if ( ! m_front ){ | ||
179 | qWarning ( "No frontend assigned ! Therefore we cannot access the cache to return the right element!" ); | ||
180 | return T(); | ||
181 | } | ||
182 | |||
183 | return m_front->cacheFind( uid ); | ||
184 | } | ||
185 | 169 | ||
186 | template <class T> | 170 | template <class T> |
187 | void OPimAccessBackend<T>::setSaneCacheSize( int size) { | 171 | void OPimAccessBackend<T>::setSaneCacheSize( int size) { |
188 | if ( m_front ) | 172 | if ( m_front ) |
189 | m_front->setSaneCacheSize( size ); | 173 | m_front->setSaneCacheSize( size ); |
190 | } | 174 | } |
191 | template <class T> | 175 | template <class T> |
192 | T OPimAccessBackend<T>::find( int uid, const QArray<int>&, | 176 | T OPimAccessBackend<T>::find( int uid, const QArray<int>&, |
193 | uint, typename Frontend::CacheDirection ) const{ | 177 | uint, typename Frontend::CacheDirection ) const{ |
194 | qDebug( "*** Lookahead feature not supported. Fallback to default find!" ); | 178 | qDebug( "*** Lookahead feature not supported. Fallback to default find!!" ); |
195 | return find( uid ); | 179 | return find( uid ); |
196 | } | 180 | } |
197 | template <class T> | 181 | template <class T> |
198 | void OPimAccessBackend<T>::setReadAhead( uint count ) { | 182 | void OPimAccessBackend<T>::setReadAhead( uint count ) { |
199 | m_read = count; | 183 | m_read = count; |
200 | } | 184 | } |
201 | template <class T> | 185 | template <class T> |
202 | uint OPimAccessBackend<T>::readAhead()const { | 186 | uint OPimAccessBackend<T>::readAhead()const { |
203 | return m_read; | 187 | return m_read; |
204 | } | 188 | } |
205 | template <class T> | 189 | template <class T> |
206 | int OPimAccessBackend<T>::access()const { | 190 | int OPimAccessBackend<T>::access()const { |
207 | return m_acc; | 191 | return m_acc; |
208 | } | 192 | } |
209 | 193 | ||
210 | } | 194 | } |
211 | 195 | ||
212 | #endif | 196 | #endif |
diff --git a/libopie2/opiepim/backend/otodoaccesssql.cpp b/libopie2/opiepim/backend/otodoaccesssql.cpp index 12a8bea..4e3e47b 100644 --- a/libopie2/opiepim/backend/otodoaccesssql.cpp +++ b/libopie2/opiepim/backend/otodoaccesssql.cpp | |||
@@ -361,448 +361,454 @@ namespace { | |||
361 | : OSQLQuery(), m_start( start ), m_end( end ),m_inc(inc) {} | 361 | : OSQLQuery(), m_start( start ), m_end( end ),m_inc(inc) {} |
362 | EffQuery::~EffQuery() {} | 362 | EffQuery::~EffQuery() {} |
363 | QString EffQuery::query()const { | 363 | QString EffQuery::query()const { |
364 | return m_inc ? with() : out(); | 364 | return m_inc ? with() : out(); |
365 | } | 365 | } |
366 | QString EffQuery::with()const { | 366 | QString EffQuery::with()const { |
367 | QString str; | 367 | QString str; |
368 | str = QString("select uid from todolist where ( DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6' ) OR DueDate = '0-0-0' ") | 368 | str = QString("select uid from todolist where ( DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6' ) OR DueDate = '0-0-0' ") |
369 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) | 369 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) |
370 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) | 370 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) |
371 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) | 371 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) |
372 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) | 372 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) |
373 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) | 373 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) |
374 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); | 374 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); |
375 | return str; | 375 | return str; |
376 | } | 376 | } |
377 | QString EffQuery::out()const { | 377 | QString EffQuery::out()const { |
378 | QString str; | 378 | QString str; |
379 | str = QString("select uid from todolist where DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6'") | 379 | str = QString("select uid from todolist where DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6'") |
380 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) | 380 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) |
381 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) | 381 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) |
382 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) | 382 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) |
383 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) | 383 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) |
384 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) | 384 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) |
385 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); | 385 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); |
386 | 386 | ||
387 | return str; | 387 | return str; |
388 | } | 388 | } |
389 | 389 | ||
390 | FindCustomQuery::FindCustomQuery(int uid) | 390 | FindCustomQuery::FindCustomQuery(int uid) |
391 | : OSQLQuery(), m_uid( uid ) { | 391 | : OSQLQuery(), m_uid( uid ) { |
392 | } | 392 | } |
393 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) | 393 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) |
394 | : OSQLQuery(), m_uids( ints ){ | 394 | : OSQLQuery(), m_uids( ints ){ |
395 | } | 395 | } |
396 | FindCustomQuery::~FindCustomQuery() { | 396 | FindCustomQuery::~FindCustomQuery() { |
397 | } | 397 | } |
398 | QString FindCustomQuery::query()const{ | 398 | QString FindCustomQuery::query()const{ |
399 | return single(); // Multiple requests not supported ! | 399 | return single(); // Multiple requests not supported ! |
400 | } | 400 | } |
401 | QString FindCustomQuery::single()const{ | 401 | QString FindCustomQuery::single()const{ |
402 | QString qu = "select uid, type, value from custom_data where uid = "; | 402 | QString qu = "select uid, type, value from custom_data where uid = "; |
403 | qu += QString::number(m_uid); | 403 | qu += QString::number(m_uid); |
404 | return qu; | 404 | return qu; |
405 | } | 405 | } |
406 | 406 | ||
407 | }; | 407 | }; |
408 | 408 | ||
409 | 409 | ||
410 | namespace Opie { | 410 | namespace Opie { |
411 | OPimTodoAccessBackendSQL::OPimTodoAccessBackendSQL( const QString& file ) | 411 | OPimTodoAccessBackendSQL::OPimTodoAccessBackendSQL( const QString& file ) |
412 | : OPimTodoAccessBackend(),/* m_dict(15),*/ m_driver(NULL), m_dirty(true) | 412 | : OPimTodoAccessBackend(),/* m_dict(15),*/ m_driver(NULL), m_dirty(true) |
413 | { | 413 | { |
414 | QString fi = file; | 414 | QString fi = file; |
415 | if ( fi.isEmpty() ) | 415 | if ( fi.isEmpty() ) |
416 | fi = Global::applicationFileName( "todolist", "todolist.db" ); | 416 | fi = Global::applicationFileName( "todolist", "todolist.db" ); |
417 | OSQLManager man; | 417 | OSQLManager man; |
418 | m_driver = man.standard(); | 418 | m_driver = man.standard(); |
419 | m_driver->setUrl(fi); | 419 | m_driver->setUrl(fi); |
420 | // fillDict(); | 420 | // fillDict(); |
421 | } | 421 | } |
422 | 422 | ||
423 | OPimTodoAccessBackendSQL::~OPimTodoAccessBackendSQL(){ | 423 | OPimTodoAccessBackendSQL::~OPimTodoAccessBackendSQL(){ |
424 | if( m_driver ) | 424 | if( m_driver ) |
425 | delete m_driver; | 425 | delete m_driver; |
426 | } | 426 | } |
427 | 427 | ||
428 | bool OPimTodoAccessBackendSQL::load(){ | 428 | bool OPimTodoAccessBackendSQL::load(){ |
429 | if (!m_driver->open() ) | 429 | if (!m_driver->open() ) |
430 | return false; | 430 | return false; |
431 | 431 | ||
432 | CreateQuery creat; | 432 | CreateQuery creat; |
433 | OSQLResult res = m_driver->query(&creat ); | 433 | OSQLResult res = m_driver->query(&creat ); |
434 | 434 | ||
435 | m_dirty = true; | 435 | m_dirty = true; |
436 | return true; | 436 | return true; |
437 | } | 437 | } |
438 | bool OPimTodoAccessBackendSQL::reload(){ | 438 | bool OPimTodoAccessBackendSQL::reload(){ |
439 | return load(); | 439 | return load(); |
440 | } | 440 | } |
441 | 441 | ||
442 | bool OPimTodoAccessBackendSQL::save(){ | 442 | bool OPimTodoAccessBackendSQL::save(){ |
443 | return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) | 443 | return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) |
444 | } | 444 | } |
445 | QArray<int> OPimTodoAccessBackendSQL::allRecords()const { | 445 | QArray<int> OPimTodoAccessBackendSQL::allRecords()const { |
446 | if (m_dirty ) | 446 | if (m_dirty ) |
447 | update(); | 447 | update(); |
448 | 448 | ||
449 | return m_uids; | 449 | return m_uids; |
450 | } | 450 | } |
451 | QArray<int> OPimTodoAccessBackendSQL::queryByExample( const OPimTodo& , int, const QDateTime& ){ | 451 | QArray<int> OPimTodoAccessBackendSQL::queryByExample( const OPimTodo& , int, const QDateTime& ){ |
452 | QArray<int> ints(0); | 452 | QArray<int> ints(0); |
453 | return ints; | 453 | return ints; |
454 | } | 454 | } |
455 | OPimTodo OPimTodoAccessBackendSQL::find(int uid ) const{ | 455 | OPimTodo OPimTodoAccessBackendSQL::find(int uid ) const{ |
456 | FindQuery query( uid ); | 456 | FindQuery query( uid ); |
457 | return todo( m_driver->query(&query) ); | 457 | return parseResultAndCache( uid, m_driver->query(&query) ); |
458 | 458 | ||
459 | } | 459 | } |
460 | 460 | ||
461 | // Remember: uid is already in the list of uids, called ints ! | 461 | // Remember: uid is already in the list of uids, called ints ! |
462 | OPimTodo OPimTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, | 462 | OPimTodo OPimTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, |
463 | uint cur, Frontend::CacheDirection dir ) const{ | 463 | uint cur, Frontend::CacheDirection dir ) const{ |
464 | uint CACHE = readAhead(); | 464 | uint CACHE = readAhead(); |
465 | odebug << "searching for " << uid << "" << oendl; | 465 | odebug << "searching for " << uid << "" << oendl; |
466 | QArray<int> search( CACHE ); | 466 | QArray<int> search( CACHE ); |
467 | uint size =0; | 467 | uint size =0; |
468 | OPimTodo to; | 468 | OPimTodo to; |
469 | 469 | ||
470 | // we try to cache CACHE items | 470 | // we try to cache CACHE items |
471 | switch( dir ) { | 471 | switch( dir ) { |
472 | /* forward */ | 472 | /* forward */ |
473 | case Frontend::Forward: | 473 | case Frontend::Forward: |
474 | for (uint i = cur; i < ints.count() && size < CACHE; i++ ) { | 474 | for (uint i = cur; i < ints.count() && size < CACHE; i++ ) { |
475 | odebug << "size " << size << " " << ints[i] << "" << oendl; | 475 | odebug << "size " << size << " " << ints[i] << "" << oendl; |
476 | search[size] = ints[i]; | 476 | search[size] = ints[i]; |
477 | size++; | 477 | size++; |
478 | } | 478 | } |
479 | break; | 479 | break; |
480 | /* reverse */ | 480 | /* reverse */ |
481 | case Frontend::Reverse: | 481 | case Frontend::Reverse: |
482 | for (uint i = cur; i != 0 && size < CACHE; i-- ) { | 482 | for (uint i = cur; i != 0 && size < CACHE; i-- ) { |
483 | search[size] = ints[i]; | 483 | search[size] = ints[i]; |
484 | size++; | 484 | size++; |
485 | } | 485 | } |
486 | break; | 486 | break; |
487 | } | 487 | } |
488 | 488 | ||
489 | search.resize( size ); | 489 | search.resize( size ); |
490 | FindQuery query( search ); | 490 | FindQuery query( search ); |
491 | OSQLResult res = m_driver->query( &query ); | 491 | OSQLResult res = m_driver->query( &query ); |
492 | if ( res.state() != OSQLResult::Success ) | 492 | if ( res.state() != OSQLResult::Success ) |
493 | return to; | 493 | return to; |
494 | 494 | ||
495 | todo( res ); //FIXME: Don't like polymorphism here. It makes the code hard to read here..(eilers) | 495 | return parseResultAndCache( uid, res ); |
496 | return cacheFind( uid ); | ||
497 | } | 496 | } |
498 | 497 | ||
499 | void OPimTodoAccessBackendSQL::clear() { | 498 | void OPimTodoAccessBackendSQL::clear() { |
500 | ClearQuery cle; | 499 | ClearQuery cle; |
501 | OSQLResult res = m_driver->query( &cle ); | 500 | OSQLResult res = m_driver->query( &cle ); |
502 | CreateQuery qu; | 501 | CreateQuery qu; |
503 | res = m_driver->query(&qu); | 502 | res = m_driver->query(&qu); |
504 | } | 503 | } |
505 | bool OPimTodoAccessBackendSQL::add( const OPimTodo& t) { | 504 | bool OPimTodoAccessBackendSQL::add( const OPimTodo& t) { |
506 | InsertQuery ins( t ); | 505 | InsertQuery ins( t ); |
507 | OSQLResult res = m_driver->query( &ins ); | 506 | OSQLResult res = m_driver->query( &ins ); |
508 | 507 | ||
509 | if ( res.state() == OSQLResult::Failure ) | 508 | if ( res.state() == OSQLResult::Failure ) |
510 | return false; | 509 | return false; |
511 | int c = m_uids.count(); | 510 | int c = m_uids.count(); |
512 | m_uids.resize( c+1 ); | 511 | m_uids.resize( c+1 ); |
513 | m_uids[c] = t.uid(); | 512 | m_uids[c] = t.uid(); |
514 | 513 | ||
515 | return true; | 514 | return true; |
516 | } | 515 | } |
517 | bool OPimTodoAccessBackendSQL::remove( int uid ) { | 516 | bool OPimTodoAccessBackendSQL::remove( int uid ) { |
518 | RemoveQuery rem( uid ); | 517 | RemoveQuery rem( uid ); |
519 | OSQLResult res = m_driver->query(&rem ); | 518 | OSQLResult res = m_driver->query(&rem ); |
520 | 519 | ||
521 | if ( res.state() == OSQLResult::Failure ) | 520 | if ( res.state() == OSQLResult::Failure ) |
522 | return false; | 521 | return false; |
523 | 522 | ||
524 | m_dirty = true; | 523 | m_dirty = true; |
525 | return true; | 524 | return true; |
526 | } | 525 | } |
527 | /* | 526 | /* |
528 | * FIXME better set query | 527 | * FIXME better set query |
529 | * but we need the cache for that | 528 | * but we need the cache for that |
530 | * now we remove | 529 | * now we remove |
531 | */ | 530 | */ |
532 | bool OPimTodoAccessBackendSQL::replace( const OPimTodo& t) { | 531 | bool OPimTodoAccessBackendSQL::replace( const OPimTodo& t) { |
533 | remove( t.uid() ); | 532 | remove( t.uid() ); |
534 | bool b= add(t); | 533 | bool b= add(t); |
535 | m_dirty = false; // we changed some stuff but the UID stayed the same | 534 | m_dirty = false; // we changed some stuff but the UID stayed the same |
536 | return b; | 535 | return b; |
537 | } | 536 | } |
538 | QArray<int> OPimTodoAccessBackendSQL::overDue() { | 537 | QArray<int> OPimTodoAccessBackendSQL::overDue() { |
539 | OverDueQuery qu; | 538 | OverDueQuery qu; |
540 | return uids( m_driver->query(&qu ) ); | 539 | return uids( m_driver->query(&qu ) ); |
541 | } | 540 | } |
542 | QArray<int> OPimTodoAccessBackendSQL::effectiveToDos( const QDate& s, | 541 | QArray<int> OPimTodoAccessBackendSQL::effectiveToDos( const QDate& s, |
543 | const QDate& t, | 542 | const QDate& t, |
544 | bool u) { | 543 | bool u) { |
545 | EffQuery ef(s, t, u ); | 544 | EffQuery ef(s, t, u ); |
546 | return uids (m_driver->query(&ef) ); | 545 | return uids (m_driver->query(&ef) ); |
547 | } | 546 | } |
548 | /* | 547 | /* |
549 | * | 548 | * |
550 | */ | 549 | */ |
551 | QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder, | 550 | QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder, |
552 | int sortFilter, int cat ) { | 551 | int sortFilter, int cat ) { |
553 | odebug << "sorted " << asc << ", " << sortOrder << "" << oendl; | 552 | odebug << "sorted " << asc << ", " << sortOrder << "" << oendl; |
554 | QString query; | 553 | QString query; |
555 | query = "select uid from todolist WHERE "; | 554 | query = "select uid from todolist WHERE "; |
556 | 555 | ||
557 | /* | 556 | /* |
558 | * Sort Filter stuff | 557 | * Sort Filter stuff |
559 | * not that straight forward | 558 | * not that straight forward |
560 | * FIXME: Replace magic numbers | 559 | * FIXME: Replace magic numbers |
561 | * | 560 | * |
562 | */ | 561 | */ |
563 | /* Category */ | 562 | /* Category */ |
564 | if ( sortFilter & 1 ) { | 563 | if ( sortFilter & 1 ) { |
565 | QString str; | 564 | QString str; |
566 | if (cat != 0 ) str = QString::number( cat ); | 565 | if (cat != 0 ) str = QString::number( cat ); |
567 | query += " categories like '%" +str+"%' AND"; | 566 | query += " categories like '%" +str+"%' AND"; |
568 | } | 567 | } |
569 | /* Show only overdue */ | 568 | /* Show only overdue */ |
570 | if ( sortFilter & 2 ) { | 569 | if ( sortFilter & 2 ) { |
571 | QDate date = QDate::currentDate(); | 570 | QDate date = QDate::currentDate(); |
572 | QString due; | 571 | QString due; |
573 | QString base; | 572 | QString base; |
574 | base = QString("DueDate <= '%1-%2-%3' AND completed = 0") | 573 | base = QString("DueDate <= '%1-%2-%3' AND completed = 0") |
575 | .arg( QString::number( date.year() ).rightJustify( 4, '0' ) ) | 574 | .arg( QString::number( date.year() ).rightJustify( 4, '0' ) ) |
576 | .arg( QString::number( date.month() ).rightJustify( 2, '0' ) ) | 575 | .arg( QString::number( date.month() ).rightJustify( 2, '0' ) ) |
577 | .arg( QString::number( date.day() ).rightJustify( 2, '0' ) ); | 576 | .arg( QString::number( date.day() ).rightJustify( 2, '0' ) ); |
578 | query += " " + base + " AND"; | 577 | query += " " + base + " AND"; |
579 | } | 578 | } |
580 | /* not show completed */ | 579 | /* not show completed */ |
581 | if ( sortFilter & 4 ) { | 580 | if ( sortFilter & 4 ) { |
582 | query += " completed = 0 AND"; | 581 | query += " completed = 0 AND"; |
583 | }else{ | 582 | }else{ |
584 | query += " ( completed = 1 OR completed = 0) AND"; | 583 | query += " ( completed = 1 OR completed = 0) AND"; |
585 | } | 584 | } |
586 | /* strip the end */ | 585 | /* strip the end */ |
587 | query = query.remove( query.length()-3, 3 ); | 586 | query = query.remove( query.length()-3, 3 ); |
588 | 587 | ||
589 | 588 | ||
590 | /* | 589 | /* |
591 | * sort order stuff | 590 | * sort order stuff |
592 | * quite straight forward | 591 | * quite straight forward |
593 | */ | 592 | */ |
594 | query += "ORDER BY "; | 593 | query += "ORDER BY "; |
595 | switch( sortOrder ) { | 594 | switch( sortOrder ) { |
596 | /* completed */ | 595 | /* completed */ |
597 | case 0: | 596 | case 0: |
598 | query += "completed"; | 597 | query += "completed"; |
599 | break; | 598 | break; |
600 | case 1: | 599 | case 1: |
601 | query += "priority"; | 600 | query += "priority"; |
602 | break; | 601 | break; |
603 | case 2: | 602 | case 2: |
604 | query += "summary"; | 603 | query += "summary"; |
605 | break; | 604 | break; |
606 | case 3: | 605 | case 3: |
607 | query += "DueDate"; | 606 | query += "DueDate"; |
608 | break; | 607 | break; |
609 | } | 608 | } |
610 | 609 | ||
611 | if ( !asc ) { | 610 | if ( !asc ) { |
612 | odebug << "not ascending!" << oendl; | 611 | odebug << "not ascending!" << oendl; |
613 | query += " DESC"; | 612 | query += " DESC"; |
614 | } | 613 | } |
615 | 614 | ||
616 | odebug << query << oendl; | 615 | odebug << query << oendl; |
617 | OSQLRawQuery raw(query ); | 616 | OSQLRawQuery raw(query ); |
618 | return uids( m_driver->query(&raw) ); | 617 | return uids( m_driver->query(&raw) ); |
619 | } | 618 | } |
620 | bool OPimTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ | 619 | bool OPimTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ |
621 | if ( str == "0-0-0" ) | 620 | if ( str == "0-0-0" ) |
622 | return false; | 621 | return false; |
623 | else{ | 622 | else{ |
624 | int day, year, month; | 623 | int day, year, month; |
625 | QStringList list = QStringList::split("-", str ); | 624 | QStringList list = QStringList::split("-", str ); |
626 | year = list[0].toInt(); | 625 | year = list[0].toInt(); |
627 | month = list[1].toInt(); | 626 | month = list[1].toInt(); |
628 | day = list[2].toInt(); | 627 | day = list[2].toInt(); |
629 | da.setYMD( year, month, day ); | 628 | da.setYMD( year, month, day ); |
630 | return true; | 629 | return true; |
631 | } | 630 | } |
632 | } | 631 | } |
633 | OPimTodo OPimTodoAccessBackendSQL::todo( const OSQLResult& res ) const{ | 632 | OPimTodo OPimTodoAccessBackendSQL::parseResultAndCache( int uid, const OSQLResult& res ) const{ |
634 | if ( res.state() == OSQLResult::Failure ) { | 633 | if ( res.state() == OSQLResult::Failure ) { |
635 | OPimTodo to; | 634 | OPimTodo to; |
636 | return to; | 635 | return to; |
637 | } | 636 | } |
638 | 637 | ||
638 | OPimTodo retTodo; | ||
639 | |||
639 | OSQLResultItem::ValueList list = res.results(); | 640 | OSQLResultItem::ValueList list = res.results(); |
640 | OSQLResultItem::ValueList::Iterator it = list.begin(); | 641 | OSQLResultItem::ValueList::Iterator it = list.begin(); |
641 | odebug << "todo1" << oendl; | 642 | odebug << "todo1" << oendl; |
642 | OPimTodo to = todo( (*it) ); | 643 | OPimTodo to = todo( (*it) ); |
643 | cache( to ); | 644 | cache( to ); |
644 | ++it; | 645 | ++it; |
645 | 646 | ||
646 | for ( ; it != list.end(); ++it ) { | 647 | for ( ; it != list.end(); ++it ) { |
647 | odebug << "caching" << oendl; | 648 | odebug << "caching" << oendl; |
648 | cache( todo( (*it) ) ); | 649 | OPimTodo newTodo = todo( (*it) ); |
650 | cache( newTodo ); | ||
651 | if ( newTodo.uid() == uid ) | ||
652 | retTodo = newTodo; | ||
649 | } | 653 | } |
650 | return to; | 654 | return retTodo; |
651 | } | 655 | } |
652 | OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const { | 656 | OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const { |
653 | odebug << "todo(ResultItem)" << oendl; | 657 | odebug << "todo(ResultItem)" << oendl; |
654 | 658 | ||
655 | // Request information from addressbook table and create the OPimTodo-object. | 659 | // Request information from addressbook table and create the OPimTodo-object. |
656 | 660 | ||
657 | bool hasDueDate = false; QDate dueDate = QDate::currentDate(); | 661 | bool hasDueDate = false; QDate dueDate = QDate::currentDate(); |
658 | hasDueDate = date( dueDate, item.data("DueDate") ); | 662 | hasDueDate = date( dueDate, item.data("DueDate") ); |
659 | QStringList cats = QStringList::split(";", item.data("categories") ); | 663 | QStringList cats = QStringList::split(";", item.data("categories") ); |
660 | 664 | ||
661 | odebug << "Item is completed: " << item.data("completed").toInt() << "" << oendl; | 665 | odebug << "Item is completed: " << item.data("completed").toInt() << "" << oendl; |
662 | 666 | ||
663 | OPimTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(), | 667 | OPimTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(), |
664 | cats, item.data("summary"), item.data("description"), | 668 | cats, item.data("summary"), item.data("description"), |
665 | item.data("progress").toUShort(), hasDueDate, dueDate, | 669 | item.data("progress").toUShort(), hasDueDate, dueDate, |
666 | item.data("uid").toInt() ); | 670 | item.data("uid").toInt() ); |
667 | 671 | ||
668 | bool isOk; | 672 | bool isOk; |
669 | int prioInt = QString( item.data("priority") ).toInt( &isOk ); | 673 | int prioInt = QString( item.data("priority") ).toInt( &isOk ); |
670 | if ( isOk ) | 674 | if ( isOk ) |
671 | to.setPriority( prioInt ); | 675 | to.setPriority( prioInt ); |
672 | 676 | ||
673 | bool hasStartDate = false; QDate startDate = QDate::currentDate(); | 677 | bool hasStartDate = false; QDate startDate = QDate::currentDate(); |
674 | hasStartDate = date( startDate, item.data("startdate") ); | 678 | hasStartDate = date( startDate, item.data("startdate") ); |
675 | bool hasCompletedDate = false; QDate completedDate = QDate::currentDate(); | 679 | bool hasCompletedDate = false; QDate completedDate = QDate::currentDate(); |
676 | hasCompletedDate = date( completedDate, item.data("completeddate") ); | 680 | hasCompletedDate = date( completedDate, item.data("completeddate") ); |
677 | 681 | ||
678 | if ( hasStartDate ) | 682 | if ( hasStartDate ) |
679 | to.setStartDate( startDate ); | 683 | to.setStartDate( startDate ); |
680 | if ( hasCompletedDate ) | 684 | if ( hasCompletedDate ) |
681 | to.setCompletedDate( completedDate ); | 685 | to.setCompletedDate( completedDate ); |
682 | 686 | ||
683 | OPimNotifyManager& manager = to.notifiers(); | 687 | OPimNotifyManager& manager = to.notifiers(); |
684 | manager.alarmsFromString( item.data("alarms") ); | 688 | manager.alarmsFromString( item.data("alarms") ); |
685 | manager.remindersFromString( item.data("reminders") ); | 689 | manager.remindersFromString( item.data("reminders") ); |
686 | 690 | ||
687 | OPimState pimState; | 691 | OPimState pimState; |
688 | pimState.setState( QString( item.data("state") ).toInt() ); | 692 | pimState.setState( QString( item.data("state") ).toInt() ); |
689 | to.setState( pimState ); | 693 | to.setState( pimState ); |
690 | 694 | ||
691 | QMap<int, QString> recMap; | 695 | QMap<int, QString> recMap; |
692 | recMap.insert( OPimRecurrence::RType , item.data("RType") ); | 696 | recMap.insert( OPimRecurrence::RType , item.data("RType") ); |
693 | recMap.insert( OPimRecurrence::RWeekdays , item.data("RWeekdays") ); | 697 | recMap.insert( OPimRecurrence::RWeekdays , item.data("RWeekdays") ); |
694 | recMap.insert( OPimRecurrence::RPosition , item.data("RPosition") ); | 698 | recMap.insert( OPimRecurrence::RPosition , item.data("RPosition") ); |
695 | recMap.insert( OPimRecurrence::RFreq , item.data("RFreq") ); | 699 | recMap.insert( OPimRecurrence::RFreq , item.data("RFreq") ); |
696 | recMap.insert( OPimRecurrence::RHasEndDate, item.data("RHasEndDate") ); | 700 | recMap.insert( OPimRecurrence::RHasEndDate, item.data("RHasEndDate") ); |
697 | recMap.insert( OPimRecurrence::EndDate , item.data("EndDate") ); | 701 | recMap.insert( OPimRecurrence::EndDate , item.data("EndDate") ); |
698 | recMap.insert( OPimRecurrence::Created , item.data("Created") ); | 702 | recMap.insert( OPimRecurrence::Created , item.data("Created") ); |
699 | recMap.insert( OPimRecurrence::Exceptions , item.data("Exceptions") ); | 703 | recMap.insert( OPimRecurrence::Exceptions , item.data("Exceptions") ); |
700 | 704 | ||
701 | OPimRecurrence recur; | 705 | OPimRecurrence recur; |
702 | recur.fromMap( recMap ); | 706 | recur.fromMap( recMap ); |
703 | to.setRecurrence( recur ); | 707 | to.setRecurrence( recur ); |
704 | 708 | ||
705 | // Finally load the custom-entries for this UID and put it into the created object | 709 | // Finally load the custom-entries for this UID and put it into the created object |
706 | to.setExtraMap( requestCustom( to.uid() ) ); | 710 | to.setExtraMap( requestCustom( to.uid() ) ); |
707 | 711 | ||
708 | return to; | 712 | return to; |
709 | } | 713 | } |
714 | |||
715 | // FIXME: Where is the difference to "find" ? (eilers) | ||
710 | OPimTodo OPimTodoAccessBackendSQL::todo( int uid )const { | 716 | OPimTodo OPimTodoAccessBackendSQL::todo( int uid )const { |
711 | FindQuery find( uid ); | 717 | FindQuery find( uid ); |
712 | return todo( m_driver->query(&find) ); | 718 | return parseResultAndCache( uid, m_driver->query(&find) ); |
713 | } | 719 | } |
714 | /* | 720 | /* |
715 | * update the dict | 721 | * update the dict |
716 | */ | 722 | */ |
717 | void OPimTodoAccessBackendSQL::fillDict() { | 723 | void OPimTodoAccessBackendSQL::fillDict() { |
718 | 724 | ||
719 | #if 0 | 725 | #if 0 |
720 | /* initialize dict */ | 726 | /* initialize dict */ |
721 | /* | 727 | /* |
722 | * UPDATE dict if you change anything!!! | 728 | * UPDATE dict if you change anything!!! |
723 | * FIXME: Isn't this dict obsolete ? (eilers) | 729 | * FIXME: Isn't this dict obsolete ? (eilers) |
724 | */ | 730 | */ |
725 | m_dict.setAutoDelete( TRUE ); | 731 | m_dict.setAutoDelete( TRUE ); |
726 | m_dict.insert("Categories" , new int(OPimTodo::Category) ); | 732 | m_dict.insert("Categories" , new int(OPimTodo::Category) ); |
727 | m_dict.insert("Uid" , new int(OPimTodo::Uid) ); | 733 | m_dict.insert("Uid" , new int(OPimTodo::Uid) ); |
728 | m_dict.insert("HasDate" , new int(OPimTodo::HasDate) ); | 734 | m_dict.insert("HasDate" , new int(OPimTodo::HasDate) ); |
729 | m_dict.insert("Completed" , new int(OPimTodo::Completed) ); | 735 | m_dict.insert("Completed" , new int(OPimTodo::Completed) ); |
730 | m_dict.insert("Description" , new int(OPimTodo::Description) ); | 736 | m_dict.insert("Description" , new int(OPimTodo::Description) ); |
731 | m_dict.insert("Summary" , new int(OPimTodo::Summary) ); | 737 | m_dict.insert("Summary" , new int(OPimTodo::Summary) ); |
732 | m_dict.insert("Priority" , new int(OPimTodo::Priority) ); | 738 | m_dict.insert("Priority" , new int(OPimTodo::Priority) ); |
733 | m_dict.insert("DateDay" , new int(OPimTodo::DateDay) ); | 739 | m_dict.insert("DateDay" , new int(OPimTodo::DateDay) ); |
734 | m_dict.insert("DateMonth" , new int(OPimTodo::DateMonth) ); | 740 | m_dict.insert("DateMonth" , new int(OPimTodo::DateMonth) ); |
735 | m_dict.insert("DateYear" , new int(OPimTodo::DateYear) ); | 741 | m_dict.insert("DateYear" , new int(OPimTodo::DateYear) ); |
736 | m_dict.insert("Progress" , new int(OPimTodo::Progress) ); | 742 | m_dict.insert("Progress" , new int(OPimTodo::Progress) ); |
737 | m_dict.insert("Completed", new int(OPimTodo::Completed) ); // Why twice ? (eilers) | 743 | m_dict.insert("Completed", new int(OPimTodo::Completed) ); // Why twice ? (eilers) |
738 | m_dict.insert("CrossReference", new int(OPimTodo::CrossReference) ); | 744 | m_dict.insert("CrossReference", new int(OPimTodo::CrossReference) ); |
739 | // m_dict.insert("HasAlarmDateTime",new int(OPimTodo::HasAlarmDateTime) ); // old stuff (eilers) | 745 | // m_dict.insert("HasAlarmDateTime",new int(OPimTodo::HasAlarmDateTime) ); // old stuff (eilers) |
740 | // m_dict.insert("AlarmDateTime", new int(OPimTodo::AlarmDateTime) ); // old stuff (eilers) | 746 | // m_dict.insert("AlarmDateTime", new int(OPimTodo::AlarmDateTime) ); // old stuff (eilers) |
741 | 747 | ||
742 | #endif | 748 | #endif |
743 | } | 749 | } |
744 | /* | 750 | /* |
745 | * need to be const so let's fool the | 751 | * need to be const so let's fool the |
746 | * compiler :( | 752 | * compiler :( |
747 | */ | 753 | */ |
748 | void OPimTodoAccessBackendSQL::update()const { | 754 | void OPimTodoAccessBackendSQL::update()const { |
749 | ((OPimTodoAccessBackendSQL*)this)->m_dirty = false; | 755 | ((OPimTodoAccessBackendSQL*)this)->m_dirty = false; |
750 | LoadQuery lo; | 756 | LoadQuery lo; |
751 | OSQLResult res = m_driver->query(&lo); | 757 | OSQLResult res = m_driver->query(&lo); |
752 | if ( res.state() != OSQLResult::Success ) | 758 | if ( res.state() != OSQLResult::Success ) |
753 | return; | 759 | return; |
754 | 760 | ||
755 | ((OPimTodoAccessBackendSQL*)this)->m_uids = uids( res ); | 761 | ((OPimTodoAccessBackendSQL*)this)->m_uids = uids( res ); |
756 | } | 762 | } |
757 | QArray<int> OPimTodoAccessBackendSQL::uids( const OSQLResult& res) const{ | 763 | QArray<int> OPimTodoAccessBackendSQL::uids( const OSQLResult& res) const{ |
758 | 764 | ||
759 | OSQLResultItem::ValueList list = res.results(); | 765 | OSQLResultItem::ValueList list = res.results(); |
760 | OSQLResultItem::ValueList::Iterator it; | 766 | OSQLResultItem::ValueList::Iterator it; |
761 | QArray<int> ints(list.count() ); | 767 | QArray<int> ints(list.count() ); |
762 | odebug << " count = " << list.count() << "" << oendl; | 768 | odebug << " count = " << list.count() << "" << oendl; |
763 | 769 | ||
764 | int i = 0; | 770 | int i = 0; |
765 | for (it = list.begin(); it != list.end(); ++it ) { | 771 | for (it = list.begin(); it != list.end(); ++it ) { |
766 | ints[i] = (*it).data("uid").toInt(); | 772 | ints[i] = (*it).data("uid").toInt(); |
767 | i++; | 773 | i++; |
768 | } | 774 | } |
769 | return ints; | 775 | return ints; |
770 | } | 776 | } |
771 | 777 | ||
772 | QArray<int> OPimTodoAccessBackendSQL::matchRegexp( const QRegExp &r ) const | 778 | QArray<int> OPimTodoAccessBackendSQL::matchRegexp( const QRegExp &r ) const |
773 | { | 779 | { |
774 | 780 | ||
775 | #if 0 | 781 | #if 0 |
776 | QArray<int> empty; | 782 | QArray<int> empty; |
777 | return empty; | 783 | return empty; |
778 | 784 | ||
779 | #else | 785 | #else |
780 | QString qu = "SELECT uid FROM todolist WHERE ("; | 786 | QString qu = "SELECT uid FROM todolist WHERE ("; |
781 | 787 | ||
782 | // Do it make sense to search other fields, too ? | 788 | // Do it make sense to search other fields, too ? |
783 | qu += " rlike(\""+ r.pattern() + "\",\"description\") OR"; | 789 | qu += " rlike(\""+ r.pattern() + "\",\"description\") OR"; |
784 | qu += " rlike(\""+ r.pattern() + "\",\"summary\")"; | 790 | qu += " rlike(\""+ r.pattern() + "\",\"summary\")"; |
785 | 791 | ||
786 | qu += ")"; | 792 | qu += ")"; |
787 | 793 | ||
788 | odebug << "query: " << qu << "" << oendl; | 794 | odebug << "query: " << qu << "" << oendl; |
789 | 795 | ||
790 | OSQLRawQuery raw( qu ); | 796 | OSQLRawQuery raw( qu ); |
791 | OSQLResult res = m_driver->query( &raw ); | 797 | OSQLResult res = m_driver->query( &raw ); |
792 | 798 | ||
793 | return uids( res ); | 799 | return uids( res ); |
794 | 800 | ||
795 | 801 | ||
796 | #endif | 802 | #endif |
797 | 803 | ||
798 | } | 804 | } |
799 | QBitArray OPimTodoAccessBackendSQL::supports()const { | 805 | QBitArray OPimTodoAccessBackendSQL::supports()const { |
800 | 806 | ||
801 | return sup(); | 807 | return sup(); |
802 | } | 808 | } |
803 | 809 | ||
804 | QBitArray OPimTodoAccessBackendSQL::sup() const{ | 810 | QBitArray OPimTodoAccessBackendSQL::sup() const{ |
805 | 811 | ||
806 | QBitArray ar( OPimTodo::CompletedDate + 1 ); | 812 | QBitArray ar( OPimTodo::CompletedDate + 1 ); |
807 | ar.fill( true ); | 813 | ar.fill( true ); |
808 | ar[OPimTodo::CrossReference] = false; | 814 | ar[OPimTodo::CrossReference] = false; |
diff --git a/libopie2/opiepim/backend/otodoaccesssql.h b/libopie2/opiepim/backend/otodoaccesssql.h index 0cc7722..415f791 100644 --- a/libopie2/opiepim/backend/otodoaccesssql.h +++ b/libopie2/opiepim/backend/otodoaccesssql.h | |||
@@ -1,93 +1,93 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) | 3 | Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | #ifndef OPIE_PIM_ACCESS_SQL_H | 29 | #ifndef OPIE_PIM_ACCESS_SQL_H |
30 | #define OPIE_PIM_ACCESS_SQL_H | 30 | #define OPIE_PIM_ACCESS_SQL_H |
31 | 31 | ||
32 | /* #include <qasciidict.h> */ | 32 | /* #include <qasciidict.h> */ |
33 | 33 | ||
34 | #include <opie2/otodoaccessbackend.h> | 34 | #include <opie2/otodoaccessbackend.h> |
35 | 35 | ||
36 | namespace Opie { | 36 | namespace Opie { |
37 | namespace DB { | 37 | namespace DB { |
38 | class OSQLDriver; | 38 | class OSQLDriver; |
39 | class OSQLResult; | 39 | class OSQLResult; |
40 | class OSQLResultItem; | 40 | class OSQLResultItem; |
41 | } | 41 | } |
42 | } | 42 | } |
43 | 43 | ||
44 | namespace Opie { | 44 | namespace Opie { |
45 | 45 | ||
46 | class OPimTodoAccessBackendSQL : public OPimTodoAccessBackend { | 46 | class OPimTodoAccessBackendSQL : public OPimTodoAccessBackend { |
47 | public: | 47 | public: |
48 | OPimTodoAccessBackendSQL( const QString& file ); | 48 | OPimTodoAccessBackendSQL( const QString& file ); |
49 | ~OPimTodoAccessBackendSQL(); | 49 | ~OPimTodoAccessBackendSQL(); |
50 | 50 | ||
51 | bool load(); | 51 | bool load(); |
52 | bool reload(); | 52 | bool reload(); |
53 | bool save(); | 53 | bool save(); |
54 | QArray<int> allRecords()const; | 54 | QArray<int> allRecords()const; |
55 | 55 | ||
56 | QArray<int> queryByExample( const OPimTodo& t, int settings, const QDateTime& d = QDateTime() ); | 56 | QArray<int> queryByExample( const OPimTodo& t, int settings, const QDateTime& d = QDateTime() ); |
57 | OPimTodo find(int uid)const; | 57 | OPimTodo find(int uid)const; |
58 | OPimTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const; | 58 | OPimTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const; |
59 | void clear(); | 59 | void clear(); |
60 | bool add( const OPimTodo& t ); | 60 | bool add( const OPimTodo& t ); |
61 | bool remove( int uid ); | 61 | bool remove( int uid ); |
62 | bool replace( const OPimTodo& t ); | 62 | bool replace( const OPimTodo& t ); |
63 | 63 | ||
64 | QArray<int> overDue(); | 64 | QArray<int> overDue(); |
65 | QArray<int> effectiveToDos( const QDate& start, | 65 | QArray<int> effectiveToDos( const QDate& start, |
66 | const QDate& end, bool includeNoDates ); | 66 | const QDate& end, bool includeNoDates ); |
67 | QArray<int> sorted(bool asc, int sortOrder, int sortFilter, int cat ); | 67 | QArray<int> sorted(bool asc, int sortOrder, int sortFilter, int cat ); |
68 | 68 | ||
69 | QBitArray supports()const; | 69 | QBitArray supports()const; |
70 | QArray<int> matchRegexp( const QRegExp &r ) const; | 70 | QArray<int> matchRegexp( const QRegExp &r ) const; |
71 | void removeAllCompleted(); | 71 | void removeAllCompleted(); |
72 | 72 | ||
73 | 73 | ||
74 | private: | 74 | private: |
75 | void update()const; | 75 | void update()const; |
76 | void fillDict(); | 76 | void fillDict(); |
77 | inline bool date( QDate& date, const QString& )const; | 77 | inline bool date( QDate& date, const QString& )const; |
78 | inline OPimTodo todo( const Opie::DB::OSQLResult& )const; | 78 | inline OPimTodo parseResultAndCache( int uid, const Opie::DB::OSQLResult& )const; |
79 | inline OPimTodo todo( Opie::DB::OSQLResultItem& )const; | 79 | inline OPimTodo todo( Opie::DB::OSQLResultItem& )const; |
80 | inline QArray<int> uids( const Opie::DB::OSQLResult& )const; | 80 | inline QArray<int> uids( const Opie::DB::OSQLResult& )const; |
81 | OPimTodo todo( int uid )const; | 81 | OPimTodo todo( int uid )const; |
82 | QBitArray sup() const; | 82 | QBitArray sup() const; |
83 | QMap<QString, QString> requestCustom( int uid ) const; | 83 | QMap<QString, QString> requestCustom( int uid ) const; |
84 | 84 | ||
85 | // QAsciiDict<int> m_dict; | 85 | // QAsciiDict<int> m_dict; |
86 | Opie::DB::OSQLDriver* m_driver; | 86 | Opie::DB::OSQLDriver* m_driver; |
87 | QArray<int> m_uids; | 87 | QArray<int> m_uids; |
88 | bool m_dirty : 1; | 88 | bool m_dirty : 1; |
89 | }; | 89 | }; |
90 | 90 | ||
91 | } | 91 | } |
92 | 92 | ||
93 | #endif | 93 | #endif |
diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h index 6f01b46..7ab1ea5 100644 --- a/libopie2/opiepim/core/opimaccesstemplate.h +++ b/libopie2/opiepim/core/opimaccesstemplate.h | |||
@@ -26,198 +26,198 @@ | |||
26 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
27 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
28 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
29 | */ | 29 | */ |
30 | #ifndef OPIE_PIM_ACCESS_TEMPLATE_H | 30 | #ifndef OPIE_PIM_ACCESS_TEMPLATE_H |
31 | #define OPIE_PIM_ACCESS_TEMPLATE_H | 31 | #define OPIE_PIM_ACCESS_TEMPLATE_H |
32 | 32 | ||
33 | /* OPIE */ | 33 | /* OPIE */ |
34 | #include <opie2/opimrecord.h> | 34 | #include <opie2/opimrecord.h> |
35 | #include <opie2/opimaccessbackend.h> | 35 | #include <opie2/opimaccessbackend.h> |
36 | #include <opie2/opimrecordlist.h> | 36 | #include <opie2/opimrecordlist.h> |
37 | 37 | ||
38 | #include <opie2/opimtemplatebase.h> | 38 | #include <opie2/opimtemplatebase.h> |
39 | #include <opie2/odebug.h> | 39 | #include <opie2/odebug.h> |
40 | 40 | ||
41 | /* QT */ | 41 | /* QT */ |
42 | #include <qarray.h> | 42 | #include <qarray.h> |
43 | 43 | ||
44 | namespace Opie { | 44 | namespace Opie { |
45 | 45 | ||
46 | class OPimAccessTemplatePrivate; | 46 | class OPimAccessTemplatePrivate; |
47 | /** | 47 | /** |
48 | * Thats the frontend to our OPIE PIM | 48 | * Thats the frontend to our OPIE PIM |
49 | * Library. Either you want to use it's | 49 | * Library. Either you want to use it's |
50 | * interface or you want to implement | 50 | * interface or you want to implement |
51 | * your own Access lib | 51 | * your own Access lib |
52 | * Just create a OPimRecord and inherit from | 52 | * Just create a OPimRecord and inherit from |
53 | * the templates | 53 | * the templates |
54 | */ | 54 | */ |
55 | 55 | ||
56 | template <class T = OPimRecord > | 56 | template <class T = OPimRecord > |
57 | class OPimAccessTemplate : public OTemplateBase<T> { | 57 | class OPimAccessTemplate : public OTemplateBase<T> { |
58 | public: | 58 | public: |
59 | enum Access { | 59 | enum Access { |
60 | Random = 0, | 60 | Random = 0, |
61 | SortedAccess | 61 | SortedAccess |
62 | }; | 62 | }; |
63 | typedef OPimRecordList<T> List; | 63 | typedef OPimRecordList<T> List; |
64 | typedef OPimAccessBackend<T> BackEnd; | 64 | typedef OPimAccessBackend<T> BackEnd; |
65 | typedef OPimCache<T> Cache; | 65 | typedef OPimCache<T> Cache; |
66 | 66 | ||
67 | /** | 67 | /** |
68 | * c'tor BackEnd | 68 | * c'tor BackEnd |
69 | * enum Access a small hint on how to handle the backend | 69 | * enum Access a small hint on how to handle the backend |
70 | */ | 70 | */ |
71 | OPimAccessTemplate( BackEnd* end); | 71 | OPimAccessTemplate( BackEnd* end); |
72 | 72 | ||
73 | virtual ~OPimAccessTemplate(); | 73 | virtual ~OPimAccessTemplate(); |
74 | 74 | ||
75 | /** | 75 | /** |
76 | * load from the backend | 76 | * load from the backend |
77 | */ | 77 | */ |
78 | bool load(); | 78 | bool load(); |
79 | 79 | ||
80 | /** Reload database. | 80 | /** Reload database. |
81 | * You should execute this function if the external database | 81 | * You should execute this function if the external database |
82 | * was changed. | 82 | * was changed. |
83 | * This function will load the external database and afterwards | 83 | * This function will load the external database and afterwards |
84 | * rejoin the local changes. Therefore the local database will be set consistent. | 84 | * rejoin the local changes. Therefore the local database will be set consistent. |
85 | */ | 85 | */ |
86 | virtual bool reload(); | 86 | virtual bool reload(); |
87 | 87 | ||
88 | /** Save contacts database. | 88 | /** Save contacts database. |
89 | * Save is more a "commit". After calling this function, all changes are public available. | 89 | * Save is more a "commit". After calling this function, all changes are public available. |
90 | * @return true if successful | 90 | * @return true if successful |
91 | */ | 91 | */ |
92 | bool save(); | 92 | bool save(); |
93 | 93 | ||
94 | /** | 94 | /** |
95 | * if the resource was changed externally | 95 | * if the resource was changed externally |
96 | * You should use the signal handling instead of polling possible changes ! | 96 | * You should use the signal handling instead of polling possible changes ! |
97 | * zecke: Do you implement a signal for otodoaccess ? | 97 | * zecke: Do you implement a signal for otodoaccess ? |
98 | */ | 98 | */ |
99 | bool wasChangedExternally()const; | 99 | bool wasChangedExternally()const; |
100 | 100 | ||
101 | /** | 101 | /** |
102 | * return a List of records | 102 | * return a List of records |
103 | * you can iterate over them | 103 | * you can iterate over them |
104 | */ | 104 | */ |
105 | virtual List allRecords()const; | 105 | virtual List allRecords()const; |
106 | 106 | ||
107 | /** | 107 | /** |
108 | * return a List of records | 108 | * return a List of records |
109 | * that match the regex | 109 | * that match the regex |
110 | */ | 110 | */ |
111 | virtual List matchRegexp( const QRegExp &r ) const; | 111 | virtual List matchRegexp( const QRegExp &r ) const; |
112 | 112 | ||
113 | /** | 113 | /** |
114 | * queryByExample. | 114 | * queryByExample. |
115 | * @see otodoaccess, ocontactaccess | 115 | * @see otodoaccess, ocontactaccess |
116 | */ | 116 | */ |
117 | virtual List queryByExample( const T& t, int querySettings, const QDateTime& d = QDateTime() ); | 117 | virtual List queryByExample( const T& t, int querySettings, const QDateTime& d = QDateTime() ); |
118 | 118 | ||
119 | /** | 119 | /** |
120 | * find the OPimRecord uid | 120 | * find the OPimRecord uid |
121 | */ | 121 | */ |
122 | virtual T find( int uid )const; | 122 | T find( int uid )const; |
123 | 123 | ||
124 | /** | 124 | /** |
125 | * read ahead cache find method ;) | 125 | * read ahead cache find method ;) |
126 | */ | 126 | */ |
127 | virtual T find( int uid, const QArray<int>&, | 127 | T find( int uid, const QArray<int>&, |
128 | uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; | 128 | uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; |
129 | 129 | ||
130 | 130 | ||
131 | /* invalidate cache here */ | 131 | /* invalidate cache here */ |
132 | /** | 132 | /** |
133 | * clears the backend and invalidates the backend | 133 | * clears the backend and invalidates the backend |
134 | */ | 134 | */ |
135 | void clear() ; | 135 | void clear() ; |
136 | 136 | ||
137 | /** | 137 | /** |
138 | * add T to the backend | 138 | * add T to the backend |
139 | * @param t The item to add. | 139 | * @param t The item to add. |
140 | * @return <i>true</i> if added successfully. | 140 | * @return <i>true</i> if added successfully. |
141 | */ | 141 | */ |
142 | virtual bool add( const T& t ) ; | 142 | virtual bool add( const T& t ) ; |
143 | 143 | ||
144 | bool add( const OPimRecord& ); | 144 | bool add( const OPimRecord& ); |
145 | /** | 145 | /** |
146 | * Add an Opie PimRecord. | 146 | * Add an Opie PimRecord. |
147 | * Info: Take this if you are working with OPimRecords and you need to add it into any database. | 147 | * Info: Take this if you are working with OPimRecords and you need to add it into any database. |
148 | * But take care that the accessing database is compatible to the real type of OPimRecord !! | 148 | * But take care that the accessing database is compatible to the real type of OPimRecord !! |
149 | * Otherwise this access will be rejected ! | 149 | * Otherwise this access will be rejected ! |
150 | */ | 150 | */ |
151 | bool add( const OPimRecord* ); | 151 | bool add( const OPimRecord* ); |
152 | 152 | ||
153 | 153 | ||
154 | /* only the uid matters */ | 154 | /* only the uid matters */ |
155 | /** | 155 | /** |
156 | * remove T from the backend | 156 | * remove T from the backend |
157 | * @param t The item to remove | 157 | * @param t The item to remove |
158 | * @return <i>true</i> if successful. | 158 | * @return <i>true</i> if successful. |
159 | */ | 159 | */ |
160 | virtual bool remove( const T& t ); | 160 | virtual bool remove( const T& t ); |
161 | 161 | ||
162 | /** | 162 | /** |
163 | * remove the OPimRecord with uid | 163 | * remove the OPimRecord with uid |
164 | * @param uid The ID of the item to remove | 164 | * @param uid The ID of the item to remove |
165 | * @return <i>true</i> if successful. | 165 | * @return <i>true</i> if successful. |
166 | */ | 166 | */ |
167 | bool remove( int uid ); | 167 | bool remove( int uid ); |
168 | bool remove( const OPimRecord& ); | 168 | bool remove( const OPimRecord& ); |
169 | 169 | ||
170 | /** | 170 | /** |
171 | * replace T from backend | 171 | * replace T from backend |
172 | * @param t The item to replace | 172 | * @param t The item to replace |
173 | * @return <i>true</i> if successful. | 173 | * @return <i>true</i> if successful. |
174 | */ | 174 | */ |
175 | virtual bool replace( const T& t) ; | 175 | virtual bool replace( const T& t) ; |
176 | 176 | ||
177 | void setReadAhead( uint count ); | 177 | void setReadAhead( uint count ); |
178 | /** | 178 | /** |
179 | * @internal | 179 | * @internal |
180 | */ | 180 | */ |
181 | virtual T cacheFind( int uid )const; | 181 | virtual T cacheFind( int uid )const; |
182 | void cache( const T& )const; | 182 | void cache( const T& )const; |
183 | void setSaneCacheSize( int ); | 183 | void setSaneCacheSize( int ); |
184 | 184 | ||
185 | QArray<int> records()const; | 185 | QArray<int> records()const; |
186 | protected: | 186 | protected: |
187 | /** | 187 | /** |
188 | * invalidate the cache | 188 | * invalidate the cache |
189 | */ | 189 | */ |
190 | void invalidateCache(); | 190 | void invalidateCache(); |
191 | 191 | ||
192 | void setBackEnd( BackEnd* end ); | 192 | void setBackEnd( BackEnd* end ); |
193 | /** | 193 | /** |
194 | * returns the backend | 194 | * returns the backend |
195 | */ | 195 | */ |
196 | BackEnd* backEnd(); | 196 | BackEnd* backEnd(); |
197 | BackEnd* m_backEnd; | 197 | BackEnd* m_backEnd; |
198 | 198 | ||
199 | Cache m_cache; | 199 | Cache m_cache; |
200 | 200 | ||
201 | private: | 201 | private: |
202 | OPimAccessTemplatePrivate *d; | 202 | OPimAccessTemplatePrivate *d; |
203 | 203 | ||
204 | }; | 204 | }; |
205 | 205 | ||
206 | template <class T> | 206 | template <class T> |
207 | OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) | 207 | OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) |
208 | : OTemplateBase<T>(), m_backEnd( end ) | 208 | : OTemplateBase<T>(), m_backEnd( end ) |
209 | { | 209 | { |
210 | if (end ) | 210 | if (end ) |
211 | end->setFrontend( this ); | 211 | end->setFrontend( this ); |
212 | } | 212 | } |
213 | template <class T> | 213 | template <class T> |
214 | OPimAccessTemplate<T>::~OPimAccessTemplate() { | 214 | OPimAccessTemplate<T>::~OPimAccessTemplate() { |
215 | owarn << "~OPimAccessTemplate<T>" << oendl; | 215 | owarn << "~OPimAccessTemplate<T>" << oendl; |
216 | delete m_backEnd; | 216 | delete m_backEnd; |
217 | } | 217 | } |
218 | template <class T> | 218 | template <class T> |
219 | bool OPimAccessTemplate<T>::load() { | 219 | bool OPimAccessTemplate<T>::load() { |
220 | invalidateCache(); | 220 | invalidateCache(); |
221 | return m_backEnd->load(); | 221 | return m_backEnd->load(); |
222 | } | 222 | } |
223 | template <class T> | 223 | template <class T> |